带有垃圾字符的RSA AES解密

时间:2015-03-23 23:34:02

标签: java encryption aes rsa saml

我正在尝试使用AES和RSA解密saml响应,我可以正确解密saml断言。但是,解密的文本被嵌入到一些垃圾字符中,导致解析异常。

以下是我的代码

InputStream privateKeyFileInputStream = Check.class.getClassLoader().getResourceAsStream("rsa_privatekey.key"); 
rsaPrivateKey = new byte[privateKeyFileInputStream.available()];
privateKeyFileInputStream.read(rsaPrivateKey);

PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC");
PrivateKey privKey = keyFactory.generatePrivate(privateKeySpec);

Cipher cipher1 = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding", "BC");
cipher1.init(Cipher.DECRYPT_MODE, privKey);

byte[] encryptedMessage = Base64.decodeBase64(aesPrivateKeyEnc.getBytes());
aesPrivateKey = cipher1.doFinal(encryptedMessage);

IvParameterSpec ivSpec = new IvParameterSpec(new byte[16]);
SecretKeySpec key = new SecretKeySpec(aesPrivateKey, "AES");
Cipher cipher2 = Cipher.getInstance("AES/CBC/NoPadding", "BC");
cipher2.init(Cipher.DECRYPT_MODE, key, ivSpec);

byte[] cipherTextBytes = Base64.decodeBase64(cipherText);        
byte[] decryptedMessage = cipher2.doFinal(cipherTextBytes);

String message = new String(decryptedMessage, "UTF8");

现在,消息已

R����=2�W���?<saml:Assertion ...... </saml:Assertion>��fE]����

1 个答案:

答案 0 :(得分:0)

您的IV值似乎以密文为前缀。您应该使用密文的前16个字节cipher2而不是零IV。不要忘记将它们从加密中排除。这解释了一开始的垃圾。

您的cipher2似乎也应该配置为填充。这可能是PKCS#7填充。请尝试"AES/CBC/PKCS5Padding"而不是"/NoPadding"。如果这不起作用,您需要使用十六进制中的明文更新您的问题,以便我们确定使用哪个填充。这应该解释最后的垃圾。

请注意Java中的"PKCS5Padding" does perform PKCS#7 padding