필자는 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와 다른 곳에서 수십개의 게시물을 읽었으며 (이것은 내가 지금까지 가지고있는 방법이다.) 그러나이 마지막 부분은 내 머리를 긁적이다. (주석에서 ...)
항상 같습니까? '¹¾Sò'-> äe¿fÏäJ ± '입니까? 아니면 변경 되나요? – Matt
항상 같습니다. 나는 양쪽에 IV를 통과하지 않을거야. –
CBC 모드에는 'iv'가 필요합니다. * "[잘못된 IV로 해독하기] (http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29)는 일반 텍스트의 첫 번째 블록이 손상되도록합니다."*. 양쪽에 같은'iv '를 사용해보십시오. – Leigh