我试图在我的Android应用中进行AES加密/解密。我尝试过像Encryption,java-aes-crypto这样的库和
中描述的实现无论我使用何种方法,解密部分都与原始数据不同。我总是得到这样的结果:
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;
}
使用这些方法的示例(使用Jackson读写对象):
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 :(得分: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();
}
,结果是正确的:
03-10 11:12:38.987 31251-31251 /? E / TEST:xxxx加密: bR80WEK9pa3eicMjCZCtQg == 03-10 11:12:38.987 31251-31251 /? E / TEST:xxxx 解密:我的名字是Nam
所以,也许你写的日志不正确:
Log.e("ERROR", "AFTER: "+ pojo.getName());
应该是:
Log.e("ERROR", "AFTER: "+ securityPOJO.getName());
或
Log.e("ERROR", "AFTER: "+ CryptUtils.decrypt( pojo.getName() ));
注意:如果您想检查加密/解密,请使用更安全的in github编写示例。
答案 1 :(得分:0)
要记住AES的几个参数:
我在代码中没有看到任何设置IV的内容。这是另一个Java AES示例帖子。