如何在ruby中重构OpenSSL pkcs5_keyivgen?

时间:2013-07-26 13:42:54

标签: ruby openssl

我过去一年在我的应用程序中使用了以下代码,使用此代码有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,但他们没有帮我解决问题。

1 个答案:

答案 0 :(得分:3)

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

来自此docs和此source code

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

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

中定义

所以你正在寻找&#34;基于密码的密钥衍生功能&#34;。 PBKDF1

来自Openssl的

Pkcs5_keyivgen()函数调用EVP_BytesToKey()EVP_BytesToKey()生成non-standard way

中更大密钥大小的关键字节

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

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

中算法的source code

这里EVP_BytesToKey()

很好pseudo-code explanation

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