当前位置: 首页 > 知识库问答 >
问题:

SAML RSA和AES解密-末尾的随机垃圾字节

吴才俊
2023-03-14
public static void main(String[] args) throws Exception {
    Path p = Paths.get("C:\\Users\\jj\\Desktop\\myPrivateKey.key");
    String encryptedAESKey = "FUZLPtkLSUgOo0bETQ5hwP1OWNggGlWhG+Z......wF1G6twRjg=="; // from XML
    byte[] aesKey = decryptWithPem("RSA/ECB/OAEPwithSHA1andMGF1Padding", "RSA", Util.base64DecodeAsBytes(encryptedAESKey), p);
    String encryptedXML = "YfJu7h4Id09hpuoqthl3Ks/JqhIXm.....amb24JZu7cJZT3cEO2a2U6qi0VCyoXQ=";
    byte[] decryptedData = decrypt("AES/CBC/NoPadding", "AES", Util.base64DecodeAsBytes(encryptedXML), aesKey);
    for(int i = decryptedData.length - 20; i < decryptedData.length; i++) {
        System.out.println("i: " + i + " -> " + decryptedData[i]); // print last 20 bytes
    }
    System.out.println(new String(decryptedData)); // prints <saml2:Assertion xmlns:saml2="urn:oasis:names:........</saml2:Assertion>�G{A

}

g{a

我意识到消息中的前16个字节是IV,所以我从消息中去掉了它们(从消息开始就去掉了垃圾)。但是现在我在消息的末尾得到了随机的5个字节。这些字节是:

i: 1931 -> -120
i: 1932 -> 71
i: 1933 -> 123
i: 1934 -> 65
i: 1935 -> 5

其他职能:

public static byte[] decryptWithPem(String alg, String pemAlg, byte[] encryptedData, Path pemPath) {
    try {
        Cipher cipher = Cipher.getInstance(alg, "BC");
        cipher.init(Cipher.DECRYPT_MODE, loadPrivateKey(pemPath, pemAlg));
        return cipher.doFinal(encryptedData);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

private static PrivateKey loadPrivateKey(Path keyPath, String alg) {
    try {
        byte[] keyData = Util.base64DecodeAsBytes(IOUtil.fileToString(keyPath).replaceAll("\\s", ""));
        KeyFactory keyFactory = KeyFactory.getInstance(alg);
        EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyData);
        return keyFactory.generatePrivate(privateKeySpec);
    } catch(NoSuchAlgorithmException | InvalidKeySpecException e) {
        throw new RuntimeException(e);
    }
}

private static SecretKeySpec getSecretKeySpec(String alg, byte[] key) {
    return new SecretKeySpec(key, alg);
}

public static byte[] decrypt(String alg, String keyAlg, byte[] dataToDecrypt, byte[] key) {
    try {
        Cipher cipher = Cipher.getInstance(alg, "BC");
        cipher.init(Cipher.DECRYPT_MODE, getSecretKeySpec(keyAlg, key), new IvParameterSpec(dataToDecrypt, 0, 16));
        return cipher.doFinal(Arrays.copyOfRange(dataToDecrypt, 16, dataToDecrypt.length));
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

消息有没有可能是随机填充的?

-----编辑-----

看来规范使用的是ISO10126填充,用“AES/CBC/ISO10126Padding”代替“AES/CBC/NOPadding”。

共有1个答案

牟飞沉
2023-03-14

消息有没有可能是随机填充的?

是的,正如填充部分所详述的,它使用随机填充,表示问号可以是任何值,但最后一个字节表示填充的长度。他们的示例:0x2122232425262728????????????????????????????????????08

这实际上是ISO10126填充,您可以通过查看最后一个字节轻松地将其删除:

byte[] pp = cipher.doFinal(Arrays.copyOfRange(dataToDecrypt, 16, dataToDecrypt.length));
return Arrays.copyOf(pp, pp.length - pp[pp.length-1]);
 类似资料:
  • 我正在玩由节点的模块实现的AES 256。js,以评估我是否可以将其用于特定的数据保护功能,我正在计划将其作为我正在设计的应用程序的一部分。 我试图验证一些加密的任意明文的解密,但我无法获得原始明文和解密结果相匹配,这意味着我的加密、解密或两者都有问题。 据我所知,我最好选择一个随机初始化向量(IV),我使用了-证据表明(留档没有说太多)它需要128位。我显然还需要CBC模式,这是有意义的,因为我

  • 问题内容: 说我有一堂课 然后可以按如下方式解析有效的json: 如果字符串包含的数据多于解析对象所需的数据,是否有办法使解析器失败? 例如,我希望以下操作失败(成功) 我使用带有JsonParser.Feature.AUTO_CLOSE_SOURCE = false的InputStream尝试了此操作,并检查该流是否已被完全消耗,但这不起作用: 那是, 仍然成功,可能是因为解析器从流中消耗了超出

  • 我到处寻找解决我问题的办法,但似乎找不到。 我有一个类,它利用方法创建JSON Web令牌。我创建的web令牌需要符合以下条件(请注意,我的机密最右侧没有数字1): 我生成的令牌与上面的令牌匹配,除了数字1随机附加在我的令牌的最右端: 如您所见,这是JWT中包含秘密的部分。让我演示如何生成和加密令牌,以便您可以帮助诊断问题。我将向您展示整个类,然后引导您完成方法。 以下是整个课程: 首先,向Cre

  • 在我的android应用程序中,我正在实现RSA加密解密。 我们有这个适用于ios和android的应用程序。 每当ios用我的公钥加密消息时,都会在base64中发送加密文本,在android端,我会用私钥解密。 问题是,每当我解密数据时,它就会产生被垃圾填充包围的加密消息 如下所示: K������N�t�十、�08���我�二、�z� “test updated pub key”是消息。 我

  • 我使用RSA(1024)加密/解密字符串。加密使用公钥实现,用C语言编写,解密用C语言实现。我加密字符串: 86AFAECB-C211-4D55-8E90-2B715D6D64B9 并将加密数据写入文件。然后,使用openssl api从文件中读取加密数据并对其进行解密。然而,我得到的输出是: 86AFAECB-C211-4D55-8E90-2B715D6D64B9OEHEBJQ8FO1AMDNO

  • 我之所以问这个问题,是因为两天来我读了很多关于crypto AES加密的帖子,就在我以为我得到了它的时候,我意识到我根本没有得到它。 这个帖子是最接近我的问题,我有完全相同的问题,但它没有得到回答: CryptoJS AES加密与JAVA AES解密值不匹配 我得到的是已经加密的字符串(我得到的代码只是为了看看他们是怎么做的),所以修改加密方式不是一个选项。这就是为什么所有类似的问题对我来说都不是