剂量Ruby OpenSSL :: Cipher.reset清除键和iv?

时间:2014-10-27 05:42:00

标签: ruby encryption openssl

document表示Cipher.reset完全重置了密码的内部状态。

我理解该文档为Cipher.reset会重置密钥,静密密码和其他密码状态。

为了确认,我尝试了下面的代码。

require 'openssl'

enc = OpenSSL::Cipher.new('AES-256-CBC').encrypt
key = enc.random_key  
iv  = enc.random_iv

enc.reset res = "" 
res << enc.update('abc')  
res << enc.final 

p res

如果Cipher.reset重置密钥和iv,则每次脚本运行时加密的字符串(res)必须相同。
但我每次都得到不同的结果。

所以我猜Cipher.reset没有重置密钥和iv 是不是? Cipher.reset做了什么?

1 个答案:

答案 0 :(得分:1)

我刚刚遇到了和你一样的问题,我已经设计了以下测试:

# encrypt data1 with random key and iv    
cipher = OpenSSL::Cipher.new('aes-256-cbc')
cipher.encrypt
key = cipher.random_key
iv = cipher.random_iv
data1 = cipher.update('a') + cipher.final

# reset cipher, and encrypt with same key as above, don't touch iv
cipher.reset
cipher.encrypt
cipher.key = key
data2 = cipher.update('a') + cipher.final

# reset cipher, don't touch key or iv
cipher.reset
cipher.encrypt
data3 = cipher.update('a') + cipher.final

data1 == data2 && data2 == data3 # => true

因为你可以看到iv和key都没有被重置更改,因为data1data2data3都是相同的。