java - 使用 RSA 加密字符串并将 Java 中的 key 封装到文件中

标签 java encryption

我正在尝试加密两个不同文件中的一些信息,第一个文件使用 AES 加密的字符串,第二个文件使用 RSA 加密的 key ,但我在使其工作时遇到了一些麻烦。

这是我的方法:

public synchronized static void encrypToFile(KeyPair clauPublicaPrivada, SecretKey clauSecretaSimetrica) {
        String dades = null;
        byte[][] encWrappedData = new byte[2][];
        byte[] dadesAEncriptarEnByte;
        dades = extreureRutesDB();

        dadesAEncriptarEnByte = dades.getBytes();

        try {

            try {
                File file = new File(FITXER_DADES_TRIPULANTS_XIFRADES_AES128);
                File file2 = new File(FITXER_DADES_TRIPULANTS_XIFRADES_AES128_CLAUS);
                boolean fvar = file.createNewFile();
                boolean fvar2 = file2.createNewFile();
                if (fvar2) {
                    System.out.println("File2 has been created successfully");
                } else {
                    System.out.println("File2 already present at the specified location");
                }

                if (fvar) {
                    System.out.println("File1 has been created successfully");
                } else {
                    System.out.println("File1 already present at the specified location");
                }
            } catch (IOException e) {
                System.out.println("Exception Occurred:");
                e.printStackTrace();
            }


            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec iv = new IvParameterSpec(IV_PARAM);
            cipher.init(Cipher.ENCRYPT_MODE, clauSecretaSimetrica, iv);
            encWrappedData[0] = cipher.doFinal(dadesAEncriptarEnByte);

            cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            PublicKey clauPublica = clauPublicaPrivada.getPublic();
            cipher.init(Cipher.WRAP_MODE, clauPublica);
            encWrappedData[1] = cipher.wrap(clauSecretaSimetrica);



            CipherOutputStream cos = new CipherOutputStream(new FileOutputStream(FITXER_DADES_TRIPULANTS_XIFRADES_AES128), cipher);
            cos.write(encWrappedData[0]);
            cos.close();

            cos = new CipherOutputStream(new FileOutputStream(FITXER_DADES_TRIPULANTS_XIFRADES_AES128_CLAUS), cipher);
            cos.write(encWrappedData[1]);
            cos.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            System.out.println("menu 21(): FINAL");
        }

    }

问题是,当我运行它时,我收到此错误:

java.lang.IllegalStateException:密码未初始化用于加密/解密

知道我做错了什么以及如何解决它吗?

最佳答案

为不同目的重复使用相同的Cipher变量是糟糕的编程实践并且令人困惑,并导致您出现这些错误。在调用 doWrap() 之前,您上次将 cipher 实例保留在 WRAP_MODE 中。然后,您向 CipherOutputStream 构造函数提供相同的实例。这些要求 cipher 对象处于 ENCRYPT_MODEDECRYPT_MODE 中。

只需为 Cipher 对象的每次不同使用调用 Cipher.getInstance() 即可。除非您确实在做一些非常奇怪(并且可能是错误的)的事情,否则该调用的开销在您的程序中将是微不足道的。

关于java - 使用 RSA 加密字符串并将 Java 中的 key 封装到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49324227/

相关文章:

Java 阅读行并做数学方程

java - Spring AMQP 多线程事务

android - Android 上的非对称加密

java - 我们可以从 WSDL 生成 java 文件吗

java - 就 hibernate 性能而言,哪种持久上下文更好?

java - Blowfish 示例,其中自动填充和取消填充键以调整大小

json - 使用客户管理的 key 创建存储服务加密 ARM 模板

Cocoa AES 加密 NSData 和 Bytearrays

java - 如何限制 SAX 解析器处理程序类中调用 'startElement()' 的次数?

php - PHP中的双向加密