我提供用于提供特定密码的方法从encrypted_strings
库中生成的IV所产生的麻烦。从文档中,我看到这个方法基于密码使用C库生成密钥和iv,该库调用与openssl相同的方法来生成密钥和iv:EVP_BytesToKey。如何从encrypted_strings中提取由加密方法生成的IV矢量
我想要做的是能够打印我指定的任何密码的IV,以便我可以将加密移植到另一种语言。
你能想到任何方法从密码中提取/打印这个IV向量吗?
这些都是该算法,模式和填充这个库使用的细节:
- ALGO:DES-EDE3
- MODE:CBC
- PADDING:PKCS5
红宝石下面的脚本打印出加密的消息,但不知道使用了哪个iv。
#!/usr/bin/ruby
require 'encrypted_strings'
data = 'Whackabad'
password = 'bAJLyifeUJUBFWdHzVbykfDmPHtLKLMzViHW9aHGmyTLD8hGYZ'
encrypted_data = data.encrypt(:symmetric, :password => password)
printf "Data: #{data}\n"
printf "Encrypted Data: #{encrypted_data}"
我试图用openssl
,因为它可以让我打印使用-p
选项生成的IV和关键,但它采用的是PKCS7
填充,而不是PKCS5
。所以如果我运行下面的命令,不会打印与上面的ruby代码相同的加密字符串。
echo -n 'Whackabad' | openssl enc -des-ede3-cbc -nosalt -a -k bAJLyifeUJUBFWdHzVbykfDmPHtLKLMzViHW9aHGmyTLD8hGYZ
注: -a:使用Base64编码,-k:密码和echo -n:将删除字符串,其大小完全一样的,如串红宝石的新生产线。
如果我添加-nopad
选项,我不知道如何填充输出以获得完全相同的加密结果。
任何帮助,将不胜感激
一个经常使用的方法是简单地用IV加前缀加密的数据。在这种情况下,只需从第一个block_length字节中获取IV,然后跳过该数据即可获得加密数据。 – zaph
@zaph我不确定ruby代码实际上是用IV加密数据的前缀。如果是这样,我应该只取第一个block_length字节? – rakemous