2016-11-16 154 views
0

我只想问一下。Eclipse:Android上的AES加密和解密密钥

我在eclipse上有android的AES加密短信应用程序,但我有一个问题。

问题是,当我把关键字少于16个字符,消息不能被加密。但如果密钥是16个字符,则可以加密该消息。

我想插入密钥,无论金额多少。密钥可以生成为16个字符,以获得128位。那么,代码应该如何解决这个问题呢?

在此先感谢 - 我希望你能帮助我。

public class AES { 
    public static String encrypt(String message, String key){ 
     try { 
      SecretKeySpec KS = new SecretKeySpec(key.getBytes(), "AES"); 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, KS); 
      byte[] encrypted = cipher.doFinal(message.getBytes());  
      return Base64.encodeToString(encrypted, Base64.NO_PADDING); 
     } catch (Exception e) { 
      return "ERROR:"+e.getMessage(); 
     } 
    } 

    public static String decrypt(String chiperText, String key){ 
     try { 

      SecretKeySpec KS = new SecretKeySpec(key.getBytes(), "AES"); 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      cipher.init(Cipher.DECRYPT_MODE, KS); 
      byte[] decrypted = cipher.doFinal(Base64.decode(chiperText, Base64.NO_PADDING)); 
      return new String(decrypted); 
     } catch (Exception e) { 
      return "ERROR"; 
     } 
    } 

回答

1

您的代码不安全,因为您通过password.getBytes()直接使用密码作为密钥。

永远不要做这个!

使用像PBKDF2一样的基于密码生成密钥的适当密钥导出函数。相同的密码和相同的PBKDF2参数将以相同的密钥结束。

欲了解更多详情,请阅读例如本博文:Using Password-based Encryption on Android

+0

我解决了我的关键代码问题。 我尝试在没有Google API的情况下在AVD上运行应用程序,所有功能都运行良好。 但是,如果我使用Google API在AVD上运行应用程序或在Android手机上安装。加密文本无法正确解密。 如何解决这个问题? –

+0

GoogleAPI对AES加密/解密没有影响。可能是使用的Android版本对您没有发布的代码派对有影响。下一次你应该发布一个完整的工作示例,包括样本加密/解密数据和密钥。 – Robert

+0

谢谢你的答案。 仅在兼容性方面存在问题。 :d –