1

我是相当新的加密和解密,所以请原谅我缺乏这方面的知识。

我正在尝试解密 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的初始化向量。我仍然得到同样的错误。任何形式的帮助或指导将不胜感激。

问候,

4

1 回答 1

1

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

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

于 2011-08-23T14:11:55.857 回答