2017-03-10 157 views
1

我想在我的Android应用程序中进行AES加密/解密。我试着像Android AES加密/解密不正确的结果

无论我怎样的方式使用解密的部分是从原始数据不同。我一直有这样的结果:

03-09 21:58:33.457 30329-30329/org.androidapp.test E/ERROR: BEFORE: sDuKOoRteaEUFtA3P0SllSTCpgKJN75FuyPLxdp/ctM= 

03-09 21:58:33.459 30329-30329/org.androidapp.test E/ERROR: AFTER: PBSqM3jHZhemw48wd44pKg== 

的什么,我现在在做一个简单的例子:

private static byte[] seedValue = { 
     0x2d, 0x2a, 0x2d, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x41, 0x43, 0x4f, 0x44, 0x45, 0x2d, 0x2a, 0x2d 
}; 
private static String ALGORITHM = "AES"; 
private static SecretKeySpec secretKey = new SecretKeySpec(seedValue, "AES"); 


public static String encrypt(String data) throws Exception { 
    try { 
     Cipher cipher = Cipher.getInstance("AES"); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
     byte[] cipherText = cipher.doFinal(data.getBytes("UTF8")); 
     String encryptedString = new String(Base64.encode(cipherText ,Base64.DEFAULT)); 
     return encryptedString; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

public static String decrypt(String data) throws Exception { 
    try { 
     Cipher cipher = Cipher.getInstance("AES"); 
     cipher.init(Cipher.DECRYPT_MODE, secretKey); 
     byte[] cipherText = Base64.decode(data.getBytes("UTF8"), Base64.DEFAULT); 
     String decryptedString = new String(cipher.doFinal(cipherText),"UTF-8"); 
     return decryptedString; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

使用这些方法(使用杰克逊的读取和写入的对象)的样品:

public static void writeSecurityInfo(String fileName, POJO pojo){ 
     try{ 
      FileUtil.verifyFile(fileName); 
      ObjectMapper mapper = new ObjectMapper(); 

      File file = new File(Environment.getExternalStorageDirectory(), fileName); 

      try { 
       pojo.setName(CryptUtils.encrypt(pojo.getName())); 
       pojo.setAddress(CryptUtils.encrypt(pojo.getAddress())); 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 

      ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter()); 
      writer.writeValue(file, securityPOJO); 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 

而对于阅读:

public static POJO readSecurityInfo(String fileName){ 
     try { 
      File file = new File(Environment.getExternalStorageDirectory(), fileName); 

      ObjectMapper mapper = new ObjectMapper(); 

      InputStream inputStream = new FileInputStream(file); 

      POJO pojo = mapper.readValue(inputStream, POJO.class); 
      Log.e("ERROR", "BEFORE: "+ pojo.getName()); 
      securityPOJO.setName(CryptUtils.decrypt(pojo.getName())); 
      Log.e("ERROR", "AFTER: "+ pojo.getName()); 
      pojo.setAddress(CryptUtils.decrypt(pojo.getAddress())); 

      return pojo; 

     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 

没有成功。 使用AES时我做错了什么?

+0

请[编辑]你的问题包括[MCVE](添加在您调用'encrypt'和'decrypt'的代码)。 –

+0

我的猜测是你缺少一些填充。看看这个: http://stackoverflow.com/questions/15554296/simple-java-aes-encrypt-decrypt-example –

+0

@CountTCyber​​SecurityLtd我试着你提供的解决方案,并改变了我的代码插入密码AES/CBC/PKCS5PADDING。非常相同的结果。 – learner

回答

0

我的加密和解密方法没有看到任何错误。我用简单的文字进行了测试:

try { 
     String test = encrypt("My name is Nam"); 
     Log.e("TEST", "xxxx encrypted: "+ test); 
     Log.e("TEST", "xxxx decrypted: "+ decrypt(test)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

,结果是正确的:

十一月3日至10日:12:38.987 31251-31251 /? E/TEST:xxxx加密: bR80WEK9pa3eicMjCZCtQg == 03-10 11:12:38.987 31251-31251 /? E/TEST:XXXX 解密:我的名字是南

所以,也许你写的日志是不正确的:

Log.e("ERROR", "AFTER: "+ pojo.getName()); 

应该是:

Log.e("ERROR", "AFTER: "+ securityPOJO.getName()); 

Log.e("ERROR", "AFTER: "+ CryptUtils.decrypt(pojo.getName())); 

注:我写了一个关于加密的样本g如果您想检查,请使用更安全的in github解密。

+0

一些没有睡觉的夜晚会造成这种错误。对我感到羞耻。 – learner

0

有几个参数,AES牢记:

  • 密钥长度(128,256)
  • 核心价值
  • 块链接模式(ECB,CBC,...)
  • CBC有一个IV

我没有在你的代码中看到任何设置IV的东西。这是另一个Java AES示例文章。

Simple Java AES encrypt/decrypt example