2012-07-26 15 views
7

मैं पीबीई एन्क्रिप्शन/डिक्रिप्शन का परीक्षण करने की कोशिश कर रहा हूं। मैंने पाया कि पीबीई विभिन्न नमक और पुनरावृत्ति गणना के साथ एक ही कुंजी उत्पन्न करता है। बेशक, इस्तेमाल किया पासवर्ड एक ही है। जैसा कि मैं समझता हूं, वही पासवर्ड और अलग नमक/पुनरावृत्ति को अलग-अलग कुंजी मिलनी चाहिए।क्यों पीबीई विभिन्न नमक और पुनरावृत्ति गणना के साथ एक ही कुंजी उत्पन्न करता है?

import java.security.Key; 
import java.security.SecureRandom; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.PBEKeySpec; 

public class PBETest 
{ 
    public static void main(String[] args) 
     throws Exception 
    { 
     String algo = "PBEWithSHA1andDESede"; 
     System.out.println("====== " + algo + " ======"); 

     char[] password = "password".toCharArray(); 
     SecureRandom rand = new SecureRandom(); 
     byte[] salt = new byte[32]; 
     rand.nextBytes(salt); 
     int iterationCount = rand.nextInt(2048); 

     //encryption key 
     PBEKeySpec   encPBESpec = new PBEKeySpec(password, salt, iterationCount); 
     SecretKeyFactory encKeyFact = SecretKeyFactory.getInstance(algo); 
     Key encKey = encKeyFact.generateSecret(encPBESpec); 
     System.out.println("encryptioin iteration: " + iterationCount); 

     //decryption key 
     rand.nextBytes(salt); 
     iterationCount = rand.nextInt(2048); 
     PBEKeySpec   decPBESpec = new PBEKeySpec(password, salt, iterationCount); 
     SecretKeyFactory decKeyFact = SecretKeyFactory.getInstance(algo); 
     Key decKey = decKeyFact.generateSecret(decPBESpec); 
     System.out.println("decryptioin iteration: " + iterationCount); 

     System.out.println("encryption key is same as decryption key? " + encKey.equals(decKey)); 

    } 

} 

मैं अंतिम उत्पादन की उम्मीद कर रहा हूँ एक false है: नीचे अपने परीक्षण कोड है। क्या मैंने कुछ गलत किया?

उत्तर

4

आपको शानदार भाग्यशाली मिला, और आपके यादृच्छिक नमक और पुनरावृत्ति की गणना सिर्फ मैच के साथ हुई। सीधे लास वेगास जाओ। अभी व। ;)

मैं PBEWithSHA1andDESede लिए googled और इस उदाहरण नीचे ट्रैक किया गया: http://cryptofreek.org/2010/06/04/encrypting-and-decrypting-files-with-java जिसमें उन्होंने new PBEKeySpec(password) के साथ अकेले कुंजी निर्दिष्ट करता है और नमक और पुनरावृत्ति संख्या जो तब Cipher.init में भेजा जाता है() का उपयोग कर एक अलग PBEParameterSpec पैदा करता है।

तो, नहीं, आपने कुछ भी गलत नहीं किया है, आपने नमक से पहले ही बंद कर दिया है और गिनती में गिना जाता है।

+0

आपके उत्तर के लिए धन्यवाद tbroberg। 1, "लवण और पुनरावृत्ति गणना सिर्फ मैच के लिए हुई"। नमक और पुनरावृत्ति गणना यादृच्छिक रूप से उत्पन्न होती है, और मुझे नहीं लगता कि वे इस परीक्षण पर प्रत्येक रन के लिए मिलान कर सकते हैं। 2, "आपने नमक से पहले ही बंद कर दिया और गिनती को सिफर में भर दिया"। क्या आपका मतलब है कि एन्क्रिप्शन/डिक्रिप्शन प्रदर्शन करते समय नमक और पुनरावृत्ति गणना केवल प्रभावी होती है? 3, मैंने पाया कि चाबियाँ हमेशा "70 61 73 73 77 6 एफ 72 64" होती हैं। मुझे लगता है कि यह "पासवर्ड" के लिए है, और यह नमक या पुनरावृत्ति गिनती से संबंधित नहीं है। क्या यह सही परिणाम है? – Michael

+0

# 2 और # 3 स्थिति की व्याख्या करते हैं। मैंने कुछ पाठ एन्क्रिप्ट करने के लिए आगे बढ़ने की कोशिश की, और एन्क्रिप्टेड डेटा हर बार अलग होता है। तो मेरा निष्कर्ष अब है: SecretKeyFactory.generateSecret() द्वारा उत्पन्न कुंजी केवल पासवर्ड से संबंधित है। कम से कम तुलना के दृष्टिकोण से यह सच है, यानी key.getEncoded() समान है। सादे पाठ को एन्क्रिप्ट करते समय नमक और पुनरावृत्ति गणना प्रभावी होती है। आपकी सहायता के लिए एक बार फिर से धन्यवाद! – Michael

+0

बढ़िया! (# 1 एक मजाक था।) यदि आपको उत्तर उपयोगी लगता है, तो कृपया इसे चिह्नित करें। : ^) – tbroberg

3

यदि आप का उपयोग PBEWithSHA1andDESede के बजाय करते हैं तो आपकी धारणा काम करता है क्योंकि यह नमक का समर्थन करता है। तुम बस PBEKeySpec करने के लिए एक keyLength पैरामीटर जोड़ना:

 String algo = "PBKDF2WithHmacSHA1"; 

...

 PBEKeySpec decPBESpec = new PBEKeySpec(password, salt, iterationCount, 128); 

मैं एक परीक्षण चलाने की है और परिणाम है: false

हालांकि, ध्यान दें कि एन्क्रिप्शन और डिक्रिप्शन के लिए सही तरीके से काम करने के लिए आपको कुंजी उत्पन्न करते समय उसी नमक और पुनरावृत्ति गणना का उपयोग करने की आवश्यकता है।

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

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