使用NoPadding方案在tripledes_cbc加密后获取垃圾

时间:2017-10-27 20:06:43

标签: java encryption cryptography rsa tripledes

我正在解密一些加密数据。说数据是一个高度保密的信息。该信息使用tripledes_cbc算法进行加密。用于加密信息的密钥使用rsa算法加密。

但是当我尝试使用DESede/CBC/NoPadding算法解密信息时,我会获得原始数据以及在前端和末端填充的一些垃圾字符。

当我尝试使用DES/CBC/PKCS5Padding代替DESede/CBC/NoPadding时,我得到'最终阻止未正确填充'例外。

以下是代码段。请让我知道如何在没有额外填充的情况下获取正确的文本:

        KeyStore ks = KeyStore.getInstance("jks");
        FileInputStream fis = new FileInputStream(ksFile);
        ks.load(fis, "testing".toCharArray());

        PrivateKey privateKey = (PrivateKey) ks.getKey("keys", "1234".toCharArray());

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] kekBytes = cipher.doFinal(Base64.decodeBase64(encKey.getBytes("UTF-8")));

        SecureRandom random = new SecureRandom();
        byte[] iv = new byte[8];
        random.nextBytes(iv);

        SecretKey key = new SecretKeySpec(kekBytes, "DESede");
        Cipher cipher1 = Cipher.getInstance("DESede/CBC/NoPadding");
        cipher1.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
        byte[] out = cipher1.doFinal(Base64.decodeBase64(data.getBytes("UTF-8")));

        System.out.println("Data Length: " + out.length);
        String result = new String(out, "UTF-8");

1 个答案:

答案 0 :(得分:0)

如果中间部分正确,您的密钥是正确的。开头的块可能是以密文为前缀的IV。如果你试图解密那么你就会得到垃圾。之后,IV本身被作为下一个块的向量,因此CBC密码设法纠正自己并继续正确。从理论上讲:CBC限制了错误传播

最后的部分是使用的填充方案。你应该试试"DESede/CBC/PKCS5Padding"。如果这不起作用,您需要查看二进制值(实际上,例如十六进制编码)并找出使用的填充方案,以便您可以取消填充数据。

请注意,Java的标准加密提供程序中没有很多填充方案。所以你要么必须找到一个提供例如位填充或您可以使用"NoPadding"并自己执行取消填充。

如果这是针对在线协议的,那么可能是时候了解填充oracle攻击,以及更多最新的协议,如AES / GCM和RSA / OAEP。