Ruby AES256 Decrypt 기능을 PHP로 변환합니다
문제
루비에는 약간의 데이터가 해독되는 다음 기능이 있습니다.
def decrypt(key, iv, cipher_hex)
cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
cipher.decrypt
cipher.key = key.gsub(/(..)/){|h| h.hex.chr}
cipher.iv = iv.gsub(/(..)/){|h| h.hex.chr}
decrypted_data = cipher.update(cipher_hex.gsub(/(..)/){|h| h.hex.chr})
decrypted_data << cipher.final
return decrypted_data
end
나는 PHP에서 똑같은 일을하려고 노력하고 있지만 내가 뭘 잘못하고 있는지 잘 모르겠습니다. 내가 가진 것들은 다음과 같습니다.
function decrypt_data($key, $iv, $cipher_hex) {
return mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
hex_to_str($key),
hex_to_str($cipher_hex),
MCRYPT_MODE_CBC,
hex_to_str($iv)
);
}
function hex_to_str($hex_str) {
preg_match_all('/(..)/', $hex_str, $matches);
$to_return = '';
foreach ($matches[1] as $val)
$to_return .= chr(hexdec($val));
return $to_return;
}
출력은 내가 찾고있는 줄이 아니라 쓰레기가됩니다. 아이디어?
그리고 시작하기 전에 시작하기 전에 전환하십시오 MCRYPT_RIJNDAEL_256
도움이되지 않고 단지 IV가 블록 크기만큼 길지 않은 것에 대해 불평하게 만듭니다. 이 경우 128이 정확하다고 생각합니다 이 지역 128/256은 키 크기가 아니라 블록 크기의 표시라고 말합니다.
해결책 2
잘 작동하는 것으로 밝혀졌습니다. 단지 테스트 데이터가 나빴습니다. 내가 만든 두 가지 변경 사항은 사용하는 것이 었습니다 pack()
(CAF의 제안에서) 그리고 끝에서 패딩 캐릭터를 떨어 뜨립니다.
function decrypt_data($key, $iv, $cipher_hex) {
return rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
pack('H*', $key),
pack('H*', $cipher_hex),
MCRYPT_MODE_CBC,
pack('H*', $iv)
),
"\x00..\x1F"
);
}
다른 팁
개인적으로 나는 집안일에 대해 조금 의심 스럽다 hex_to_str
기능 - 왜 사용하지 않는가 pack('H*', $key)
?
제휴하지 않습니다 StackOverflow