我正在解密一些加密数据。说数据是一个高度保密的信息。该信息使用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");
答案 0 :(得分:0)
如果中间部分正确,您的密钥是正确的。开头的块可能是以密文为前缀的IV。如果你试图解密那么你就会得到垃圾。之后,IV本身被作为下一个块的向量,因此CBC密码设法纠正自己并继续正确。从理论上讲:CBC限制了错误传播。
最后的部分是使用的填充方案。你应该试试"DESede/CBC/PKCS5Padding"
。如果这不起作用,您需要查看二进制值(实际上,例如十六进制编码)并找出使用的填充方案,以便您可以取消填充数据。
请注意,Java的标准加密提供程序中没有很多填充方案。所以你要么必须找到一个提供例如位填充或您可以使用"NoPadding"
并自己执行取消填充。
如果这是针对在线协议的,那么可能是时候了解填充oracle攻击,以及更多最新的协议,如AES / GCM和RSA / OAEP。