2015-01-28 1 views
0

Ruby를 사용하여 PHP로 암호화 된 문자열의 암호를 해독하고 싶습니다. 동일한 암호 해독 로직이 PHP에서는 잘 작동하지만 Ruby 코드는 가비지를 반환합니다. Ruby가 PHP 암호화 텍스트를 암호 해독합니다.

근로 PHP 예 :

<?php 

$_RIJNDAEL_KEY_ = "uUxJIpSKMbOQQdtm6Y4rPEXeE9TAKUns"; 
$_RIJNDAEL_IV_ = "PiToVoRjwlg8UwxUxQKI4w=="; 
$ciphertext = 'T353/s48iKzAf61b2dCOnqUApYa4xxjye8he4oAtJHyyCKl8sCbI33hfP6IqOsQZEIWeQBCsvy97xwJMPD8RwLG4J0wgX9Ihlti1vMar+5nrLrCR4lAfZcoJopoBt1JVnDAojLW+y0S0y5c4GCdB8YrHzj4jv70dg3yX8DxlAWE='; 


$content = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $_RIJNDAEL_KEY_, base64_decode($ciphertext), MCRYPT_MODE_ECB, $_RIJNDAEL_IV_); 
echo $content . "\n"; 

?> 

더 - 작동하지 루비 예 :

require "openssl" 
require "digest" 
require "uri" 
require "base64" 

data = Base64.decode64("T353/s48iKzAf61b2dCOnqUApYa4xxjye8he4oAtJHyyCKl8sCbI33hfP6IqOsQZEIWeQBCsvy97xwJMPD8RwLG4J0wgX9Ihlti1vMar+5nrLrCR4lAfZcoJopoBt1JVnDAojLW+y0S0y5c4GCdB8YrHzj4jv70dg3yX8DxlAWE=") 
key = Base64.decode64('uUxJIpSKMbOQQdtm6Y4rPEXeE9TAKUns') 
iv = Base64.decode64('PiToVoRjwlg8UwxUxQKI4w==') 
aes = OpenSSL::Cipher.new('AES-128-ECB') 

aes.decrypt 
aes.padding = 0 
aes.key = key 
aes.iv = iv 

plain = aes.update(data) + aes.final 
puts plain 

사람이 되거 수 있을까요? 감사.

+2

왜 Ruby 버전에서는 키와 iv에서는 base64 디코드를 실행 하나 PHP 버전에서는 실행하지 않습니까? – spickermann

답변

0

여기 모두 정확합니다. 그러나. 예를 들어 AES- -ECB를 사용해야합니다. runnable입니다

다음

코드 : 내가있어

require "openssl" 
require "digest" 
require "uri" 
require "base64" 

data = 'T353/s48iKzAf61b2dCOnqUApYa4xxjye8he4oAtJHyyCKl8sCbI33hfP6IqOsQZEIWeQBCsvy97xwJMPD8RwLG4J0wgX9Ihlti1vMar+5nrLrCR4lAfZcoJopoBt1JVnDAojLW+y0S0y5c4GCdB8YrHzj4jv70dg3yX8DxlAWE=' 
key = "uUxJIpSKMbOQQdtm6Y4rPEXeE9TAKUns" 
#iv = 'PiToVoRjwlg8UwxUxQKI4w==' 
aes = OpenSSL::Cipher::AES.new(256, :ECB) 

# Without padding checksum|4033315172 will be truncated! 
aes.padding = 0 
aes.decrypt 
aes.key = key 
#aes.iv = iv 

plain = aes.update(data.unpack('m')[0]) + aes.final 

decrypt 후 다음

=> "date_add|2015-01-28 01:36:17\xC2\xA4id_lang|1\xC2\xA4id_currency|1\xC2\xA4id_guest|12165\xC2\xA4id_connections|10668\xC2\xA4checksum|4033315172\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 

다음. 이 예제에서 제로 패딩을 사용하지 않으면 마지막 문자 인 checksum이 잘립니다. 가능한 경우 EBC 모드를 사용하지 마십시오. Here이 그 이유입니다.

마지막으로이 예에서는 IV가 필요하지 않습니다. 행운을 빈다!

+0

Genius! 하지만 AES-256-ECB를 Ruby 예제로 사용하는 이유는 무엇입니까? – inthecloud

+0

@inthecloud 다음은 이것에 대한 좋은 수치입니다 : - http://stackoverflow.com/questions/1864700/part-ii-how-to-make-ruby-aes-256-cbc-and-php-mcrypt-rijndael- 128- 재생 - 웰 - 토지 - http://www.chilkatsoft.com/p/php_aes.asp – sashaegorov