我想在我的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时我做错了什么?

2017-03-10

learner

+0

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

+0

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

+0

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐