2010-01-22 3 views
5

Le cryptage est en java:Java encode et decode .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()); 

Alors que le décryptage est en C#:


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); 

Le décryptage a échoué avec l'exception « Rembourrage est invalide et ne peut pas être supprimé. "

Une idée de ce qui pourrait être le problème?

Répondre

5

Ceci indique généralement que le décryptage a échoué. Je vous suggère de vérifier la sortie des fonctions de génération de clé, pour voir si vous utilisez réellement la même clé. Je remarque, par exemple, que le code Java implique que vous utilisez un HMAC basé sur SHA1, tandis que le code .NET implique que vous utilisez un hachage SHA1 non-clé pour générer la clé.

Alternativement, cela pourrait être une discordance dans le rembourrage. Je ne vois pas où vous définissez explicitement le PaddingMode à PKCS7 dans le code .NET.

+0

Merci pour la réponse. Fondamentalement, je code le côté java de celui-ci, et n'ai aucun contrôle sur le côté .NET. Cependant, j'ai le code source des deux côtés et lors du débogage du côté .NET, il montre le PKCS7. Je suppose que ma question serait, que dois-je faire du côté java pour correspondre au décryptage .NET existant? – Wijaya

+0

Le défaut PaddingMode dans .NET est PKCS7, je viens de vérifier. Donc, je soupçonne qu'il y a une différence dans la génération de clés. 'PasswordDeriveBytes' utilise l'algorithme PBKDF1, alors que votre code Java utilise PBKDF2. Je ne suis pas suffisamment familier avec ce qui est disponible en Java, mais est-il possible d'utiliser PBKDF1? –

+0

Salut David. Tu as raison, les clés ne correspondaient pas. Il s'avère que BouncyCastle a une classe construite juste pour cela. org.bouncycastle.crypto.generators.PKCS5S1ParametersGenerator J'ai trouvé ce fil très utile: http://old.nabble.com/.NET-PasswordDeriveBytes-tt9114084.html#a9114084 Il fonctionne maintenant. Merci pour la perspicacité. – Wijaya