当前位置: 首页 > 知识库问答 >
问题:

Ruby‘AES-128-CBC’和PHP‘rijndael-128’加密有什么区别吗?

梁锋
2023-03-14

Ruby代码是

require 'base64'
require 'openssl'

def ruby_dec iv, key, encrypted
  decipher = OpenSSL::Cipher::AES.new(128, :CBC)
  #decipher.padding = 0 
  decipher.decrypt
  decipher.key = key
  decipher.iv = iv
  ciphertext = Base64.decode64 encrypted
  decipher.update(ciphertext) + decipher.final
end


def ruby_enc iv, key, plaintext 
  enc = OpenSSL::Cipher.new 'aes-128-cbc'
  enc.encrypt
  enc.key = key
  enc.iv = iv

  Base64.encode64(enc.update(plaintext) + enc.final)
end

iv = Base64.decode64("TOB+9YNdXSbkSYIU7D/IpQ==")
key =  Base64.decode64("7DxoShENB0D+8xrwOwSbi1TPQBiIaFq2yveoUkutCpM=")
plaintext = "testtesttest"

encrypted = ruby_enc iv, key, plaintext
puts "encrypted is #{encrypted}"
ruby_dec iv, key, encrypted
puts "plaintext is #{plaintext}"

然后

$ ruby enc_dec.rb #the above code
encrypted is LXJmnM7t+HGKi2iI51ethA==
plaintext is testtesttest

现在PHP代码是

function php_dec($iv, $key, $encrypted) { 
  $cipher_algorithm    = 'rijndael-128';
  $cipher_mode = 'cbc';

  $key = base64_decode($key);
  $iv = base64_decode($iv);
  $ciphertext = base64_decode($enctypted);
  return $ciphertext;
}


function php_enc($iv, $key, $plaintext){
  $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

  $mcrypt_key = base64_decode($key);
  $iv = base64_decode($iv);
  mcrypt_generic_init($td, $mcrypt_key, $iv);

  $ciphertext = mcrypt_generic($td, $plaintext);

  retun base64_encode($ciphertext); 
}

$iv = base64_decode("TOB+9YNdXSbkSYIU7D/IpQ==");
$key =  base64_decode("7DxoShENB0D+8xrwOwSbi1TPQBiIaFq2yveoUkutCpM=");
$plaintext = "testtesttest";

$encrypted = php_enc($iv, $key, $plaintext);
echo "encrypted is ".$encrypted."\n";
php_dec($iv, $key, $encrypted);
echo "plaintext is ".$plaintext."\n";

$ruby_encrypted = base64_encode("LXJmnM7t+HGKi2iI51ethA==");
php_dec($iv, $key, $ruby_encrypted);
echo "plaintext is ".$plaintext."\n";

然后我得到

$ php enc_dec.php
encrypted is SUR33tXu32JjR9JAKIGL7w==
plaintext is testtesttest
plaintext is testtesttest

密文和ruby的不一样。现在我尝试用PHP制作的密文解密ruby。

$ pry
  [1] pry(main)> load 'enc_dec.rb'
  [2] pry(main)> iv = Base64.decode64("TOB+9YNdXSbkSYIU7D/IpQ==")    
  => "L\xE0~\xF5\x83]]&\xE4I\x82\x14\xEC?\xC8\xA5"
  [3] pry(main)> key =  Base64.decode64("7DxoShENB0D+8xrwOwSbi1TPQBiIaFq2yveoUkutCpM=")    
  => "\xEC<hJ\x11\r\a@\xFE\xF3\x1A\xF0;\x04\x9B\x8BT\xCF@\x18\x88hZ\xB6\xCA\xF7\xA8RK\xAD\n\x93"
  [4] pry(main)> ruby_dec iv, key, Base64.decode64("SUR33tXu32JjR9JAKIGL7w==")
  OpenSSL::Cipher::CipherError: data not multiple of block length
  from enc_dec.rb:12:in `final'
  [5] pry(main)> 

Ruby 'AES-128-CBC '和PHP 'rijndael-128 '加密有区别吗?还有我怎么用ruby解密?

共有1个答案

欧镜
2023-03-14

AES和Rijndael在128的含义上有区别,在AES中128是密钥大小,在Rijndael中是块大小。

我相信你用的密钥大于128位。

见本文:http://www . lease weblabs . com/2014/02/AES-PHP-mcrypt-key-padding/

 类似资料:
  • 我只需要通过代码加密AES CBC 128位模式的字符串。我使用openssl库完成了这项工作,但无法获得正确的输出。 到目前为止,我已经完成了。 我的十六进制输出是:B0 15 751B50 80 D4 FF 81 68 146BB71B95 99 37 38 但正确的输出是:< code > 73 5C 04 F9 57 18 43 7C EE 68 27 59 2B 41 A8 DA (通过

  • 我用java编写了这段代码,以便解密密文。我有钥匙。对我来说,一切都是正确的,但我有我要解释的问题。 这是我的代码: 我收到以下错误: 出了什么问题?我知道这个问题在某种程度上与衬垫有关,但我不知道确切的解决方案。我只有一个密文IV和密钥。

  • 我最近在Java中使用了AES CBC 128算法来加密数据。现在我需要用PHP重建算法,但我不知道如何重建,因为互联网上的PHP算法返回不同的结果。也许你能帮我。 这是要加密的Java代码: 这是我的php代码: 当我从java加密加密数据时,此结果无法在Php解密上解密。 你们能帮我构建一个PHP脚本吗?它可以返回与java加密相同的结果?

  • 我正在尝试在python中实现此代码(我是python新手),它给我以下错误: attribute error:“str”对象没有属性“decode” 如果我们删除 只是为了避免这样的错误: 但它给我以下错误: ValueError:IV必须为16字节长 因为算法需要,我必须删除 有没有人知道我该怎么做才能使这段代码工作?

  • 我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/

  • 我在Minio中有一个加密对象,使用AES 128位CBC算法加密。 该对象非常大(约50 MB),因此我没有将其完全加载到内存中(这可能会导致内存不足异常),而是以1MB的块检索它。我需要在使用前解密它。 有没有可能用这种方式解密对象(一次1MB,整个对象一次性加密)?如果是,我该怎么做?我尝试解密16字节的块,产生以下错误: <code>javax.crypto。IllegalBlockSiz