私は、Java CardでRSA公開鍵を使用して10
バイトの乱数を暗号化するプログラムを作成しました。乱数はカードがそのAPDUコマンドを受け取るたびに生成され、私のアプレットでは関連する暗号オブジェクトのブロックサイズが2048ビットなので0x00
の242バイトをこの10
バイトの乱数の末尾に付加して256
バイトにします長さRSA EncrytionがJavaCardで断続的に例外をスローする
場合によっては、応答が05
の値を持つ暗号例外であることが問題です。あなたが知っていると述べたJCのAPIドキュメントのように:
0x05
= ILLEGAL_USEのpublic static final短いILLEGAL_USEが
この理由コードは、 に使用された署名や暗号アルゴリズムがないことを示しています入力メッセージが に埋め込まれ、入力メッセージがブロック位置合わせされていない。
入力長が自分のアプレットで固定されているため、問題を解決できません。ここで
は私のアプレットの関連部分です:
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
誰もが私のアプレットと間違って何任意のアイデアを持っていますか?
どのようなALG_をお使いですか? – vojta
@vojta 'asymCipher = Cipher.getInstance(Cipher.ALG_RSA_NOPAD、false); ' – Abraham