2011-01-08 138 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; 
    } 

解密工作絕對沒問題,所以我已經使用了相同的代碼從解密的加密但從解密更改加密模式來加密。但是,當我向控制檯輸出加密的密碼時,它會打印出一堆垃圾,它顯示應該存儲在數據庫中的字符串不相似。

我用下面的代碼,以便做加密

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 2011-01-08 19:30:39

回答

2

在解密功能,您呼叫

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

所以您將ASCII字節轉換爲Base64字節,然後解密它們。

你會不會做同樣以相反的,當你真正調用只

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

您還創建從byte []數組新的String()沒有指定編碼,使用平臺的默認編碼,不是ASCII。這可能會破壞一些東西。

如果你看看cipher.doFinal()返回的字節應該是亂碼,那麼它們與預期的數據沒有任何相似之處嗎?

+0

打我吧!只是要說同樣的事情:) 我也會問,爲什麼OP自己做這件事。除非你真的受到內存限制,否則有一些好的庫已經爲你處理了所有的樣板代碼。 – AngerClown 2011-01-08 19:43:08