मैं एईएस के साथ एंड्रॉइड पर एक स्ट्रिंग एन्क्रिप्ट करने की कोशिश कर रहा हूं। सममित कुंजी को पहले डिफी-हेलमैन एल्गोरिदम के साथ निर्धारित किया जाता है और यह ठीक लगता है (मुख्य लंबाई 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 बिट्स है!
कोई विचार?
+1 ने मुझे यह करने के लिए हराया। @ पीटर: बिट्स की संख्या का प्रतिनिधित्व करने वाली एकमात्र जगह आपको एक विशेष स्थान मिलेगी जो एक विशिष्ट बिट संग्रह होगा। 99.9% समय यह वर्ण या बाइट्स की गिनती होगी। –
हम्म, आप स्पष्ट रूप से सही हैं। तो KeyAgreement.generateSecret ("एईएस") का उपयोग करके 128 बाइट्स की लंबाई के साथ एक कुंजी लौटाती है। जाहिर है, यह बहुत अधिक है ... मैं 256 बिट कहने के साथ एक कुंजी कैसे प्राप्त कर सकता हूं? धन्यवाद – Peter
वैसे: एंड्रॉइड सुरक्षा प्रदाता के रूप में BouncyCastle का उपयोग करता है ... – Peter