【问题标题】:How do I refactor OpenSSL pkcs5_keyivgen in ruby?如何在 ruby​​ 中重构 OpenSSL pkcs5_keyivgen?
【发布时间】:2013-07-26 13:42:53
【问题描述】:

过去一年我一直在我的应用程序中使用以下代码,并且使用此代码有 200k 记录:

options = { :algorithm => 'aes-256-cbc', :value => "changethis", :key => "secretkey" }
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm])
cipher.send(:encrypt)    
cipher.pkcs5_keyivgen(options[:key])
result = cipher.update(options[:value])
result << cipher.final
# => "x\xED\x14s\xFD\x0E\x97\xC5\x996[M\x1E\x94\xDEI"

我需要(按业务)重构pkcs5_keyivgen 部分,以正确执行:例如,

options = { :algorithm => 'aes-256-cbc', :value => "changethis", :key => "secretkey" }
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm])
cipher.send(:encrypt)
cipher.key = '' # ??? 1) How does pkcs5_keyivgen in above code generate key, or does it just use my options[:key]
cipher.iv = '' # ??? 2) How does pkcs5_keyivgen in above code generate iv
result = cipher.update(options[:value])
result << cipher.final

我必须弄清楚pkcs5_keyivgen 如何设置keyiv。想法在这里?我们正在使用 ruby​​-1.9.3-p286 和 encryptor-1.1.3

我看到了this questionthis question,但他们并没有帮我解决问题。

【问题讨论】:

  • 我不知道为什么建议关闭它?这是一个编程问题?请您反馈一下您为什么投反对票,以便我改进问题。谢谢。

标签: ruby openssl


【解决方案1】:

试图解决这个问题,但我认为没有简单的解决方案,或者我只是看不到)。 Pkcs5_keyivgen() 已弃用,并为 AES 256 实施非标准的密钥派生。

来自这个docs和这个source code

Pkcs5_keyivgen (pass, SALT = nil, num = 2048, digest = "MD5") -> nil 

从 salt 和 pass 中生成一些密钥和 IV。在你的情况下没有盐。生成方法在v1.5 PKCS #5中定义(已弃用)

所以您正在寻找“基于密码的密钥派生函数”。 PBKDF1

Pkcs5_keyivgen() 函数从 Openssl 调用 EVP_BytesToKey()EVP_BytesToKey()non-standard way 中生成更大密钥大小的密钥字节

所以 MD5 为 MD5 生成大小为 EVP_MAX_MD_SIZE (16 + 20) // 16 的哈希

但是 AES key(32) + IV(16) sizes &gt; EVP_MAX_MD_SIZE,所以 AES 256 将需要多个哈希来生成随机密钥和 IV。这是 C 中算法的source code

这里是 pseudo-code explanation 中的 EVP_BytesToKey() 很好

如果你真的想重新实现PBKDF1这里也是RTC2898 standard for PBKDF1 但我认为自己实现加密并不是一个好主意

【讨论】:

  • 惊人的反馈。我试图逆向工程的真正原因是因为我也需要在 Python 程序中使用它,并且听起来我可能必须以标准方式重新实现我的 ruby​​,然后也以标准方式在 python 中执行它。
  • OpenSSL 1.1.0c changed the digest algorithm 用于一些内部组件。以前使用MD5,1.1.0改用SHA256。请注意,EVP_BytesToKeyopenssl enc 等命令中的更改不会影响您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
相关资源
最近更新 更多