我在提取使用 生成的 IV 时遇到问题encrypt
方法来自encrypted_strings
我提供的特定密码库。从文档中,我看到此方法使用 C 库根据密码生成密钥和 iv,该 C 库调用与 openssl 相同的方法来生成密钥和 iv:EVP_BytesToKey。
我想做的是能够打印我指定的任何密码的 IV,这样我就可以将加密移植到另一种语言。
你能想到有什么方法可以从密码中提取/打印这个 IV 向量吗?
这些是该库使用的算法、模式和填充的详细信息:
- 算法:DES-EDE3
- 模式:CBC
- 填充:PKCS5
下面的 ruby 脚本打印出加密消息,但不知道使用了哪个 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
因为它允许我打印使用生成的 iv 和密钥-p
选项,但它使用PKCS7
填充而不是PKCS5
。因此,如果我运行下面的命令,不会打印与上面的 ruby 代码相同的加密字符串。
echo -n 'Whackabad' | openssl enc -des-ede3-cbc -nosalt -a -k bAJLyifeUJUBFWdHzVbykfDmPHtLKLMzViHW9aHGmyTLD8hGYZ
笔记:
-a:base64 编码,-k:密码,echo -n:从字符串中删除新行,使其与字符串中 ruby 的大小完全相同。
如果我添加-nopad
选项,我不知道如何填充输出以获得完全相同的加密结果。
任何帮助将非常感激
PKCS7 填充与 PKCS5 基本相同。在命令行上得到不同结果的原因是它仅使用单个哈希迭代,其中使用的函数encrypted_strings
默认迭代 2048 次 http://ruby-doc.org/stdlib-2.4.0/libdoc/openssl/rdoc/OpenSSL/Cipher.html#method-i-pkcs5_keyivgen.
使用的函数,EVP_BytesToKeyOpenSSL wiki 中描述了 https://wiki.openssl.org/index.php/Manual:EVP_BytesToKey(3),其中包括算法的详细信息。在 Ruby 中复制它可能看起来像这样(使用 MD5 和 2048 迭代):
def hash(d, count)
count.times do
d = OpenSSL::Digest.digest('md5', d)
end
d
end
password = 'bAJLyifeUJUBFWdHzVbykfDmPHtLKLMzViHW9aHGmyTLD8hGYZ'
bytes = ''
last = ''
# For des-ede3-cbc, 24 byte key + 8 byte IV = 32 bytes.
while bytes.length < 32
last = hash(last + password, 2048)
bytes << last
end
key = bytes[0...24]
iv = bytes[24..-1]
您可以使用这些值来解密代码的结果(添加require 'base64'
first):
# This is the result of your code:
encrypted_data = "AEsDXVcgh2jsTjlDgh+REg=="
# enrypted_strings produces base64 encoded results, so we decode first
encrypted_data = Base64.decode64(encrypted_data)
cipher = OpenSSL::Cipher.new('des-ede3-cbc')
cipher.decrypt
cipher.key = key
cipher.iv = iv
plain = cipher.update(encrypted_data) + cipher.final
puts plain #=> "Whackabad"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)