2016-06-27 20 views
3

Ich habe ein Programm geschrieben, um 10 Bytes Zufallszahl mit einem öffentlichen RSA-Schlüssel auf meiner Java Card zu verschlüsseln. Die Zufallszahl wird jedes Mal generiert, wenn die Karte diesen APDU-Befehl empfängt, und da die zugehörige Blockgröße des Chiffrierobjekts 2048 Bit in meinem Applet beträgt, lege ich 242 Byte 0x00 am Ende dieser 10 Byte-Zufallszahl an, um 256 Bytes zu bilden Länge.RSA Encryption löst eine Ausnahme intermittierend auf JavaCard

Das Problem ist, dass manchmal die Antwort eine Crypto Exception mit 05 Wert ist. Wie Sie wissen und wie JC API urkundlich erwähnt:

0x05 = ILLEGAL_USE

public static final kurze ILLEGAL_USE

Dieser Grund Code verwendet wird zeigen, dass die Unterschrift oder Verschlüsselungsalgorithmus nicht pad die eingehende Nachricht und die Eingabe Nachricht ist nicht Block ausgerichtet.

Da die Eingabe Länge in meinem Applet behoben ist, kann ich mein Problem nicht lösen!

ist hier der entsprechende Teil meines Applets:

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)); 
    } 
} 

Und hier ist die Antwort:

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 

Hat keine Ahnung, jemand, was mit meinem Applet falsch?

+0

Was ALG_ verwenden Sie? – vojta

+0

@vojta 'asymCipher = Cipher.getInstance (Cipher.ALG_RSA_NOPAD, false);' – Abraham

Antwort

3

Sie padding auf der falschen Seite. RSA arbeitet an Big-Endian-codierten Zahlen bis zur Modulgröße. Die üblichen Padding-Mechanismen (die für die übliche RSA-Sicherheit erforderlich sind) arbeiten von links Padding auf einen Wert, der streng kleiner als der Modul ist.

Also im Grunde wird Ihre aufgefüllte Herausforderung als eine codierte Zahl gesehen, und wenn sie konvertiert wird, ist sie manchmal größer als der Modul. Wenn dies geschieht, akzeptiert die RSA-Routine dies nicht.

Das Auffüllen der Nullbytes nach links sollte dies beheben. Alternativ können Sie sicherstellen, dass das höchstwertige Bit der Abfrage auf Null maskiert wird (& 0x7F).

+0

Vielen Dank lieber Herr Bodewes. Ich bin ein wenig verwirrt. Darf ich Sie bitten, erklären Sie es bitte ein wenig mehr? Ich denke, als ich anzeigte, dass der Algorithmus ALG_RSA_NOPAD ist, muss die Verschlüsselung die Abfrage als 256-Byte-Daten betrachten, nicht als aufgefüllte oder codierte Daten. Recht? Also warum gibt es irgendeine Umwandlung? Bedeutet Ihre Antwort, dass ALG_RSA_NOPAD einige 256-Byte-Daten nicht verschlüsseln kann? – Abraham

+0

Welche Umwandlung meinen Sie in _... und wenn konvertiert, manchmal ... _? – Abraham

+1

Ja, ALG_RSA_NOPAD kann das nicht. Der Grund ist einfach; Wenn Sie eine modulare Operation mit einer höheren Zahl als dem Modulus durchführen, wird der Wert offensichtlich als (in diesem Fall) "Zahl - N" behandelt. Also, wenn Sie es rückgängig machen, erhalten Sie auch 'Nummer - N' anstelle von' Nummer'. Dies ist ein grundlegendes Problem bei RSA. Es hängt natürlich von der Herausforderung ab, wie groß die dekodierte Zahl wirklich ist. Wenn es mit "FF" Hex beginnt, dann ist es fast sicher größer als der Modul. Wenn es mit '7F' hex oder niedriger beginnt, dann muss * * kleiner sein (da das höchste Bit des Moduls immer gesetzt ist) (versuchen Sie es). –