首页 > 解决方案 > “密钥必须是 16 字节”AES-128 CBC,带有 MD5 密钥+IV

问题描述

我正在与一个 API 交互,该 API 需要我AES-128CBC模式下加密某些东西。

他们说对于密钥和 IV,我需要使用他们给我的字符串的 16 字节 MD5 哈希。

我用谷歌搜索了一段时间,看起来所有 MD5 都是 16 字节,那么为什么这不起作用?

  key = Digest::MD5.hexdigest(temp_token)
  cipher = OpenSSL::Cipher::AES.new(128, :CBC)
  cipher.encrypt
  cipher.key = key # ArgumentError: key must be 16 bytes
  cipher.iv = key # ArgumentError: iv must be 16 bytes

  encrypted = cipher.update(joined_params) + cipher.final
  Base64.urlsafe_encode64(encrypted)

标签: ruby-on-railsrubyencryptionopensslruby-on-rails-5

解决方案


我认为根本原因是OpenSSL::Cipher::AES#key必须以 16 字节的字符串作为其键。

[27] pry(main)> cipher = OpenSSL::Cipher::AES.new(128, :CBC)
=> #<OpenSSL::Cipher::AES:0x00007f7f876f1608>
[28] pry(main)> cipher.encrypt
=> #<OpenSSL::Cipher::AES:0x00007f7f876f1608>
[30] pry(main)> cipher.random_key.length
=> 16

它与Digest::MD5.hexdigest

[26] pry(main)> key = Digest::MD5.hexdigest('abc').first(16)
=> "900150983cd24fb0"
[27] pry(main)> cipher = OpenSSL::Cipher::AES.new(128, :CBC)
=> #<OpenSSL::Cipher::AES:0x00007f7f876f1608>
[28] pry(main)> cipher.encrypt
=> #<OpenSSL::Cipher::AES:0x00007f7f876f1608>
[29] pry(main)> cipher.key = key
=> "900150983cd24fb0"

参考:OpenSSL::Cipher


推荐阅读