2010-12-10 13 views
9

मैं एईएस के साथ एंड्रॉइड पर एक स्ट्रिंग एन्क्रिप्ट करने की कोशिश कर रहा हूं। सममित कुंजी को पहले डिफी-हेलमैन एल्गोरिदम के साथ निर्धारित किया जाता है और यह ठीक लगता है (मुख्य लंबाई 128 बिट है, नीचे देखें)।
फिर भी, मैं एक InvalidKeyException: "Key length not 128/192/256 bits. "एईएस एन्क्रिप्शन: अमान्य KeyException: कुंजी लंबाई 128/192/256 बिट्स

कोड प्राप्त करें:

KeyAgreement keyAgree = KeyAgreement.getInstance("DH", "BC"); 
keyAgree.init(this.smartphonePrivKey); 
keyAgree.doPhase(serverPubKey, true); 
SecretKey key = keyAgree.generateSecret("AES"); 
System.out.println("Key Length: " + key.getEncoded().length); 
System.out.println("Key Algorithm: "+ key.getAlgorithm()); 
System.out.println("Key Format: "+ key.getFormat()); 

byte[] encrypted = null; 
    Cipher cipher; 
    try { 
    cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
    System.out.println("Allowed Key Length: " 
    + cipher.getMaxAllowedKeyLength("AES")); 
    cipher.init(Cipher.ENCRYPT_MODE, key); 
    encrypted = cipher.doFinal("YEAH".getBytes("UTF8")); 
    } catch (NoSuchAlgorithmException e) { 
    e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
    e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
    e.printStackTrace(); 
    } catch (IllegalBlockSizeException e) { 
    e.printStackTrace(); 
    } catch (BadPaddingException e) { 
    e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
    } 

ऊपर संहिता निम्नलिखित उत्पादन की ओर जाता है:

_12-10 20:24:53.119: INFO/System.out(757): Key Length: 128_ 
_12-10 20:24:53.119: INFO/System.out(757): Key Algorithm: AES_ 
_12-10 20:24:53.119: INFO/System.out(757): Key Format: RAW_ 
_12-10 20:24:53.470: INFO/System.out(757): Allowed Key Length: 2147483647_ 

उसके बाद, मैं InvalidKeyException: Key length not 128/192/256 bits. मिलता लेकिन आप देख सकते हैं , SecretKey की लंबाई 128 बिट्स है!

कोई विचार?

उत्तर

19

आपके द्वारा जेनरेट की गई कुंजी 128 बाइट्स है, 128 बिट्स नहीं। "कुंजी लंबाई" होना चाहिए 16.

+0

+1 ने मुझे यह करने के लिए हराया। @ पीटर: बिट्स की संख्या का प्रतिनिधित्व करने वाली एकमात्र जगह आपको एक विशेष स्थान मिलेगी जो एक विशिष्ट बिट संग्रह होगा। 99.9% समय यह वर्ण या बाइट्स की गिनती होगी। –

+0

हम्म, आप स्पष्ट रूप से सही हैं। तो KeyAgreement.generateSecret ("एईएस") का उपयोग करके 128 बाइट्स की लंबाई के साथ एक कुंजी लौटाती है। जाहिर है, यह बहुत अधिक है ... मैं 256 बिट कहने के साथ एक कुंजी कैसे प्राप्त कर सकता हूं? धन्यवाद – Peter

+0

वैसे: एंड्रॉइड सुरक्षा प्रदाता के रूप में BouncyCastle का उपयोग करता है ... – Peter

1

यह अपवाद मूल रूप से एन्क्रिप्शन के लिए पारित होने वाली कुंजी की लंबाई के कारण होता है। यदि आप एईएस एन्क्रिप्शन का उपयोग कर रहे हैं तो वर्णों की संख्या 128/192/256 बिट्स की लंबाई में होनी चाहिए । उदाहरण के लिए आप 16 वर्ण, 24 वर्ण या 32 वर्ण की कुंजी का उपयोग कर सकते हैं।

String encrypted_data=AES.encrypt("HELLO","ASDFGHJKLASDFGHJ"); 

आशा इस मदद ...

+0

पहले से ही एक स्वीकार्य उत्तर है। –

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

  • कोई संबंधित समस्या नहीं^_^