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

时间:2016-06-27 16:45:19

标签: java cryptography rsa javacard

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

问题是有时响应是带有05值的加密异常。如您所知和JC API文档所述:

  

0x05 = ILLEGAL_USE

     

public static final short ILLEGAL_USE

     

这个原因代码用于   表明签名或密码算法没有填充   传入消息和输入消息不是块对齐的。

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

以下是我的小程序的相关部分:

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

有没有人知道我的小程序有什么问题?

1 个答案:

答案 0 :(得分:3)

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

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

将零字节填充到左边应该解决这个问题。或者,您可以确保将挑战的最高位掩盖为零(& 0x7F)。