我想在我的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
@CountTCyberSecurityLtd我试着你提供的解决方案,并改变了我的代码插入密码AES/CBC/PKCS5PADDING。非常相同的结果。 –