Android AES加密/解密不正确的结果

时间:2017-03-10 01:16:29

标签: java android security encryption cryptography

我试图在我的Android应用中进行AES加密/解密。我尝试过像Encryptionjava-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时我做错了什么?

2 个答案:

答案 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的几个参数:

  • 密钥长度(128,256)
  • 键值
  • 区块链接模式(ECB,CBC,...)
  • CBC有IV

我在代码中没有看到任何设置IV的内容。这是另一个Java AES示例帖子。

Simple Java AES encrypt/decrypt example