2016-05-29 3 views
1

のJavaカードアプレットで「ILLEGAL_USE」を返します。RSA暗号は、私は私のNXP JCOPカードでRSA暗号操作を行うには、次のアプレットを書いた

Select Applet begin... 
Select Applet successful. 
Send: 00 10 00 00 00 
Recv: 90 00 

Send: 00 20 00 00 00 
Recv: 90 00 

Send: 00 21 00 00 80 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 
Recv: 90 00 

Send: 00 21 01 00 80 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 
Recv: 6B 05 

質問:あなたが知っているように

  1. 、R簡素記号0x0005は、を示します。ILLEGAL_USEです。しかし、なぜ?
  2. update()メソッドを暗号オブジェクトに使用して、アプレットから一時バイト配列を削除するにはどうすればよいですか?

答えて

4

回答1:Cipher.ALG_RSA_PKCS1ドキュメントに記載されているとおり:

このアルゴリズムは、限られた長さのメッセージにのみ適しています。 暗号化中に処理された入力バイトの総数は、 (k-11以上)でない場合があります。ここで、kはRSAキーのモジュラスサイズ(バイト)です。

256バイトのメッセージを暗号化しているため、暗号化しようとしているメッセージはこの規則に従いません。係数のサイズは256バイトなので、暗号化できる最大メッセージは245バイト(k-11)です。メッセージに追加される追加のパディングバイトを考慮する必要があります。

回答2:部分的な結果を格納するために必要な入力バッファと出力バッファの両方を削除することはできません。

case INS_INIT_CIPHER_ENC: 
 
       myCipher.init(myRSAPubKey, Cipher.MODE_ENCRYPT); 
 
       cipher_result_len = (short) 0x00; 
 
       break; 
 
case INS_ENC: 
 
       apdu.setIncomingAndReceive(); 
 
       if (p1 == P1_CHAIN_APDU) { 
 
        cipher_result_len += myCipher.update(buff, dataOffset, lc, result, cipher_result_len); 
 
       } else if (p1 == P1_LAST_APDU) { 
 
        
 
        try { 
 
         cipher_result_len += myCipher.doFinal(buff, dataOffset, lc, result, cipher_result_len); 
 
        } catch (CryptoException e) { 
 
         short reason = e.getReason(); 
 
         ISOException.throwIt((short) ((short) 0x6B00 | reason)); 
 
        } 
 
        apdu.setOutgoing(); 
 
        apdu.setOutgoingLength(cipher_result_len); 
 
        apdu.sendBytesLong(result, (short) 0x00, cipher_result_len); 
 
       } 
 
       break;

cipher_result_len一時バッファに格納しなければならない短いデータです。

+0

したがって、どのパディング方式がより長いデータ暗号化に適していますか? – EbraHim

+0

あなたのメッセージはモジュラスのサイズである256バイトですので、必要に応じて(ALG_RSA_NOPAD)パディングをスキップできます。 ALG_RSA_PKCS1_OAEPには、私がよく慣れていない別のRSAパディングがあります。たぶんあなたはそれを試すことができます。 – Chooch