2010-01-22 14 views
5

एन्क्रिप्शन जावा में है:जावा एनकोड और .NET डिकोड


String salt = "DC14DBE5F917C7D03C02CD5ADB88FA41"; 
String password = "25623F17-0027-3B82-BB4B-B7DD60DCDC9B"; 

char[] passwordChars = new char[password.length()]; 
password.getChars(0,password.length(), passwordChars, 0); 

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
KeySpec spec = new PBEKeySpec(passwordChars, salt.getBytes(), 2, 256); 
SecretKey sKey = factory.generateSecret(spec); 
byte[] raw = _sKey.getEncoded(); 

String toEncrypt = "The text to be encrypted."; 

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); 
cipher.init(Cipher.ENCRYPT_MODE, skey); 

AlgorithmParameters params = cipher.getParameters(); 
byte[] initVector = params.getParameterSpec(IvParameterSpec.class).getIV(); 

byte[] encryptedBytes = cipher.doFinal(toEncrypt.getBytes()); 

जबकि डिक्रिप्शन सी # में है:


string hashAlgorithm = "SHA1"; 
int passwordIterations = 2; 
int keySize = 256; 

byte[] saltValueBytes = Encoding.ASCII.GetBytes(salt); 
byte[] cipherTextBytes = Convert.FromBase64String(cipherText); 

PasswordDeriveBytes passwordDB = new PasswordDeriveBytes(password, saltValueBytes, hashAlgorithm passwordIterations); 

byte[] keyBytes = passwordDB.GetBytes(keySize/8); 

RijndaelManaged symmetricKey = new RijndaelManaged(); 
symmetricKey.Mode = CipherMode.CBC; 
ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVector); 

MemoryStream memoryStream = new MemoryStream(cipherTextBytes); 

CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read); 

byte[] plainTextBytes = new byte[ cipherTextBytes.Length ]; 

int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); 

memoryStream.Close(); 
cryptoStream.Close(); 

string plainText = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); 

डिक्रिप्शन अपवाद के साथ विफल "पैडिंग अमान्य है और हटाया नहीं जा सकता। "

किसी भी विचार क्या समस्या हो सकती है?

उत्तर

5

यह आम तौर पर इंगित करता है कि डिक्रिप्शन नाकाम रही है। मेरा सुझाव है कि आप मुख्य पीढ़ी के कार्यों के आउटपुट की जांच करें, यह देखने के लिए कि क्या आप वास्तव में एक ही कुंजी का उपयोग कर रहे हैं। उदाहरण के लिए, मुझे पता है कि जावा कोड का तात्पर्य है कि आप SHA1- आधारित एचएमएसी का उपयोग कर रहे हैं, जबकि .NET कोड का तात्पर्य है कि आप कुंजी उत्पन्न करने के लिए एक बेकार SHA1 हैश का उपयोग कर रहे हैं।

वैकल्पिक रूप से, यह गद्दी में एक बेमेल हो सकता है। मुझे नहीं लगता कि आप स्पष्ट रूप से PaddingMode को .NET कोड में PKCS7 पर कहां सेट कर रहे हैं।

+0

उत्तर के लिए धन्यवाद। मूल रूप से, मैं इसके बारे में जावा ओर कोडिंग कर रहा हूँ, और .NET पक्ष पर कोई नियंत्रण नहीं। हालांकि, मेरे पास दोनों पक्षों का स्रोत कोड है और .NET पक्ष को डीबग करते समय, यह PKCS7 दिखाता है। मुझे लगता है कि मेरा प्रश्न होगा, मौजूदा .NET डिक्रिप्शन से मेल खाने के लिए जावा पक्ष पर मुझे क्या करना चाहिए? – Wijaya

+0

.NET में डिफ़ॉल्ट 'पैडिंग मोड' PKCS7 है, मैंने अभी जांच की है। इसलिए मुझे संदेह है कि मुख्य पीढ़ी में कोई अंतर है। 'पासवर्डडिएरबाइट्स' पीबीकेडीएफ 1 एल्गोरिदम का उपयोग करता है, जबकि आपका जावा कोड पीबीकेडीएफ 2 का उपयोग करता है। मैं जावा में उपलब्ध चीज़ों के साथ पर्याप्त रूप से परिचित नहीं हूं, लेकिन क्या आप पीबीकेडीएफ 1 का उपयोग कर सकते हैं? –

+0

हाय डेविड। आप सही हैं, चाबियाँ मेल नहीं खातीं। बाहर निकलता है BouncyCastle में एक वर्ग है जो इसके लिए बनाया गया है। org.bouncycastle.crypto.generators.PKCS5S1ParametersGenerator मैं बहुत उपयोगी इस सूत्र मिला: http://old.nabble.com/.NET-PasswordDeriveBytes-tt9114084.html#a9114084 अब यह काम करता है। अंतर्दृष्टि के लिए धन्यवाद। – Wijaya

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