从加密字节检索java中的salt、key、IV
我使用以下命令使用openssl加密文件:从加密字节检索java中的salt、key、IV,java,key,salt,Java,Key,Salt,我使用以下命令使用openssl加密文件: openssl enc -aes-128-cbc -in text.txt -out text.enc -pass file:key.bin 其中key.bin是使用命令生成的密钥 openssl rand 16 -out: key.bin 要检索我使用的key.bin派生的salt、key和IV,请执行以下操作: openssl enc -aes-128-cbc -pass file:key.bin -d -P -in text.enc 每次
openssl enc -aes-128-cbc -in text.txt -out text.enc -pass file:key.bin
其中key.bin是使用命令生成的密钥
openssl rand 16 -out: key.bin
要检索我使用的key.bin派生的salt、key和IV,请执行以下操作:
openssl enc -aes-128-cbc -pass file:key.bin -d -P -in text.enc
每次我运行这个命令时,我都会得到相同的盐、钥匙和iv
但是,我需要用java来完成。
您能告诉我是否可以仅通过传递加密文件和密钥文件就用java检索这些信息吗?您可以仅使用加密文件text.enc和密钥文件key.bin在java中解密数据,但您有两个问题:
require 'openssl'
enc = File.read('text.enc', :encoding => 'ASCII-8BIT')
# OpenSSL's own file format
salt = enc[8..15]
ciphertext = enc[16..-1]
k = File.read('key.bin', :encoding => 'ASCII-8BIT')
k = k.split(0.chr)[0] # truncate at null byte like openssl would have done
k = k.split("\n")[0] # truncate at newline like openssl would have done
# Key and IV derivation
d = OpenSSL::Digest::MD5.new
d0 = d.digest(k + salt)
d1 = d.digest(d0 + k + salt)
# Compare this to the output when you use the -p argument to openssl enc
puts "salt=#{salt.unpack('H*')[0].upcase}"
puts "key=#{d0.unpack('H*')[0].upcase}"
puts "iv =#{d1.unpack('H*')[0].upcase}"
# Decrypt the ciphertext
cipher = OpenSSL::Cipher.new('AES-128-CBC')
cipher.decrypt
cipher.key = d0
cipher.iv = d1
plaintext = cipher.update(ciphertext) + cipher.final
puts plaintext