2011-10-12 1 views
0

J'essaye de convertir le code suivant de C# en Java, mais j'obtiens différentes valeurs de résultat de clés. Voici mes codes:C# Code de cryptage porté vers Java

C#:

 plainText = "Hello World"; 
     passPhrase = "IhDyHz6bgQyS0Ff1/1s="; 
     saltValue = "0A0Qvv09OXd3GsYHVrA="; 
     hashAlgorithm = "SHA1"; 
     passwordIterations = 3; 
     initVector = "GjrlRZ6INgNckBqv"; 
     keySize = 256; 

     byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector); 
     byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue); 

     byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); 

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

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

Java

 byte[] password = PassPhrase.getBytes("ASCII"); 
     byte[] salt = PKCS5S1ParametersGenerator.PKCS5PasswordToBytes(SaltValue.toCharArray()); 

     PKCS5S1ParametersGenerator generator = new PasswordDeriveBytes(new SHA1Digest()); 
     generator.init(password, salt, PasswordIterations); 

     byte[] key = ((KeyParameter)generator.generateDerivedParameters(32)).getKey(); 

Le problème est que je reçois des clés différentes, même avec les mêmes paramètres fournis sur les deux codes: (seulement le premier 4 octets correspond)

REMARQUE:ces valeurs ont été converties en base64:

C#: GWR/loJAuuiPvP0cuGGCVXErz16HjOZ7yQkCCHfBux4 = Java: GWR/4oCT

Si je continue à jouer avec le nombre prévu à generateDerivedParameters (32), il ne me donne que plus d'octets mais ne correspond toujours pas au résultat de .Net.

Je ne peux pas changer le code .Net, donc s'il vous plaît, toute suggestion doit être faite du côté Java.

Merci d'avance.

Répondre

1

La méthode generateDerivedParameters indique: "keySize la taille de la clé que nous voulons (en bits)". Donc, vous devez utiliser generateDerivedParameters(32 * 8)

+0

Merci pour la clarification, mais ne correspond pas à la clé C#, ceci est le résultat: GWR/4oCT4oCaQMK6w6jvv73CvMO9HMK4YeKAmlVxK8OPXuKAocWSw6Z7w4kJAgh3w4HCux4 = – lidermin

+0

On dirait une norme différente (sic!) De base64 est utilisé alphabet différent. Pourriez-vous comparer les octets, les valeurs binaires pour vérifier si c'est pareil? – kan

+0

OMG vous avez tout à fait raison, même si j'ai beaucoup testé la conversion de la méthode Base64 Java contre son semblable en C#, cette fois j'ai été stupide par cela, en regardant les octets, ils sont en fait les mêmes. – lidermin