当前位置: 首页 > 知识库问答 >
问题:

用openssl aes 256 cbc实现加密文件的Java解密

钱志强
2023-03-14

几天来,我一直试图用java解密一个用OpenSSL加密的消息。使用以下命令对邮件进行了加密:

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

文件file.key包含256位的对称密钥。命令中没有指定salt,但文件以salted__开头。下面是我编写的类,试图解密文件,但即使删除文件的16个字符也无法得到任何东西,即:Salted__+salt encrypted。我明白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)

共有1个答案

孙琨
2023-03-14

不,File.Key不包含密钥。OpenSSL enc-kfile读取一个口令,该口令不是密钥,但用于派生密钥和IV(如果适用,它就在这里);查看手册页。默认情况下,这个键派生使用随机salt,自2016-08年以来,默认哈希依赖于您没有说明的OpenSSL版本。另外,Java中的cipher.getInstance(“aes”)默认为ECB,而不是CBC。(它还默认为'pkcs5'填充,这与OpenSSL匹配,尽管从技术上讲,它应该被称为PKCS7,而不是pkcs5。)

要在Java中匹配OpenSSL enc所使用的PBKDF(以及key和IV),可以使用BouncyCastle或与OpenSSL的EVP_Bytestokey等效的代码;请参见dupe或近dupe QS:
OpenSSL AES CBC加密的Java等效项
如何使用Java解码使用OpenSSL aes-128-cbc编码的字符串?
如何使用'-nosalt'param解密AES加密文件
如何使用AES解密使用OpenSSL命令加密的Java文件?
以及我对规范https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption/#35614的尝试

 类似资料:
  • 本文向大家介绍Java实现文件的加密解密功能示例,包括了Java实现文件的加密解密功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现文件的加密解密功能分享给大家供大家参考,具体如下: PS:关于加密解密感兴趣的朋友还可以参考本站在线工具: 文字在线加密解密工具(包含AES、DES、RC4等): http://tools.jb51.net/password/txt_enco

  • 本文向大家介绍android中对文件加密解密的实现,包括了android中对文件加密解密的实现的使用技巧和注意事项,需要的朋友参考一下 现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多。防止有人交一份钱,把所有的课件就拷给了别人。这样的事情培训机构肯定是不愿意的。现在我项目里面也出了这么个需求。下面介绍一下我的实现。 文件加解密的流程及原

  • 本文向大家介绍Java上传下载文件并实现加密解密,包括了Java上传下载文件并实现加密解密的使用技巧和注意事项,需要的朋友参考一下 使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载 引入依赖 在 pom.xml 中添加 Jersey 相关依赖 创建工具类 测试上传 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我正在做一个简单的程序来加密/解密使用RSA算法在Java。我创建一个密码对象如下: 我通过调用加密函数进行加密: 解密过程如下: 但是,当我将创建密码对象的代码编辑为://Create a Cipher object Cipher rsapier=Cipher时。getInstance(“RSA”); 问题出在哪里。在第一种情况下(当空格出现时),我指定了NoPadd?为什么空格出现在解密的消息

  • 本文向大家介绍java 实现DES 加密解密的示例,包括了java 实现DES 加密解密的示例的使用技巧和注意事项,需要的朋友参考一下 以上就是java 实现DES 加密解密的示例代码的详细内容,更多关于java des加密解密的资料请关注呐喊教程其它相关文章!

  • 问题内容: 我想用Java加密和解密文件,我已经阅读了这个URL http://www- users.york.ac.uk/~mal503/lore/pkencryption.htm ,我得到了两个文件,即公共安全证书和私有安全证书文件和private.pem文件,我将这些文件复制并粘贴到当前目录中,并按如下所示编写Java代码,当我运行此文件时,未执行任何加密或解密操作,请查看并告诉我我哪里出了