0

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

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

4

1 回答 1

4

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

从这个文档和这个源代码

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

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

因此,您正在寻找“基于密码的密钥派生函数”。PBKDF1

Pkcs5_keyivgen()EVP_BytesToKey()从 Openssl调用函数并以非标准方式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 标准 但我认为自己实现加密不是一个好主意

于 2013-07-27T03:26:48.650 回答