【问题标题】:rails openssl different results of encryption from code and terminalrails openssl 来自代码和终端的不同加密结果
【发布时间】:2018-08-29 13:34:12
【问题描述】:

当我尝试从终端加密数据时

echo -n "TestData" | openssl enc -aes-256-cbc -a -K C81E728D9D4C2F636F067F89CC14862C65990ABE58735B91B6B8798E8CE45F22 -iv D342F9C6310F6B21E97AB38595BD8CAA

比我收到的 Base64 编码结果是

VJwJBTtVntJvRGkD24S4wg==

但是当我使用完全相同的键和初始化向量对 rails 尝试同样的事情时

    cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
    cipher.encrypt
    cipher.key = "C81E728D9D4C2F636F067F89CC14862C65990ABE58735B91B6B8798E8CE45F22"
    cipher.iv = "D342F9C6310F6B21E97AB38595BD8CAA"
    encrypted_data = cipher.update("TestData")
    encrypted_data << cipher.final
    Base64.strict_encode64(encrypted_data)

比我收到的 Base64 编码结果完全不同

qavpNrU7llgauAyyEZz/bw==

有人能指出我错过了什么吗?

【问题讨论】:

  • 注意:1. 98304A2480DDC0FA354278936DAC2A0D7D9074650AD6 是无效的密钥大小,AES 密钥的长度为 128、192 或 256 位(16、24 或 32 字节)。由于看起来密钥应该是 256 位(32 字节),缺少的密钥字节要么是垃圾,要么可能是空值,因此密钥扩展是未定义的。因此结果不同。
  • 我用 openssl enc -aes-256-cbc -pass pass:my_random_password -nosalt -p -in testFile -out testFile.enc 生成的密钥更新了问题
  • 没有得到你的要求,我用钥匙和结果更新了完整的答案
  • 我在终端和代码中使用相同的键,没有得到你说的部分是不正确的
  • 抱歉,我没有注意到您也更改了 IV。更正AESCALC。其中 Base64 中的加密数据:VJwJBTtVntJvRGkD24S4wg== 与第一个示例匹配。所以最好的猜测是您没有以正确的形式为第二个示例指定输入。

标签: ruby-on-rails linux openssl


【解决方案1】:

您将keyiv 属性提供为十六进制字符串,但预期格式是原始字节。将它们转换为二进制会产生预期的结果,使用以下脚本:

require 'openssl'
require 'base64'

def hex_to_bin(s)
 s.scan(/../).map { |x| x.hex.chr }.join
end

cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
cipher.encrypt
cipher.key = hex_to_bin("C81E728D9D4C2F636F067F89CC14862C65990ABE58735B91B6B8798E8CE45F22")
cipher.iv = hex_to_bin("D342F9C6310F6B21E97AB38595BD8CAA")
encrypted_data = cipher.update("TestData")
encrypted_data << cipher.final
puts Base64.strict_encode64(encrypted_data)

hex_to_bin 函数的来源:To Hex and Back (With Ruby))。

调用它encrypt.rb,这是运行它的结果:

$ ruby encrypt.rb 
encrypt.rb:8: warning: constant OpenSSL::Cipher::Cipher is deprecated
VJwJBTtVntJvRGkD24S4wg==

为了摆脱“已弃用”警告,我必须replace the deprecated class OpenSSL::Cipher::Cipher with OpenSSL::Cipher

【讨论】:

    【解决方案2】:

    密钥太短,98304A2480DDC0FA354278936DAC2A0D7D9074650AD6 是无效密钥大小,AES 密钥长度为 128、192 或 256 位(16、24 或 32 字节)。由于看起来密钥应该是 256 位(32 字节),缺少的密钥字节要么是垃圾,要么可能是空值,因此密钥扩展是未定义的。因此结果不同。

    假设第一种情况为空填充和 PKCS#7 填充,结果是正确的: AESCALC

    第二个例子是填写其他庄园的钥匙。

    解决方案是使用全长密钥。

    【讨论】:

    • 注意:问题已更改。
    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2019-03-17
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多