java जावा में एईएस/जीसीएम का उपयोग करके गलत कुंजी का पता लगा रहा है




cryptography bouncycastle (2)

मैं एसीई का उपयोग कर रहा हूँ, एन्क्रिप्शन / डिक्रिप्ट GCM मोड में कुछ फाइलें बाउन्सी कैस्टल का उपयोग कर।
जब मैं डिक्रिप्शन के लिए गलत कुंजी साबित कर रहा हूं, कोई अपवाद नहीं है।
मुझे कैसे जाँच करनी चाहिए कि कुंजी गलत है?
मेरा कोड यह है:

    SecretKeySpec   incorrectKey = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
    Cipher          cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
    byte[] block = new byte[1048576];
    int i;

    cipher.init(Cipher.DECRYPT_MODE, incorrectKey, ivSpec);

    BufferedInputStream fis=new BufferedInputStream(new ProgressMonitorInputStream(null,"Decrypting ...",new FileInputStream("file.enc")));
    BufferedOutputStream ro=new BufferedOutputStream(new FileOutputStream("file_org"));        
    CipherOutputStream dcOut = new CipherOutputStream(ro, cipher);

    while ((i = fis.read(block)) != -1) {
        dcOut.write(block, 0, i);
    }

    dcOut.close();
    fis.close();

धन्यवाद


कोई तरीका नहीं है जो आप जीसीएम मोड में गलत कुंजी का पता लगा सकते हैं। आप क्या जांच सकते हैं कि प्रमाणीकरण टैग मान्य है, जिसका अर्थ है कि आप सही कुंजी का उपयोग कर रहे थे। समस्या यह है कि अगर प्रमाणीकरण टैग गलत है तो यह निम्न में से प्रत्येक (या सभी का संयोजन, सिफरटेक्स्ट और प्रमाणीकरण टैग के पूर्ण प्रतिस्थापन सहित) को इंगित कर सकता है:

  1. एक गलत कुंजी का उपयोग किया जा रहा है;
  2. काउंटर मोड एन्क्रिप्टेड डेटा परिवहन के दौरान बदल दिया गया था;
  3. अतिरिक्त प्रमाणीकृत डेटा बदल दिया गया था;
  4. परिवहन के दौरान प्रमाणीकरण टैग को बदला गया था

आप जो कर सकते थे वह इस्तेमाल किया गया गुप्त कुंजी की पहचान करने के लिए अतिरिक्त डेटा भेजता है। यह एक पठनीय पहचानकर्ता ( "encryption-key-1" ) हो सकता है लेकिन यह एक केसीवी, एक प्रमुख चेक मान भी हो सकता है। एक केसीवी में आम तौर पर कुंजी के साथ एन्क्रिप्ट किए गए शून्य-ब्लॉक, या कुंजी (जिसे फिंगरप्रिंट भी कहा जाता है) पर क्रिप्टोग्राफ़िक रूप से सुरक्षित हैश होते हैं। क्योंकि शून्य ब्लॉक लीक जानकारी पर एन्क्रिप्शन आपको उस एन्क्रिप्शन कुंजी को पहचानने के लिए उपयोग नहीं करना चाहिए।

कुंजी पहचान डेटा पर प्रमाणीकरण टैग की गणना करने के लिए आप वास्तव में जीसीएम मोड की एडीएस सुविधा का उपयोग कर सकते हैं। ध्यान दें कि आप फिंगरप्रिंट के समझौते और गलत कुंजी का उपयोग करने के बीच अंतर नहीं कर सकते। हालांकि यह कम संभावना है कि फिंगरप्रिंट गलती से चौथा, एएडी, सिफरटेक्स्ट और प्रमाणीकरण टैग की पूरी संरचना की तुलना में क्षतिग्रस्त हो गया है।


आप NoPadding का उपयोग कर रहे हैं इसे एन्क्रिप्शन और डिक्रिप्शन दोनों के लिए PKCS7Padding बदलें। यदि गलत कुंजी का उपयोग किया जाता है तो उम्मीद के अनुसार पैडिंग लगभग निश्चित रूप से डिक्रिप्ट करने में विफल हो जाएगा और InvalidCipherTextException को फेंक दिया जाएगा।





aes-gcm