ALG_RSA_NOPAD 在 Java 卡片中

ALG_RSA_NOPAD in Java Card

为了有效计算 Java Card 中的正方形,我想使用指数等于 2 且模数大于预期结果的算法 ALG_RSA_NOPAD(因此模块化缩减没有效果)。

但我无法使用算法 ALG_RSA_NOPAD。事实上,当我调用方法 doFinal() 时,我得到一个 CryptoException,即 ILLEGAL_VALUE。在 Java Card 2.2.2 规范中,据说:

CryptoException.ILLEGAL_USE if one of the following conditions is met:

• This Cipher algorithm does not pad the message and the message is not block aligned.

• This Cipher algorithm does not pad the message and no input data has been provided in inBuff or via the update() method.

• The input message length is not supported.

• The decrypted data is not bounded by appropriate padding bytes.

所以我得出结论,我的消息没有块对齐。但是块对齐对这个算法意味着什么?我的消息是否与模数具有相同的长度?指数?我尝试了不同的东西,但我没有找到...

对应代码:

   byte[] res_RSA = new byte[(short) 0x0080];
   KeyPair rsa_KeyPair = new   KeyPair(KeyPair.ALG_RSA,KeyBuilder.LENGTH_RSA_1024);
        rsa_KeyPair.genKeyPair();
   RSAPublicKey rsa_PubKey; rsa_PubKey = (RSAPublicKey) rsa_KeyPair.getPublic();


    rsa_PubKey.setExponent(new byte[]{(byte) 0x02}, (short) 0x00000, (short) 0x0001);
    rsa_PubKey.setModulus(new byte[] { (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
        (byte) 0xFF, (byte) 0xFF, }, (short) 0x0000, (short) 0x0080);

    cipherRSA = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false);

    x = new byte[] { (byte) 0x0C, (byte) 0xE2, (byte) 0x65, (byte) 0x92,
        (byte) 0x98, (byte) 0x84, (byte) 0x4C, (byte) 0x6C,
        (byte) 0x39, (byte) 0x31, (byte) 0x78, (byte) 0x22,
        (byte) 0x99, (byte) 0x39, (byte) 0xAD, (byte) 0xAD,
        (byte) 0x74, (byte) 0x31, (byte) 0x45, (byte) 0xD2,
        (byte) 0xB9, (byte) 0x37, (byte) 0xB2, (byte) 0x92,
        (byte) 0x7D, (byte) 0x32, (byte) 0xE9, (byte) 0x70,
        (byte) 0x91, (byte) 0x7D, (byte) 0x78, (byte) 0x45,
        (byte) 0xC9, (byte) 0x5C, (byte) 0xF9, (byte) 0xF2,
        (byte) 0xFD, (byte) 0xB9, (byte) 0xAE, (byte) 0x6C,
        (byte) 0xC9, (byte) 0x42, (byte) 0x64, (byte) 0xBA,
        (byte) 0x2A, (byte) 0xCE, (byte) 0x5A, (byte) 0x71,
        (byte) 0x60, (byte) 0x58, (byte) 0x56, (byte) 0x17,
        (byte) 0x2E, (byte) 0x25, (byte) 0xDD, (byte) 0x47,
        (byte) 0x23, (byte) 0x6B, (byte) 0x15, (byte) 0x76,
        (byte) 0x8F, (byte) 0x2A, (byte) 0x87, (byte) 0xC7 };

   cipherRSA.init(rsa_PubKey, Cipher.MODE_ENCRYPT);
   cipherRSA.doFinal(x, (short) 0x0000,
            (short) 0x0040, res_RSA, (short) 0x0000);

所以 CryptoException 在最后一行出现了,但我真的不明白为什么。

(请注意,在我的代码中,我将模数设置为 128 字节长度的最大值,以确保平方不会受到影响。)

通常,RSA 仅针对 Java 卡的特定 实现 的某些 public 指数进行验证。如果您使用更大的 public 指数,例如 65537 (0x01, 0x00, 0x01),这个问题很可能会消失。请查阅您的芯片/平台的用户手册。

请注意,这种没有填充的计算对于 RSA 来说是不安全的。这意味着它们也可能难以向认证机构解释。 Diffie-Hellman 实现(如果有的话)可能会让您更幸运。

好吧,在我的卡上消息的长度必须与模数相同...我以为我测试了这种情况,但我不匹配偏移量。

所以即使我的消息没有模长(我无法计算正方形),我也必须用零填充数组。