openssl - 使用 openssl aes 256 cbc 对加密文件进行 Java 解密

标签 openssl aes java salt encryption

我几天来一直在尝试用java解密一条用openssl加密的消息。该消息使用以下命令加密:

openssl enc -e -aes-256-cbc -kfile $ file.key -in toto -out toto.enc。

文件file.key包含256位的对称 key 。命令中未指定盐,但文件以 Salted__ 开头。这是我编写的类,用于尝试解密该文件,但即使删除文件的 16 个字符(即:Salted__ + 加密的盐)也无法获得任何内容。我知道 openssl 默认是这样做的。当我尝试解密时,会引发与加密文本相关的异常。

有人可以帮助我吗?轨道 ?一个想法?

非常感谢。

代码:

  public class Java {

       private static SecretKey key = null;         
       private static Cipher cipher = null;

       public static void main(String[] args) throws Exception
       {
          String filename = RESOURCES_DIR + "toto.enc";

          byte[] key = Base64.decode("2AxIw+/AzDBj83OILV9GDpOs+izDFJEhD6pve/IPsN9=");
          SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
          cipher = Cipher.getInstance("AES");

          cipher.init(Cipher.DECRYPT_MODE, secretKey);
          byte[] test = Base64.decode(readFile(filename));
          byte[] decryptedBytes = cipher.doFinal(test);
          String decryptedText = new String(decryptedBytes, "UTF8");

          System.out.println("After decryption: " + decryptedText);
       }

        public final static String RESOURCES_DIR = "C:/Users/toto/Desktop/";

        static String readFile(String filename) throws FileNotFoundException, IOException {
            FileReader fr;
            BufferedReader br;

            fr = new FileReader(new File(filename));
            br = new BufferedReader(fr);
            String str;
            String res = "";
            while ((str = br.readLine()) != null) {
                res += str;
            }
            return res;
        }
    }

错误:

Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313)
    at javax.crypto.Cipher.doFinal(Cipher.java:2131)
    at deciphertodeploytest6.Java.main(Java.java:52)

最佳答案

不,file.key 不包含 key 。 openssl enc -kfile读取密码,该密码不是 key ,但用于派生 key 和IV(如果适用,它就在这里);请参阅手册页。默认情况下,此 key 派生使用随机盐,并且自 2016-08 以来,默认哈希取决于您未声明的 OpenSSL 版本。 另外,Cipher.getInstance("AES") Java 中默认为 ECB,而不是您需要的 CBC。 (它也默认为“PKCS5”填充,这确实与 OpenSSL 匹配,尽管从技术上讲它应该被称为 PKCS7 而不是 PKCS5。)

在 Java 中匹配 openssl enc 使用的 PBKDF(以及 key 和 IV)您可以使用 BouncyCaSTLe 或编写与 OpenSSL 的 EVP_BytesToKey 等效的代码;查看受骗或近乎受骗的问题:
Java equivalent of an OpenSSL AES CBC encryption
How to decode a string encoded with openssl aes-128-cbc using java?
How to decrypt AES encrypted file with '-nosalt' param
How to decrypt file in Java encrypted with openssl command using AES?
和我对规范的尝试https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption/#35614

关于openssl - 使用 openssl aes 256 cbc 对加密文件进行 Java 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43189765/

相关文章:

java - MapBox LocationEngineProvider 提供者

java如何传递其中通用元素的列表

c - AES 128 CBC 蒙特卡罗测试

ruby - perl 和 ruby​​ 之间河豚加密的区别

java - AES/CBC 真的需要 IV 参数吗?

cocoa - C++ 中的基本加密函数(Mac OS X Mavericks、XCode 5)

c++ - 什么可以解释调用 free() 时的堆损坏?

Ubuntu 12.04.1/Ruby 1.9.3p0 上的 Ruby OpenSSL::SSL::SSLError

C# AES : Encrypt a file causes "Length of the data to encrypt is invalid." error

java - 如何在 Encog 中暂停/序列化遗传算法?