如何在ruby中重构OpenSSL pkcs5_keyivgen?

我在过去的一年里在我的应用程序中使用了以下代码,使用此代码有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 < "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

我看到了这个问题和这个问题 ,但他们没有帮我解决问题。

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

从这个文档和这个源代码

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

从salt生成一些键和IV并通过。 在你的情况下没有盐。 生成方法在v1.5 PKCS #5定义(不建议使用)

所以你正在寻找“基于密码的密钥衍生function”。 PBKDF1

Pkcs5_keyivgen()函数从Openssl调用EVP_BytesToKey()EVP_BytesToKey()以非标准方式生成更大密钥大小的关键字节

因此MD5为MD5生成大小为EVP_MAX_MD_SIZE (16 + 20) // 16的散列

但是AES key(32) + IV(16) sizes > EVP_MAX_MD_SIZE ,因此AES 256将需要多个哈希来生成随机密钥和IV。 这是C中算法的源代码

这里是EVP_BytesToKey()很好的伪代码解释

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