2011-01-07 6 views
0

Ich entwickle derzeit eine Windows-Anwendung mit C# und entwickle eine mobile App mit Java.IVParameter Spec Problem in Java

Die Windows-Software und die mobile App arbeiten zusammen, die Windows-App speichert Informationen und verschlüsselt bestimmte Informationen, bevor sie in einer Online-Datenbank gespeichert werden.

Die mobile App ruft die Informationen aus der Online-Datenbank ab und muss die verschlüsselte Zeichenfolge entschlüsseln, die aus der Datenbank abgerufen wird.

Die Verschlüsselungsmethode I in C# bin mit unter

 byte[] clearTextBytes = Encoding.UTF8.GetBytes(encryptionString); 

     SymmetricAlgorithm rijn = SymmetricAlgorithm.Create(); 

     MemoryStream ms = new MemoryStream(); 
     byte[] rgbIV = Encoding.ASCII.GetBytes("ryojvlzmdalyglrj"); 

     byte[] key = Encoding.ASCII.GetBytes("hcxilkqbbhczfeultgbskdmaunivmfuo"); 
     CryptoStream cs = new CryptoStream(ms, rijn.CreateEncryptor(key, rgbIV), CryptoStreamMode.Write); 

     cs.Write(clearTextBytes, 0, clearTextBytes.Length); 

     cs.Close(); 

     return Convert.ToBase64String(ms.ToArray()); 

Die Windows-Methode funktioniert gut.

Der Code, den ich in Java verwende ist wie folgt:

KeySpec ks = new DESKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("UTF-8")); 
      SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(ks); 

     String ivString = "ryojvlzmdalyglrj"; 
     byte[] ivByte = ivString.getBytes("UTF-8"); 
     IvParameterSpec iv = new IvParameterSpec(ivByte); 
     //RC5ParameterSpec iv = new RC5ParameterSpec(ivByte); 

     Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 

     cipher.init(Cipher.ENCRYPT_MODE, key, iv); 

     byte[] encoded = cipher.doFinal(Base64.decodeBase64("iNtaFme3B/e6DppNSp9QLg==")); 

     Log.d("Decoded Password", encoded.toString()); 

Da beide Methoden die gleiche Zeichenfolge verschlüsseln und entschlüsseln müssen zusammen den gleichen Schlüssel und IV verwenden hat. Das einzige Problem, das ich habe, ist in der Java-Methode der IVParameterSpec in den Catch mit einem Fehler, der besagt, IV muss 8 Bytes lang sein.

Wie kann ich dies beheben, um sicherzustellen, dass ich die gleiche IV wie C# habe.

Danke für die Hilfe

Antwort

0

Sie haben den gleichen Algorithmus natürlich verwenden. Der Standardalgorithmus für .NET ist AES, also sollten Sie auch auf der Java-Seite verwenden.

1

Das Problem ist, dass Sie verschlüsseln (in C#) mit AES (auch bekannt als Rjindael), aber versuchen, in Java mit DES zu entschlüsseln. Wenn Sie Ihren Java-Code ändern, um AES zu verwenden, sollte alles gut funktionieren.

DES verwendet ein 8-Byte-IV, da es auf 64-Bit-Blöcken funktioniert. AES verwendet eine 16-Byte-IV, da es auf 128-Bit-Blöcken funktioniert.

Sie sollten auch sicherstellen, dass Sie die gleiche Zeichencodierung verwenden. In C# verwenden Sie ASCII, aber in Java verwenden Sie UTF-8. In Ihrem Fall werden sie gleich sein, aber Sie sollten es jetzt wirklich beheben, um in Zukunft seltsame Fehler zu vermeiden. Sie können den Zeichensatznamen in Java in "US-ASCII" ändern und es wird funktionieren.

+0

Hallo danke für die Hilfe. Wenn ich den ersten SecretKey-Schlüssel = SecretKeyFactory.getInstance ("DES) .... ändere und den DES durch AES ersetze, kommt es zu einem Fehler, der sagt, dass SecretKeyFactory AES-Implementierung nicht gefunden wird – Boardy

+0

Ich empfehle die Verwendung der BouncyCastle (http: // (http://www.bouncycastle.org) Leichtgewichtige API anstelle der Java JCE. JCE ist voll von Problemen wie dieser. –

+0

Verwenden Sie stattdessen eine SecretKeySpec. Aber ich stimme @Cameron Skinner zu. –