使用Ruby解密PHP加密字符串

时间:2011-08-23 12:45:44

标签: php ruby encryption rhodes

我是一个相当新的加密和解密,所以请原谅我对这个主题缺乏了解。

我正在尝试解密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

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

此致

1 个答案:

答案 0 :(得分:1)

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

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

相关问题