2011-01-27 39 views
0

我想加密/解密我的應用程序的SQLite數據庫中的一些密碼。要做到這一點,我已經在互聯網上搜索,並找到了AES算法。 我有這樣的代碼:android加密

public String encript(String dataToEncrypt) 
     throws NoSuchAlgorithmException, NoSuchPaddingException, 
     InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 
    // I'm using AES encription 

    if(!dataToEncrypt.equals("")){ 
     String key = "FMVWf8d_sm#fz"; 

     Cipher c = Cipher.getInstance("AES"); 
     SecretKeySpec k; 
     try { 
      k = new SecretKeySpec(key.getBytes(), "AES"); 
      c.init(Cipher.ENCRYPT_MODE, k); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 


     return new String(c.doFinal(Base64.decode(dataToEncrypt))); 
    } 
    return ""; 
} 

public String decript(String encryptedData) 
     throws NoSuchAlgorithmException, NoSuchPaddingException, 
     InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 

    if(!encryptedData.equals("")){ 
     String key = "FMVWf8d_sm#fz"; 

     Cipher c = Cipher.getInstance("AES"); 
     SecretKeySpec k = new SecretKeySpec(Base64.decode(key), "AES"); 
     c.init(Cipher.DECRYPT_MODE, k); 
     return new String(c.doFinal(Base64.decode(encryptedData))); 
    } 
    return ""; 
} 

運行此之後我得到加密方法此錯誤:

01-27 14:50:51.698:ERROR /活動(782): java.security .InvalidKeyException:密鑰長度不是128/192/256位。

我在這裏看到了一些其他情況下的計算器,但我想給的關鍵AES不產生它...

有人可以幫我嗎?如果有其他加密方法可以使用,但不使用其他罐子或外部類並讓我給出密鑰。

非常感謝!

+0

我明白這是一個非常古老的問題,但對於未來的讀者使用[這](https://github.com/ryan652/EasyCrypt/)庫作爲執行加密/解密正確可以很困難並且支持多種數據類型會增加複雜性。 – Ryan 2017-07-16 01:40:26

回答

3

錯誤消息使得它非常清楚:您的加密密鑰必須具有一定的大小:128,192或256位。而你的密鑰是104位。請注意,由於您只想在密鑰中使用可打印字符,因此密鑰的長度應該是192位或更長,導致您的字母表(您使用的字符集)會使加密功能變弱。

+0

好的,謝謝你的回答,我已經生成了另一個關鍵「xBfXhVNupuH1;!%* EL = 5O {Ga25msS」,但它也不適用於此。你能給我寫一個樣品嗎?先謝謝你! – Cata 2011-01-27 14:01:44

+4

現在是29個字符,232位。你期望什麼,給組件輸入錯誤? – 2011-01-27 14:05:03

1

通常的做法是這樣的:

  1. 獲取密碼(你的情況String key = "FMVWf8d_sm#fz";
  2. 生成使用一些散列功能鍵長度爲128,192或256
  3. 把它放進加密算法
  4. 玩得開心

所以你缺少關鍵生成階段。做水木清華這樣的:

 // Get the KeyGenerator 

     KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
     kgen.init(128); // 192 and 256 bits may not be available 


     // Generate the secret key specs. 
     SecretKey skey = kgen.generateKey(); 
     byte[] raw = skey.getEncoded(); 

     SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 


     // Instantiate the cipher 

     Cipher cipher = Cipher.getInstance("AES"); 

     cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 

     byte[] encrypted = 
     cipher.doFinal((args.length == 0 ? 
      "This is just an example" : args[0]).getBytes()); 
     System.out.println("encrypted string: " + asHex(encrypted)); 

     cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
     byte[] original = 
     cipher.doFinal(encrypted); 
     String originalString = new String(original); 
     System.out.println("Original string: " + 
     originalString + " " + asHex(original));