java - GCMParameterSpec अमान्य एल्गोरिथ्म पैरामीटर एक्सप्शन फेंकता है: अज्ञात पैरामीटर प्रकार




android encryption (2)

इस कोड की कोशिश करो ...

    private static final String Key = "0123456789abcdef";

public static SecretKey generateKey() throws NoSuchAlgorithmException, InvalidKeySpecException, UnsupportedEncodingException {
    return new SecretKeySpec(Key.getBytes("UTF-8"), "AES");
}

public static byte[] encryptMsg(String message, SecretKey secret)
        throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidParameterSpecException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {

    Cipher cipher;
    cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secret);
    return cipher.doFinal(message.getBytes("UTF-8"));
}

public static String decryptMsg(byte[] cipherText, SecretKey secret)
        throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidParameterSpecException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {

    Cipher cipher;
    cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, secret);
    return new String(cipher.doFinal(cipherText), "UTF-8");
}

मैं SharedPreferences में सहेजने के लिए एंड्रॉइड डेटा एन्क्रिप्शन कर रहा हूं। GCMParameterSpec एंड्रॉइड में एपीआई 1 9 में पेश किया गया था, जिसका उपयोग मैं AES/GCM/NoPadding एन्क्रिप्शन के लिए कर रहा हूं। इस प्रकार मैं इसे लागू कर रहा हूं:

Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
c.init(Cipher.ENCRYPT_MODE, getSecretKey(context),new GCMParameterSpec(128,Base64.decode(myGeneratedIV, Base64.DEFAULT)));

मेरी समस्या है, एंड्रॉइड 4.4.2 (एपीआई 1 9) में मुझे त्रुटि का उल्लेख किया गया है, लेकिन एपीआई 21 से यह काम करता है।

अपवाद के बारे में, एंड्रॉइड डॉक्स से:

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

मेरा सवाल है: क्या इस व्यवहार के लिए कोई विशिष्ट कारण है? साइफर से इनिट पद्धति पैरामीटर की पहचान क्यों नहीं करती?

मैंने एक विशिष्ट IV दिए बिना भी एन्क्रिप्ट करने की कोशिश की:

c.init(Cipher.ENCRYPT_MODE, getSecretKey(context));

और एक बार मैंने उसी तरह डिक्रिप्ट करने की कोशिश की:

c.init(Cipher.DECRYPT_MODE, getSecretKey(context));

यह एक ही अपवाद फेंकता है ( GCMParameterSpec ) कह रही है कि डिक्रिप्शन के लिए GCMParameterSpec आवश्यक है।

मैंने केवल डिक्रिप्शन के लिए GCMParameterSpec देने की कोशिश की, और मुझे अज्ञात पैरामीटर प्रकार अपवाद मिलता है।

किसी भी मदद की सराहना की है


हो सकता है कि CipherSpi में प्रदाता के भीतर CipherSpi कार्यान्वयन अभी तक GCMParameterSpec समर्थन नहीं कर सकता है। एपीआई को परिभाषित करना, अंतर्निहित क्रिप्टोग्राफी प्रदाता के भीतर इसके लिए सहायता प्रदान करने के समान नहीं है।

इसके बजाय आप मानक IvParameterSpec उपयोग दूसरे तरीकों के लिए भी कर सकते हैं। अपने GCMParamterSpec सीधे अपने आईवी के लिए बस (12) चतुर्थ / नॉन बाइट्स का उपयोग करें

जैसा कि आपके पास मानक टैग आकार है, इसलिए इसे आपके कार्यान्वयन में कोई समस्या नहीं होनी चाहिए।

अगर टैग का आकार अलग होता है तो समाधान अधिक जटिल हो जाता है क्योंकि सत्यापन केवल परिणामी टैग के बाएं बाइट का उपयोग करेगा। दुर्भाग्य से टैग निर्माण और सत्यापन Cipher क्लास के एपीआई डिज़ाइन के भीतर छिपा हुआ है।