2014-06-19 2 views
2

필자는 CBC 모드에서 AES를 사용하는 PHP에서 원격 ColdFusion 서버에 의해 생성 된 주어진 문자열을 PKCS5 패딩으로 해독하는 작업을 진행 해왔다. 나는 문자열 거의을 완벽하게 해독 할 수있는 지점에 이르렀습니다. 문제는 문자열의 시작 부분에 약간의 균열이있는 것 같습니다. 마지막에 패딩이 발생했다고 생각했지만 해독 된 문자열을 보면 끝 부분에는 아무 것도 없지만 시작 부분이 패딩되어 있으므로 문자열의 길이는 64 자 (원래 문자열은 32 자입니다.) 패딩을 전환하려고했습니다. 끝 대신에 처음을 볼 수있는 제거 코드가 있지만 그 문자는 제거 할 여백을 해독하는 데 사용할 수있는 정보를 제공하지 않으므로 다른 곳에서 오는 것입니다. 여기 내 코드는 지금까지PHP AES를 해독하면 문자열 앞에 패딩이 반환됩니까?

function decrypt($hash) { 
    $enc_key = "Oq2vh+gswPn2CRPccODtKg=="; 
    $cipher = "rijndael-128"; 

    $str = mcrypt_decrypt($cipher, base64_decode($enc_key), base64_decode($hash), MCRYPT_MODE_CBC); 
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
    $pad = ord($str[($len = strlen($str)) - 1]); 
    $len = strlen($str); 
    $decrypted = substr($str, 0, strlen($str) - $pad); 

    if($decrypted != NULL) { 
    $params = explode ('|', $decrypted); 
    } 

    return (object)array(
    'input' => $hash, 
    'pad' => $pad, 
    'len' => $len, 
    'blocksize' => $block, 
    'aes_key' => $enc_key, 
    'cipher' => $cipher, 
    'result' => $params, 
    'decrypted' => $decrypted, 
    'padded' => $str 
); 

내가하기 (ColdFusion을 사용하여, ' "AES/CBC/PKCS5Padding에"'알고리즘과 base64 인코딩) 문자열을 암호화하는 경우 :

"[email protected]|test|1400863515" 

을 내가 암호화 된 문자열을 얻을 :

QRO04vmtw76Qvl0hscmYZ/SFGNv/8d88H9kT60JA5IJdg/KMT7udrn2IZuQzkOPvLjXoc4novzTMGsk0CMxjvg== 

내가 위의 PHP 함수를 통해이 프로그램을 실행할 때, 나는 출력으로이 얻을 :

¹¾Sò'->äe¿fÏäJ±[email protected]|test|1400863515 

처음에는 그 캐릭터가 무엇입니까? 왜 마지막에 패딩이 없습니까? 나는 SO와 다른 곳에서 수십개의 게시물을 읽었으며 (이것은 내가 지금까지 가지고있는 방법이다.) 그러나이 마지막 부분은 내 머리를 긁적이다. (주석에서 ...)

+0

항상 같습니까? '¹¾Sò'-> äe¿fÏäJ ± '입니까? 아니면 변경 되나요? – Matt

+0

항상 같습니다. 나는 양쪽에 IV를 통과하지 않을거야. –

+3

CBC 모드에는 'iv'가 필요합니다. * "[잘못된 IV로 해독하기] (http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29)는 일반 텍스트의 첫 번째 블록이 손상되도록합니다."*. 양쪽에 같은'iv '를 사용해보십시오. – Leigh

답변

관련 문제