2011-01-08 17 views
1

私は、モバイルプラットフォーム用のJavaでアプリケーションを開発しています。このプログラムは、モバイルアプリケーションが使用するオンラインデータベースのパスワードを暗号化するWindows C#アプリケーションのデータを使用します。AES Java暗号化

モバイルアプリケーションはデータベースに接続し、暗号化された文字列をデータベースから取得して復号化する必要があります。

私は復号化が正常に動作してい

復号化は絶対にうまく動作し、次のコードに

public String decrypt(String encryptedPassword) 
    { 
     String plainPassword = ""; 
     try 
     { 
      SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES"); 

      IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US_ASCII")); 

      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 

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

      byte[] encoded = cipher.doFinal(Base64.decodeBase64(encryptedPassword.getBytes())); 
      plainPassword = new String(encoded); 
     } 
     catch (Exception ex) 
     { 
      Log.d("Decryption Error", ex.toString()); 
     } 

     return plainPassword; 
    } 

を使用して私は、暗号化するための復号から同じコードを使用しますが暗号化するために復号化から暗号モードを変更しました。しかし、暗号化されたパスワードをコンソールに出力すると、データベースに格納される文字列と類似していないゴミが印刷されます。あなたがそう

byte[] encoded = cipher.doFinal(Base64.decodeBase64(encryptedPassword.getBytes())); 

を呼び出している

私は、暗号化を行うために、次のコードを使用している

public String encrypt(String plainPasword) 
    { 
     String password = ""; 
     try 
     { 
      SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES"); 

      IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US_ASCII")); 

      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 

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

      byte[] encoded = cipher.doFinal(plainPasword.getBytes()); 
      password = new String(encoded); 


     } 
     catch (Exception ex) 
     { 
      Log.d("Encryption Error", ex.toString()); 
     } 
     return password; 
    } 

おかげで任意の助けのためにあなたは私の復号化機能で

+1

なぜパスワードを暗号化していますか?してください、塩漬けされたパスワードのハッシュを使用してください.. – Axarydax

答えて

2

を与えることができますASCIIバイトをBase64バイトに変換してから解読しています。あなたが実際にエンコーディングを指定せずにあなたはまた、バイト[]配列から)(新しい文字列を作成しているだけ

byte[] encoded = cipher.doFinal(plainPasword.getBytes()); 

を呼び出すとき

は、あなたが、逆に同じことをしないだろう、それは、プラットフォームのデフォルトのエンコーディングを使用していますASCIIではありません。それも物事を壊すかもしれない。

cipher.doFinal()によって返されたバイトが、あわただしいと思われる場合は、期待されるデータと似ていませんか?

+0

それに私を打つ!同じことを言うつもりだった:) 私はまた、なぜOPがこれを自分でやっているのかと聞く。あなたが本当にメモリが制約されていない限り、このような定型コードをすべて扱っている良いライブラリがあります。 – AngerClown

+0

私はここで何か愚かなことをしているかもしれないと感じているが、それは行く。あなたが言った行をbyte [] encoded = cipher.doFinal(Base64.encodeBase64(plainPasword.getBytes()))に変更しました。 c#が作成するものに似ていない、まだ出力されているゴミである – Boardy

+0

あなたの復号化がstring-> stringからbytes-> decodeBase64-> decryptのようになるならば、あなたの暗号化は厳密に逆でなければなりません:encrypt bytes-> encodeBase64->バイトからの文字列 – Axarydax