2011-08-23 38 views
1

我是相当新的加密和解密,所以请原谅我在主题方面的知识不足。使用Ruby解密PHP加密字符串

我想解密Ruby中的字符串。该字符串是从使用MCRYPT_RIJNDAEL_128在PHP中进行加密的服务器中读取的。我有代码解密它在PHP中工作,我试图将其转换为Ruby。我需要使用Rhodes(Ruby中的移动应用程序框架)进行身份验证。

这是PHP端解密的代码片段。

$key = "This is a test key"; 

    $string2 = hex2bin($string); // The encrypted string 

    $iv = '1111F321414LOJL018473914DSADAS'; // Just given a random Initialisation vector for the example 

    $encrypted = mcrypt_cbc(MCRYPT_RIJNDAEL_128, $key, $string2, MCRYPT_DECRYPT, $iv); 

function hex2bin($str) { 
    $bin = ""; 
    $i = 0; 
    do { 
     $bin .= chr(hexdec($str{$i}.$str{($i + 1)})); 
     $i += 2; 
     } while ($i < strlen($str)); 
    return $bin; 
} 

hex2bin是一种将十六进制转换为二进制的函数。

到目前为止,我的失败尝试是使用Ruby提供的crpt:rijndael库进行解密。

key = "This is a test key" 
rd = Crypt::Rijndael.new(key, 128, 128) 
string = @params['body'] // The encrypted string 
encrypted_string = hex2bin(string) 
decrypted_string = rd.decrypt_block(encrypted_string) 

def hex2bin(str) 
    bin = "" 
    i = 0 
    begin 
    bin = bin + ((str[i]+str[i+1]).hex).chr 
    i = i+2 
    end while i<str.length 
    return bin 
end 

我收到一个错误,说“应用程序错误:块必须是16个字节长”。我尝试添加代码以使其接受来自http://pastebin.com/m1rsJUXM的初始化向量。我仍然得到同样的错误。任何形式的帮助或方向将不胜感激。

问候,

回答

1

看你的PHP代码,你似乎可以用128位Rijndael算法在CBC模式具有显式IV和未规定的填充。最好明确指定填充,通常是PKCS5或PKCS7。鉴于你的错误信息是在谈论你的一个块不是16字节长,那么我会倾向于首先怀疑填充问题。您的明文的最后一个块可能未被填充到下一个块边界,因此它将缺少所需的16个字节,因此会出现错误消息。

除此之外,您还需要确保在Ruby代码中指定CBC模式,以便它与PHP代码匹配,并且在两个系统上的字节级别上的密文,密钥和IV都相同。转换字符串和从字符串转换可能会导致差异,从而导致问题。这是我对你的块大小问题的第二个想法。如果将密码字节从字节转换为字符串并再次转换为字节将改变密文的长度,那么您将得到相同的错误消息。

+0

嘿,谢谢你的回答。这个Ruby库(crypt)只有一种模式,那就是CBC。我尝试使用CBC模块中名为decrypt_string()而不是decrypt_block()的函数,并且似乎已经摆脱了错误。然而,解密的字符串仍然不是我所期望的。我会根据你的建议尝试改变。 感谢您的帮助。干杯。 –