gpt4 book ai didi

java - RSA 加密在 JavaCard 上间歇性地抛出异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:11 24 4
gpt4 key购买 nike

我编写了一个程序,使用我的 Java 卡上的 RSA 公钥加密 10 字节的随机数。卡每次收到该 APDU 命令时都会生成随机数,并且由于我的小程序中相关的密码对象 block 大小为 2048 位,因此我在此 末尾附加了 242 个字节的 0x00 >10 字节随机数,使其长度为 256 字节。

问题是有时响应是具有 05 值的加密异常。如您所知以及 JC API 文档中提到的:

0x05 = ILLEGAL_USE

public static final short ILLEGAL_USE

This reason code is used to indicate that the signature or cipher algorithm does not pad the incoming message and the input message is not block aligned.

由于输入长度在我的小程序中是固定的,我无法解决我的问题!

这是我的小程序的相关部分:

protected final void getEncChallenge(APDU apdu) {
random.generateData(generatedChall, (short) 0, (short) 10);
initAsymCipher(ENTITY_BOB, MODE_ENC);
Util.arrayCopy(generatedChall, (short) 0, transientData, (short) 0, (short) 10);
Util.arrayFillNonAtomic(transientData, (short) 10, (short) 246, (byte) 0x00);
rsaCrypto(transientData, persistentData);
apdu.setOutgoing();
apdu.setOutgoingLength((short) 256);
apdu.sendBytesLong(persistentData, (short) 0, (short) 256);
}

protected final void rsaCrypto(byte[] inData, byte[] outData) {
try{
asymCipher.doFinal(inData, (short) 0, (short) 256, outData, (short) 0);
}catch(CryptoException e){
short reason = e.getReason();
ISOException.throwIt((short)(0x6d00 | reason));
}
}

这是响应:

transientData ---> APDU Response
---------------------------------
80 ..(Eight Random Bytes).. BD ..(246 bytes of "0x00").. ---> OK (i.e. 256 byte encrypted data)
EO ..(Eight Random Bytes).. 64 ..(246 bytes of "0x00").. ---> 6D05
02 ..(Eight Random Bytes).. B3 ..(246 bytes of "0x00").. ---> OK
CB ..(Eight Random Bytes).. 35 ..(246 bytes of "0x00").. ---> 6D05
17 ..(Eight Random Bytes).. 97 ..(246 bytes of "0x00").. ---> OK
0C ..(Eight Random Bytes).. 0C ..(246 bytes of "0x00").. ---> OK
D3 ..(Eight Random Bytes).. 91 ..(246 bytes of "0x00").. ---> 6D05
86 ..(Eight Random Bytes).. E2 ..(246 bytes of "0x00").. ---> OK
C2 ..(Eight Random Bytes).. 23 ..(246 bytes of "0x00").. ---> 6D05

有谁知道我的小程序出了什么问题吗?

最佳答案

你在错误的一边填充。 RSA 适用于最大模数大小的大端编码数字。通常的填充机制(这是通常的 RSA 安全性所必需的)通过填充来工作,填充到一个严格小于模数的值。

所以基本上你填充的挑战被视为一个编码数字,并且在转换时,它有时大于模数。当发生这种情况时,RSA 例程将不会接受它。

向左填充零字节应该可以解决这个问题。或者,您可以确保挑战的最高位被屏蔽为零 (& 0x7F)。

关于java - RSA 加密在 JavaCard 上间歇性地抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com