我正在尝试使用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]����
答案 0 :(得分:0)
您的IV值似乎以密文为前缀。您应该使用密文的前16个字节cipher2
而不是零IV。不要忘记将它们从加密中排除。这解释了一开始的垃圾。
您的cipher2
似乎也应该配置为填充。这可能是PKCS#7填充。请尝试"AES/CBC/PKCS5Padding"
而不是"/NoPadding"
。如果这不起作用,您需要使用十六进制中的明文更新您的问题,以便我们确定使用哪个填充。这应该解释最后的垃圾。