从加密字节检索java中的salt、key、IV

从加密字节检索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加密文件:

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中解密数据,但您有两个问题:

  • openssl rand可以在任何位置输出空字节或换行符的值,这将有效地截断您的密码,因为-pass file:的内容仅为字符串数据的第一行读取

  • 默认的密钥派生没有那么好。请在security.stackexchange上阅读

  • 中有有关密钥派生的更多信息。但是,下面是解密文件的Ruby代码,您可以将其转换为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