ruby-on-rails - “密钥必须是 16 字节”AES-128 CBC,带有 MD5 密钥+IV
问题描述
我正在与一个 API 交互,该 API 需要我AES-128
在CBC
模式下加密某些东西。
他们说对于密钥和 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)
解决方案
我认为根本原因是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"
推荐阅读
- python - 有什么方法可以为二进制分类特征数据制作散点图?
- javascript - 多个画布上的动画贝塞尔曲线
- pyqt5 - 我想在 Travis-ci 上安装 pyqt5(Python 3.4),但它不起作用
- javascript - 如何用for中的ajax替换html(id)
- c++ - 渴望加载整个模型以估计 Tensorflow Serving 的内存消耗
- regex - 用于查找带有字符和数字的字符串的正则表达式
- excel - 文件夹中的 VB 脚本 RefreshAll(例外)
- python - 是否可以在 NetworKit 中创建属性图?
- python-3.x - 将 blob 数据插入 SQL 表的问题
- nativescript - 在 Nativescript 中使用 Android WorkManager