दिलचस्प पोस्ट
Android में HTTP प्रमाणीकरण कैसे करें? Windows के तहत मेरे पासफ़्रेज़ को क्यों नहीं Git याद कर सकता है एफबीएसडीकेॉग: एफबी **** को प्राधिकृत करने के लिए फेसबुक ऐप या सफारी का उपयोग नहीं किया जा सकता है, यह यूआरएल स्कीम के रूप में पंजीकृत नहीं है बंडल इंस्टॉल SSL प्रमाणपत्र सत्यापन त्रुटि के साथ विफल रहता है Array.size () बनाम अर्रे। लांघ ImageView स्केलिंग TOP_CROP नेस्टेड जेएसओएन ऑब्जेक्ट्स – क्या मुझे हर चीज के लिए एरेज़ का प्रयोग करना पड़ता है? डुप्लिकेट कुंजी पर MySQL – अंतिम प्रविष्टि आईडी? 'गोटो' क्या यह बुरा है? जवाक के साथ आंतरिक सूर्य वर्गों का उपयोग करना कोई पंक्ति नहीं लौटाने का चयन एसक्यूएल स्टेटमेंट के लिए निष्पादन नैनो मोंडास के साथ जुड़ें () के बजाय बाइंड () परियोजना का कार्य> ग्रहण में स्वच्छ क्या मैं jQuery के तत्वों पर बाध्य होने वाली घटनाओं को ढूंढ सकता हूं? क्या मैं एक एंड्रॉइड डिवाइस की एलईडी तीव्रता बदल सकता हूँ?

मैं एक स्ट्रिंग को एक गुप्त के रूप में कैसे रूपांतरित कर सकता हूं

मैं स्ट्रिंग को गुप्त में कनवर्ट करना चाहता हूं

public void generateCode(String keyStr){ KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128); // 192 and 256 bits may not be available // Generate the secret key specs. secretKey skey=keyStr; //How can I make the casting here //SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); } 

मैं secretkey की जगह BASE64Decoder का उपयोग करने की कोशिश करता हूं, लेकिन मुझे एक समस्या का सामना करना पड़ता है जो कि मैं कुंजी लंबाई निर्दिष्ट नहीं कर सकता।

संपादित करें: मैं इस फ़ंक्शन को किसी अन्य स्थान से कॉल करना चाहता हूं

  static public String encrypt(String message , String key , int keyLength) throws Exception { // Get the KeyGenerator KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(keyLength); // 192 and 256 bits may not be available // Generate the secret key specs. SecretKey skey = key; //here is the error byte[] raw = skey.getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); // Instantiate the cipher Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); System.out.println("msg is" + message + "\n raw is" + raw); byte[] encrypted = cipher.doFinal(message.getBytes()); String cryptedValue = new String(encrypted); System.out.println("encrypted string: " + cryptedValue); return cryptedValue; } 

अगर कोई मदद कर सकता है, तो मैं बहुत आभारी रहूंगा।

Solutions Collecting From Web of "मैं एक स्ट्रिंग को एक गुप्त के रूप में कैसे रूपांतरित कर सकता हूं"

इन विशेष कारणों के लिए कोई अखंडता जांच नहीं

  1. उपयोग के मामले से इसकी आवश्यकता स्पष्ट नहीं है।
  2. "AES/GCM/NoPadding" मोड केवल जावा 7 से ही उपलब्ध है
  3. यह उपयोगकर्ता पर निर्भर करता है अगर वे जैसे एचएमएसी और / या एईएससीएमएसी (अनुशंसित) तैनात करना चाहते हैं।
  4. इसे कम से कम एक अतिरिक्त कुंजी की आवश्यकता होगी, और दो पूर्ण पास

यदि आपको दोनों पक्षों में जीसीएम मोड का कार्यान्वयन मिला है – उदाहरण के लिए जावा 6 पर उछाल वाले कैसल का उपयोग करना – कृपया इसके लिए जाएं, क्योंकि यह अधिक सुरक्षित है (जब तक "IV" वास्तव में अनूठा है)। कार्यान्वयन को बदलने में वास्तव में आसान होना चाहिए

एन्क्रिप्शन के बारे में कार्यान्वयन नोट

  1. पैडिंग ऑरेकल हमलों के कारण एक अप्रतिबंधित क्लाइंट / सर्वर भूमिका में उपयोग किए जाने पर यह कार्यान्वयन सुरक्षित नहीं है (उन्हें 128 बाइट या निम्न की कोशिश करता है, औसत पर, एल्गोरिथ्म या कुंजी आकार से स्वतंत्र)। आपको एन्क्रिप्टेड डेटा पर मैक, एचएमएसी या हस्ताक्षर का उपयोग करने की आवश्यकता होगी, और क्लाइंट / सर्वर मोड में इसे लागू करने के डिक्रिप्ट करने से पहले इसे सत्यापित करें।
  2. डिक्रिप्पेशन विफल हो जाने पर डिक्रिप्ट रिकवर लौटाएगा। यह केवल एक पैडिंग अपवाद इंगित कर सकता है, जिसे पर्याप्त रूप से संभाला जाना चाहिए (क्या मैंने ओडीकल आक्रमणों के बारे में चेतावनी दी थी?)
  3. अमान्य कुंजी को InvalidArgumentException रूप में वापस किया जाएगा।
  4. अन्य सभी सुरक्षा संबंधित अपवाद "तालिका के नीचे बह" हैं क्योंकि इसका मतलब है कि जावा रनटाइम वातावरण अवैध है उदाहरण के लिए, प्रत्येक जावा एसई कार्यान्वयन के लिए "UTF-8" और "AES/CBC/PKCS5Padding" का समर्थन आवश्यक है।

कुछ अन्य नोट

  1. कृपया विपरीत की कोशिश न करें और बाइट को सीधे एन्क्रिप्ट पद्धति के इनपुट स्ट्रिंग में डालें new String(byte[]) उदाहरण के लिए new String(byte[]) का उपयोग करें। विधि चुपचाप विफल हो सकती है!
  2. पठनीयता के लिए अनुकूलित। यदि आप गति और बेहतर स्मृति पदचिह्न पसंद करते हैं तो Base64 स्ट्रीम और CipherStream धारा लागू करने के लिए जाएं।
  3. आपको कम से कम जावा 6 एसई या इस कोड को चलाने के लिए संगत की आवश्यकता है।
  4. एन्क्रिप्शन / डिक्रिप्शन 128 बिट से अधिक एईएस कुंजी आकार के लिए असफल हो सकता है क्योंकि आपको अप्रतिबंधित एन्क्रिप्शन के लिए नीति फ़ाइलों की आवश्यकता हो सकती है (ओरेकल से उपलब्ध है)
  5. एन्क्रिप्शन निर्यात करते समय सरकारी नियमों से सावधान रहें
  6. यह कार्यान्वयन बेस64 कुंजियों के बजाय हेक्स कुंजियों का उपयोग करता है क्योंकि वे छोटे होते हैं, और हेक्स मैन्युअल रूप से संपादित / सत्यापित करना आसान है।
  7. जेडीके से प्राप्त हेक्स और बेस 64 एन्कोडिंग / डिकोडिंग, कोई भी बाहरी पुस्तकालयों को जरूरी नहीं था।
  8. उबेर का उपयोग करने के लिए सरल है, लेकिन निश्चित रूप से उन्मुख वस्तु नहीं है, एन्क्रिप्ट / डिक्रिप्ट में उपयोग किए जाने वाले ऑब्जेक्ट इंस्टेंसेस का कैशिंग नहीं। रिफैक्टर पर होगा

ठीक है, यहाँ कुछ कोड आता है …

  public static String encrypt(final String plainMessage, final String symKeyHex) { final byte[] symKeyData = DatatypeConverter.parseHexBinary(symKeyHex); final byte[] encodedMessage = plainMessage.getBytes(Charset .forName("UTF-8")); try { final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); final int blockSize = cipher.getBlockSize(); // create the key final SecretKeySpec symKey = new SecretKeySpec(symKeyData, "AES"); // generate random IV using block size (possibly create a method for // this) final byte[] ivData = new byte[blockSize]; final SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG"); rnd.nextBytes(ivData); final IvParameterSpec iv = new IvParameterSpec(ivData); cipher.init(Cipher.ENCRYPT_MODE, symKey, iv); final byte[] encryptedMessage = cipher.doFinal(encodedMessage); // concatenate IV and encrypted message final byte[] ivAndEncryptedMessage = new byte[ivData.length + encryptedMessage.length]; System.arraycopy(ivData, 0, ivAndEncryptedMessage, 0, blockSize); System.arraycopy(encryptedMessage, 0, ivAndEncryptedMessage, blockSize, encryptedMessage.length); final String ivAndEncryptedMessageBase64 = DatatypeConverter .printBase64Binary(ivAndEncryptedMessage); return ivAndEncryptedMessageBase64; } catch (InvalidKeyException e) { throw new IllegalArgumentException( "key argument does not contain a valid AES key"); } catch (GeneralSecurityException e) { throw new IllegalStateException( "Unexpected exception during encryption", e); } } public static String decrypt(final String ivAndEncryptedMessageBase64, final String symKeyHex) { final byte[] symKeyData = DatatypeConverter.parseHexBinary(symKeyHex); final byte[] ivAndEncryptedMessage = DatatypeConverter .parseBase64Binary(ivAndEncryptedMessageBase64); try { final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); final int blockSize = cipher.getBlockSize(); // create the key final SecretKeySpec symKey = new SecretKeySpec(symKeyData, "AES"); // retrieve random IV from start of the received message final byte[] ivData = new byte[blockSize]; System.arraycopy(ivAndEncryptedMessage, 0, ivData, 0, blockSize); final IvParameterSpec iv = new IvParameterSpec(ivData); // retrieve the encrypted message itself final byte[] encryptedMessage = new byte[ivAndEncryptedMessage.length - blockSize]; System.arraycopy(ivAndEncryptedMessage, blockSize, encryptedMessage, 0, encryptedMessage.length); cipher.init(Cipher.DECRYPT_MODE, symKey, iv); final byte[] encodedMessage = cipher.doFinal(encryptedMessage); // concatenate IV and encrypted message final String message = new String(encodedMessage, Charset.forName("UTF-8")); return message; } catch (InvalidKeyException e) { throw new IllegalArgumentException( "key argument does not contain a valid AES key"); } catch (BadPaddingException e) { // you'd better know about padding oracle attacks return null; } catch (GeneralSecurityException e) { throw new IllegalStateException( "Unexpected exception during decryption", e); } } 

उपयोग:

  String plain = "Zaphod's just zis guy, ya knöw?"; String encrypted = encrypt(plain, "000102030405060708090A0B0C0D0E0F"); System.out.println(encrypted); String decrypted = decrypt(encrypted, "000102030405060708090A0B0C0D0E0F"); if (decrypted != null && decrypted.equals(plain)) { System.out.println("Hey! " + decrypted); } else { System.out.println("Bummer!"); } 

डेटाटाइज कनवर्टर के बजाय Base64 Util वर्ग का उपयोग करते हुए संस्करण यहाँ है

 public static String encrypt(final String plainMessage, final String symKeyHex) { final byte[] symKeyData = Base64.decode(symKeyHex,Base64.DEFAULT); final byte[] encodedMessage = plainMessage.getBytes(Charset .forName("UTF-8")); try { final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); final int blockSize = cipher.getBlockSize(); // create the key final SecretKeySpec symKey = new SecretKeySpec(symKeyData, "AES"); // generate random IV using block size (possibly create a method for // this) final byte[] ivData = new byte[blockSize]; final SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG"); rnd.nextBytes(ivData); final IvParameterSpec iv = new IvParameterSpec(ivData); cipher.init(Cipher.ENCRYPT_MODE, symKey, iv); final byte[] encryptedMessage = cipher.doFinal(encodedMessage); // concatenate IV and encrypted message final byte[] ivAndEncryptedMessage = new byte[ivData.length + encryptedMessage.length]; System.arraycopy(ivData, 0, ivAndEncryptedMessage, 0, blockSize); System.arraycopy(encryptedMessage, 0, ivAndEncryptedMessage, blockSize, encryptedMessage.length); final String ivAndEncryptedMessageBase64 = Base64.encodeToString(ivAndEncryptedMessage,Base64.DEFAULT); return ivAndEncryptedMessageBase64; } catch (InvalidKeyException e) { throw new IllegalArgumentException( "key argument does not contain a valid AES key"); } catch (GeneralSecurityException e) { throw new IllegalStateException( "Unexpected exception during encryption", e); } } public static String decrypt(final String ivAndEncryptedMessageBase64, final String symKeyHex) { final byte[] symKeyData = Base64.decode((symKeyHex),Base64.DEFAULT); final byte[] ivAndEncryptedMessage = Base64.decode(ivAndEncryptedMessageBase64,Base64.DEFAULT); try { final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); final int blockSize = cipher.getBlockSize(); // create the key final SecretKeySpec symKey = new SecretKeySpec(symKeyData, "AES"); // retrieve random IV from start of the received message final byte[] ivData = new byte[blockSize]; System.arraycopy(ivAndEncryptedMessage, 0, ivData, 0, blockSize); final IvParameterSpec iv = new IvParameterSpec(ivData); // retrieve the encrypted message itself final byte[] encryptedMessage = new byte[ivAndEncryptedMessage.length - blockSize]; System.arraycopy(ivAndEncryptedMessage, blockSize, encryptedMessage, 0, encryptedMessage.length); cipher.init(Cipher.DECRYPT_MODE, symKey, iv); final byte[] encodedMessage = cipher.doFinal(encryptedMessage); // concatenate IV and encrypted message final String message = new String(encodedMessage, Charset.forName("UTF-8")); return message; } catch (InvalidKeyException e) { throw new IllegalArgumentException( "key argument does not contain a valid AES key"); } catch (BadPaddingException e) { // you'd better know about padding oracle attacks return null; } catch (GeneralSecurityException e) { throw new IllegalStateException( "Unexpected exception during decryption", e); } } 

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