具有大型XML文件类型的不完整RSA解密 - JAVA

时间:2014-10-28 19:11:23

标签: java xml security encryption encryption-asymmetric

我在解密XML类型时遇到问题我的文件返回不完整的数据算法和稀有符号。

public File decryptFile(File fileInput, X509Certificate certificate) throws BadPaddingException, Exception { try (DataInputStream dis = new DataInputStream(new FileInputStream(fileInput))) { byte[] encryptedKeyBytes = new byte[dis.readInt()]; dis.readFully(encryptedKeyBytes); PublicKey publicKey = certificate.getPublicKey(); rsaCipher.init(Cipher.DECRYPT_MODE, publicKey); byte[] rijndaelKeyBytes = rsaCipher.doFinal(encryptedKeyBytes); SecretKey rijndaelKey = new SecretKeySpec(rijndaelKeyBytes, "Rijndael"); byte[] iv = new byte[16]; dis.read(iv); IvParameterSpec spec = new IvParameterSpec(iv); Cipher cipher = Cipher.getInstance("Rijndael/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, rijndaelKey, spec); try (CipherInputStream cis = new CipherInputStream(dis, cipher)) { try (FileOutputStream fos = new FileOutputStream(fileInput.getAbsolutePath() + ".xml")) { byte[] data = new byte[16]; int theByte; while ((theByte = cis.read(data)) != -1) { System.out.print(new String(data)); fos.write(data, 0, theByte); } System.out.println("\n\n"); } } } return new File(fileInput.getAbsolutePath() + ".xml"); }

此代码返回数据

</ctaAbonBenef><distPago>00000</distPago><item>00000</item><pagoPoder>N</p�|���[�[W�Z�5��Q�

我认为这与UTF-8有关,但我无法解决。

现在我也可以相信它是使用的加密算法,我留下以防万一。

public static void generateFileEncrypt(File fileInput, PrivateKey privateKey, String folderSave) throws Exception { String fileOutput = folderSave + "\" + fileInput.getName() + ENCRYPTED_FILENAME_SUFFIX; DataOutputStream output = new DataOutputStream(new FileOutputStream(fileOutput)); Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); rsaCipher.init(Cipher.ENCRYPT_MODE, privateKey); KeyGenerator rijndaelKeyGenerator = KeyGenerator.getInstance("Rijndael"); rijndaelKeyGenerator.init(128); Key rijndaelKey = rijndaelKeyGenerator.generateKey(); byte[] encodedKeyBytes = rsaCipher.doFinal(rijndaelKey.getEncoded()); output.writeInt(encodedKeyBytes.length); output.write(encodedKeyBytes); SecureRandom random = new SecureRandom(); byte[] iv = new byte[16]; random.nextBytes(iv); output.write(iv); IvParameterSpec spec = new IvParameterSpec(iv); Cipher symmetricCipher = Cipher.getInstance("Rijndael/CBC/PKCS5Padding"); symmetricCipher.init(Cipher.ENCRYPT_MODE, rijndaelKey, spec); try ( CipherOutputStream cos = new CipherOutputStream(output, symmetricCipher); FileInputStream fis = new FileInputStream(fileInput)) { int theByte; byte[] data = new byte[16]; while ((theByte = fis.read(data)) != -1) { System.out.print(new String(data)); cos.write(data, 0, theByte); } System.out.println("\n\n"); cos.flush(); } }

提前致谢。

2 个答案:

答案 0 :(得分:1)

我还没有消化你的所有代码;我停止了我看到你试图用公钥解密,并用私钥加密。这有点像数字签名,但你的填充将是完全错误的,你应该使用Signature类,如果这是你真正想做的。

公钥用于加密或验证数字签名。使用私钥解密,看看是否能解决您的问题。


你仍然做错了。如果密钥不是私密的,请不要将其称为“加密”。

但无论如何,我认为打印到stdout看起来不对,因为你正在将整个缓冲区转换为文本。最后一个块可能被填充,因此它不会解码为有效的文本 - 它的填充;它不是输入文件的一部分,并且您没有将其写入解密文件,但是您正在打印它。

更改为使用公钥加密,使用私钥解密,然后将打印更改为:

System.out.print(new String(data, 0, theByte));

更好的是指定数据的字符集(可能是UTF-8,因为它是XML的默认值)。

答案 1 :(得分:0)

我认为你应该做相反的事情。使用公钥加密并使用私钥解密..