为了有效地计算Java Card中的平方,我想使用ALG_RSA_NOPAD
算法,其指数等于2
,并且模数大于预期结果(因此,模块化归约无效)。
但是我无法使用算法ALG_RSA_NOPAD
。实际上,当我调用doFinal()
方法时,我得到的是CryptoException
的ILLEGAL_VALUE
。在Java Card 2.2.2规范中,据说:
如果满足以下条件之一,则为CryptoException.ILLEGAL_USE:
•此密码算法不会填充邮件,并且邮件也不是块对齐的。
•此密码算法不会填充消息,并且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字节长度的最大值,以确保平方不会受到影响。)
最佳答案
好吧,在我的卡上,消息的长度必须与模数相同。我以为我测试了这种情况,但偏移量不匹配。
因此,即使我的信息也不长,因为模数(我无法计算平方)也必须用零填充数组。