मैं पीबीई एन्क्रिप्शन/डिक्रिप्शन का परीक्षण करने की कोशिश कर रहा हूं। मैंने पाया कि पीबीई विभिन्न नमक और पुनरावृत्ति गणना के साथ एक ही कुंजी उत्पन्न करता है। बेशक, इस्तेमाल किया पासवर्ड एक ही है। जैसा कि मैं समझता हूं, वही पासवर्ड और अलग नमक/पुनरावृत्ति को अलग-अलग कुंजी मिलनी चाहिए।क्यों पीबीई विभिन्न नमक और पुनरावृत्ति गणना के साथ एक ही कुंजी उत्पन्न करता है?
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
है: नीचे अपने परीक्षण कोड है। क्या मैंने कुछ गलत किया?
आपके उत्तर के लिए धन्यवाद tbroberg। 1, "लवण और पुनरावृत्ति गणना सिर्फ मैच के लिए हुई"। नमक और पुनरावृत्ति गणना यादृच्छिक रूप से उत्पन्न होती है, और मुझे नहीं लगता कि वे इस परीक्षण पर प्रत्येक रन के लिए मिलान कर सकते हैं। 2, "आपने नमक से पहले ही बंद कर दिया और गिनती को सिफर में भर दिया"। क्या आपका मतलब है कि एन्क्रिप्शन/डिक्रिप्शन प्रदर्शन करते समय नमक और पुनरावृत्ति गणना केवल प्रभावी होती है? 3, मैंने पाया कि चाबियाँ हमेशा "70 61 73 73 77 6 एफ 72 64" होती हैं। मुझे लगता है कि यह "पासवर्ड" के लिए है, और यह नमक या पुनरावृत्ति गिनती से संबंधित नहीं है। क्या यह सही परिणाम है? – Michael
# 2 और # 3 स्थिति की व्याख्या करते हैं। मैंने कुछ पाठ एन्क्रिप्ट करने के लिए आगे बढ़ने की कोशिश की, और एन्क्रिप्टेड डेटा हर बार अलग होता है। तो मेरा निष्कर्ष अब है: SecretKeyFactory.generateSecret() द्वारा उत्पन्न कुंजी केवल पासवर्ड से संबंधित है। कम से कम तुलना के दृष्टिकोण से यह सच है, यानी key.getEncoded() समान है। सादे पाठ को एन्क्रिप्ट करते समय नमक और पुनरावृत्ति गणना प्रभावी होती है। आपकी सहायता के लिए एक बार फिर से धन्यवाद! – Michael
बढ़िया! (# 1 एक मजाक था।) यदि आपको उत्तर उपयोगी लगता है, तो कृपया इसे चिह्नित करें। : ^) – tbroberg