2012-05-31 14 views
11

प्रोग्राम के नीचे चलते समय मुझे यह अपवाद मिल रहा है। एईएस के रूप में समस्या 128 -256 बिट कुंजी की अनुमति देने में सक्षम नहीं है?अपवाद प्राप्त करना java.security.InvalidKeyException: अवैध एईएस कुंजी लंबाई: 2 बाइट्स?

Exception in thread "main" java.security.InvalidKeyException: Invalid AES key length: 29 bytes 
at com.sun.crypto.provider.AESCipher.engineGetKeySize(DashoA13*..) 
at javax.crypto.Cipher.b(DashoA13*..) 

लाइन 20

यहाँ पर हो रही है अपवाद कार्यक्रम

import java.security.Key; 

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 

import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 

public class AESEncryptionDecryptionTest { 

    private static final String ALGORITHM  = "AES"; 
    private static final String myEncryptionKey = "ThisIsSecurityKey"; 
    private static final String UNICODE_FORMAT = "UTF8"; 

    public static String encrypt(String valueToEnc) throws Exception { 
Key key = generateKey(); 
Cipher c = Cipher.getInstance(ALGORITHM); 
c.init(Cipher.ENCRYPT_MODE, key); //////////LINE 20 
byte[] encValue = c.doFinal(valueToEnc.getBytes()); 
String encryptedValue = new BASE64Encoder().encode(encValue); 
return encryptedValue; 
    } 

public static String decrypt(String encryptedValue) throws Exception { 
Key key = generateKey(); 
Cipher c = Cipher.getInstance(ALGORITHM); 
c.init(Cipher.DECRYPT_MODE, key); 
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedValue); 
byte[] decValue = c.doFinal(decordedValue); 
String decryptedValue = new String(decValue); 
return decryptedValue; 
} 

private static Key generateKey() throws Exception { 
byte[] keyAsBytes; 
keyAsBytes = myEncryptionKey.getBytes(UNICODE_FORMAT); 
Key key = new SecretKeySpec(keyAsBytes, ALGORITHM); 
return key; 
} 

public static void main(String[] args) throws Exception { 

String value = "password1"; 
String valueEnc = AESEncryptionDecryptionTest.encrypt(value); 
String valueDec = AESEncryptionDecryptionTest.decrypt(valueEnc); 

System.out.println("Plain Text : " + value); 
System.out.println("Encrypted : " + valueEnc); 
System.out.println("Decrypted : " + valueDec); 
} 

} 
+0

कौन सा कथन अपवाद उत्पन्न करता है? – aioobe

+0

c.init (Cipher.ENCRYPT_MODE, कुंजी); –

उत्तर

29

एईएस की अनुमति देता है 128, 192 या 256 बिट कुंजी लंबाई है। वह 16, 24 या 32 बाइट है। अपने mEncryptionKey के पहले 16 बाइट्स को keyAsBytes के रूप में लेने का प्रयास करें।

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

  • यदि कोई छोटा पासवर्ड उपयोग करता है तो यह आपकी मुख्य पीढ़ी को तोड़ देगा।
  • दो अलग-अलग पासवर्ड जिसके लिए पहले 16 बाइट समान हैं, वही कुंजी बनाएंगे।

इन दोनों समस्याओं को हैश का उपयोग करके समाप्त कर दिया गया है।

इस कक्षा में buildKey() विधि पर एक नज़र डालें; https://github.com/qwerky/DataVault/blob/master/src/qwerky/tools/datavault/DataVault.java

+0

धन्यवाद Qwerky। कुछ और निष्कर्ष। जब मैं अपना एन्क्रिप्शनकी 16 वर्ण लंबा यानी 128 बिट लंबाई के रूप में देता हूं तो यह प्रोग्राम जुर्माना चलाता है लेकिन जब मैं इसे 24 वर्णक लंबी (1 9 2 बिट लंबाई) या 32 वर्ण लंबा (256 बिट लंबाई) के रूप में देता हूं तो मुझे त्रुटि " अवैध कुंजी आकार या डिफ़ॉल्ट पैरामीटर "। यदि मैं चाहता हूं तो क्या मैं मुख्य लंबाई 256 या 1 9 2 पर सेट कर सकता हूं? –

+1

1 9 2 या 256 का उपयोग करने के लिए आपको "असीमित कुंजी शक्ति" नीति फ़ाइलों को सक्षम करने की आवश्यकता हो सकती है। यह संयुक्त राज्य अमेरिका में कानूनी प्रतिबंध के कारण है। यहाँ देखें; http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html। इस साइट पर 'अवैध कुंजी आकार या डिफ़ॉल्ट पैरामीटर' खोजें, इसके बारे में कई प्रश्न और उत्तर हैं। – Qwerky

+0

Datavault.java में आपके उदाहरण में, BouncyCastleProvider का उपयोग किया जाता है जो मानक जावा वर्ग नहीं है। कुछ प्रतिबंधों के कारण मुझे केवल स्टैंडर जावा कक्षाओं के साथ जाना होगा। क्या मैं उदाहरण के उदाहरण में बाउंसीकास्टलप्रोवाइडर के प्रदाता वर्ग के कुछ अन्य कार्यान्वयन का उपयोग कर सकता हूं? –

1

कुंजी इनपुट के रूप में यादृच्छिकता का उपयोग करती है, लेकिन इसकी रचना के लिए कठोर आवश्यकताएं हैं। आपके द्वारा उपयोग किए गए SecretKeySpec कन्स्ट्रक्टर मेमोरी में पहले से जेनरेट की गई कुंजी लोड करने के लिए है। इसके बजाय, KeyGenerator का उपयोग करें।

KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM); 
kg.init(128); 
SecretKey k = kg.generateKey(); 

यह भी ध्यान दें कि एईएस-128 अब वास्तव में एईएस -256 से कमजोर माना जाता है। यह शायद काफी अलग नहीं है लेकिन लंबे कुंजी आकार से लाभ कहीं और सरलीकरण (कम दौर) से अधिक हो सकता है।

+1

हाय जॉन। मैं स्वयं असाइन की गई कुंजी का उपयोग करना चाहता हूं क्योंकि मैं साझा कुंजी के रूप में उपयोग करूँगा। मैं उस कुंजी का उपयोग करना चाहता हूं जो ज्ञात है और मेरे द्वारा सिस्टम द्वारा उत्पन्न कुंजी नहीं है। क्या आप कुछ इनपुट फेंक सकते हैं कि मैं एईएस में 256 बिट से कम किसी भी लंबाई की स्वयं निर्दिष्ट कुंजी का उपयोग कैसे कर सकता हूं? –

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