Java卡中的ALG_RSA_NOPAD

Java卡中的ALG_RSA_NOPAD,java,cryptography,javacard,Java,Cryptography,Javacard,为了有效地计算Java卡中的平方,我想使用算法ALG_RSA_NOPAD,其指数等于2,模数大于预期结果(因此,模数减少没有效果) 但是我不能使用算法ALG\u RSA\u NOPAD。事实上,当我调用方法doFinal()时,我得到一个CryptoException,它是非法的\u值。Java卡2.2.2规范中说: CryptoException.Unligal_在满足以下条件之一时使用: •此密码算法不填充消息,且消息未按块对齐 •此密码算法不填充消息,inBuff中未提供任何输入数据 或者

为了有效地计算Java卡中的平方,我想使用算法
ALG_RSA_NOPAD
,其指数等于
2
,模数大于预期结果(因此,模数减少没有效果)

但是我不能使用算法
ALG\u RSA\u NOPAD
。事实上,当我调用方法
doFinal()
时,我得到一个
CryptoException
,它是
非法的\u值。Java卡2.2.2规范中说:

CryptoException.Unligal_在满足以下条件之一时使用:

•此密码算法不填充消息,且消息未按块对齐

•此密码算法不填充消息,inBuff中未提供任何输入数据 或者通过update()方法

•不支持输入消息长度

•解密的数据不受适当的填充字节限制

因此,我得出结论,我的消息不是块对齐的。但是块对齐对于这个算法意味着什么呢?我的消息的长度是否与模数相同?指数?我尝试了不同的方法,但没有发现

相应的代码:

   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字节长度的最大值,以确保平方不会受到影响。)

通常,对于特定的Java卡实现,RSA只能针对特定的公共指数进行验证。如果使用更大的公共指数,如65537(
0x01、0x00、0x01
),则此问题很可能会消失。请参阅芯片/平台的用户手册


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

好吧,在我的卡片上消息的长度必须与模数相同。。。我以为我测试了这个案例,但我错配了偏移量


因此,即使是我的消息也不长,因为模数(我无法计算平方)我必须用零填充数组。

我将使用更大的指数重试以进行测试。关于Diffie Hellman,Java Card 2.2.2 API只提到椭圆曲线版本,所以我想您提到的是专有API?感谢您的解释是的,这或3.0.5,但我认为您不会在野外找到JC 3.0.5…但是。因此我会注意文档,不能等待AEAD密码;)