2015-10-19 3 views
11

प्रदान करने के लिए मैं ConfirmCredential एंड्रॉयड गूगल द्वारा प्रदान उदाहरण का अनुसरण कर रहा हूँ, लेकिन यह केवल पता चलता डेटा एन्क्रिप्ट करने के लिए कैसे।एंड्रॉइड फिंगरप्रिंट का उपयोग करते समय समस्या: डीक्रिप्ट करने पर IV आवश्यक है। उपयोग IvParameterSpec या AlgorithmParameters यह

java.security.InvalidKeyException: IV required when decrypting. Use IvParameterSpec or AlgorithmParameters to provide it. 

मैं निम्नलिखित कोड का उपयोग करें::

String transforation = KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7; 

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
keyStore.load(null); 
SecretKey secretKey = (SecretKey) keyStore.getKey(KEY_NAME, null); 

// encrypt 
Cipher cipher = Cipher.getInstance(transforation); 
cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
String encriptedPassword = cipher.doFinal("Some Password".getBytes("UTF-8")); 

// decrypt 
cipher = Cipher.getInstance(transforation); 
cipher.init(Cipher.DECRYPT_MODE, secretKey); 
String password = new String(cipher.doFinal(encriptedPassword), "UTF-8")); 

अपवाद लाइन पर फेंक दिया जाता है: जब मैं उसे डीक्रिप्ट करने की कोशिश मैं अपवाद

cipher.init(Cipher.DECRYPT_MODE, secretKey); 

है क्या पर कोई विचार इस मामले में डिक्रिप्शन करने का उचित तरीका?

+1

http://stackoverflow.com/questions/6669181/why-does-my-aes-encryption-throws-an-invalidkeyexception पर देखें और देखें कि IvParameterSpec का उपयोग करके उपयोग करने में मदद मिलती है। – ditkin

+0

डुप्लिकेट IMHO साफ़ करें। – JimmyB

+0

@ditkin मैं पहले से ही चतुर्थ जोड़ने की कोशिश की है, लेकिन यह अपवाद के साथ हुई थी: java.security.InvalidAlgorithmParameterException: जब एन्क्रिप्ट करने कोलर-प्रदान की चतुर्थ अनुमति नहीं है। – Zlatko

उत्तर

10

मूल रूप से आप डिक्रिप्ट मोड के लिए IvParameterSpec पारित करने के लिए आप मैन्युअल रूप से एन्क्रिप्शन मोड के लिए सेट नहीं किया जाना चाहिए, जबकि है।

private initCipher(int mode) { 
    try { 
     byte[] iv; 
     mCipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" 
       + KeyProperties.BLOCK_MODE_CBC + "/" 
       + KeyProperties.ENCRYPTION_PADDING_PKCS7); 
     IvParameterSpec ivParams; 
     if(mode == Cipher.ENCRYPT_MODE) { 
      mCipher.init(mode, generateKey()); 
      ivParams = mCipher.getParameters().getParameterSpec(IvParameterSpec.class); 
      iv = ivParams.getIV(); 
      fos = getContext().openFileOutput(IV_FILE, Context.MODE_PRIVATE); 
      fos.write(iv); 
      fos.close(); 
     } 
     else { 
      key = (SecretKey)keyStore.getKey(KEY_NAME, null); 
      File file = new File(getContext().getFilesDir()+"/"+IV_FILE); 
      int fileSize = (int)file.length(); 
      iv = new byte[fileSize]; 
      FileInputStream fis = getContext().openFileInput(IV_FILE); 
      fis.read(iv, 0, fileSize); 
      fis.close(); 
      ivParams = new IvParameterSpec(iv); 
      mCipher.init(mode, key, ivParams); 
     } 
     mCryptoObject = new FingerprintManager.CryptoObject(mCipher); 
    } catch(....) 
} 

तुम भी Base64 साथ चतुर्थ डेटा सांकेतिक शब्दों में बदलना और एक फ़ाइल के तहत यह बचत के बजाय साझा वरीयताओं के तहत यह बचा सकते हैं:

तो यहाँ मैं क्या किया है और यह अच्छी तरह से काम करता है।

या तो मामले में, आप Android M के लिए नया पूर्ण बैकअप सुविधा कार्यरत है, यह ध्यान रखें इस डेटा नहीं बैकअप के लिए अनुमति दी जानी चाहिए/बहाल के बाद से यह अवैध है एक उपयोगकर्ता एप्लिकेशन को पुनर्स्थापित या स्थापित जब किसी अन्य डिवाइस पर ऐप।

+0

यह मेरे जीवन को बचाया। धन्यवाद। : डी – WonderKid

0

कैसे इस बारे में,

mCipher.init(Cipher.DECRYPT_MODE, key, mCipher.getParameters());

आप गूगल रेपो से नमूना कोड का उपयोग करते हैं, इसके बाद के संस्करण लाइन काम करेंगे, यह भी ध्यान रखें, हर mChiper.init के लिए हम, एक बार फिंगरप्रिंट के साथ प्रमाणित करने कि साधन की जरूरत है दो फिंगरप्रिंट ऑथ की आवश्यकता है, एक एन्क्रिप्शन के लिए और एक डिक्रिप्शन के लिए।

https://github.com/googlesamples/android-FingerprintDialog

+0

फीडबैक के लिए धन्यवाद, लेकिन फिर से यह java.security.InvalidAlgorithm पैरामीटर एक्सेप्शन के साथ हुआ: IV को डिक्रिप्ट करते समय आवश्यक था। इसे प्रदान करने के लिए IvParameterSpec या एल्गोरिदम पैरामीटर का उपयोग करें। मैं https: // github का उपयोग करता हूं।com/googlesamples/android-ConfirmCredential और AUTHENTICATION_DURATION_SECONDS 30 पर सेट है, इसलिए मुझे उम्मीद है कि केवल एक बार फिंगरप्रिंट स्कैन की आवश्यकता होगी। – Zlatko

4

मैं (इस मुद्दे here के लिए लिंक) गूगल द्वारा प्रदान नमूने के लिए GitHub परियोजना में एक मुद्दा बनाया। मुझे मिली प्रतिक्रिया यह है कि मुझे उस IV का उपयोग करना चाहिए जो मान उत्पन्न हुआ था जब मान एन्क्रिप्ट किया गया था। (@Qianqian द्वारा प्रदान समाधान में के रूप में ही)

cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(encryptCipher.getIV())); 
byte[] decryptedBytes = cipher.doFinal(encryptedBytes); 

मैं एक नमूना आवेदन से पता चलता है कि ऐसा करने के तरीके बनाया। यह गीथूब, here पर उपलब्ध है।

आशा इस किसी के लिए उपयोगी है।

संबंधित मुद्दे

 संबंधित मुद्दे