java आरएसए एन्क्रिप्शन जावाकार्ड पर एक अपवाद छोड़ देता है



cryptography rsa (1)

मैंने अपने जावा कार्ड पर एक आरएसए सार्वजनिक कुंजी का उपयोग करके 10 बाइट यादृच्छिक संख्या को एन्क्रिप्ट करने के लिए एक प्रोग्राम लिखा है I यादृच्छिक संख्या हर बार उत्पन्न होती है जब कार्ड को एपीडीयू कमांड प्राप्त होता है, और जैसा कि मेरे एपलेट में संबंधित सिफर ऑब्जेक्ट ब्लॉक साइज 2048 बिट है, मैं इसे 10 बाइट रैंडम संख्या के अंत में 0x00 242 बाइट्स को 0x00 हूं जिससे कि इसे 256 बाइट्स लंबाई।

समस्या यह है कि कभी-कभी प्रतिक्रिया 05 मान के साथ एक क्रिप्टो अपवाद है। जैसा कि आप जानते हैं और जेसी एपीआई दस्तावेजों के रूप में उल्लेख किया है:

0x05 = ILLEGAL_USE

सार्वजनिक स्थिर अंतिम लघु 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

क्या किसी को भी पता है कि मेरे ऐपलेट में क्या गलत है?


आप गलत साइड पर पैडिंग कर रहे हैं आरएसए बड़े एंडियन एन्कोडेड नंबरों पर मॉड्यूलस आकार पर काम करता है। सामान्य पैडिंग तंत्र (जो सामान्य आरएसए सुरक्षा के लिए जरूरी है) बाईं पैडिंग द्वारा काम करता है, एक मूल्य के लिए मापांक से कड़ाई से छोटा है।

इसलिए मूल रूप से आपके गद्देदार चुनौती को एक एन्कोडेड संख्या के रूप में देखा जाता है, और जब परिवर्तित होता है, तो यह कभी-कभी मापांक से भी बड़ा होता है। जब ऐसा होता है तो आरएसए नियमानुसार इसे स्वीकार नहीं किया जाएगा।

शून्य बाइट्स को बाईं ओर पैड करना, इसे ठीक करना चाहिए। वैकल्पिक रूप से आप यह सुनिश्चित कर सकते हैं कि चुनौती का सर्वोच्च क्रम बिट शून्य ( & 0x7F ) पर मुखौटा है।





javacard