如何在Android中进行AES解密,而无需在SD卡存储中写入解密文件?

时间:2015-04-29 05:49:16

标签: android file encryption aes

如何在android中进行AES解密,无需在SD卡存储中编写解密文件,直接用于android应用程序?或者如果有任何其他方式对脱机数据存储进行文件加密?

4 个答案:

答案 0 :(得分:1)

我曾在android中使用过AES,这是我用来加密的方法:

public static byte[] encryptAES(SecretKey key, byte[] clear) {
    try {

        SecretKeySpec skeySpec = new SecretKeySpec(key.getEncoded(), "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(clear);
        return encrypted;
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

这是解密方法:

public static byte[] decryptAES(SecretKey key, byte[] encrypted) {
    try {

        SecretKeySpec skeySpec = new SecretKeySpec(key.getEncoded(), "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] decrypted = cipher.doFinal(encrypted);
        return decrypted;
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

以下方法为AES生成随机密钥:

public SecretKey newAESKey() {

    try {
        String s_key = new BigInteger(130, random).toString(32);

        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");

        sr.setSeed(s_key.getBytes());
        kgen.init(128, sr); // 192 and 256 bits may not be available

        SecretKey skey = kgen.generateKey();
        return skey;
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

首先,我生成一个随机的AES密钥,然后加密并解密所需的字节,在我的情况下,我用于String数据。

SecretKey key = newAESkey();

....

String params = "....";
byte[] encrypted_params = encryptAES(key, params.getBytes());

答案 1 :(得分:1)

我曾经对视频文件使用AES加密和解密。我在运行中加密和解密它并在媒体播放器上运行它。 这是我使用的库。

http://libeasy.alwaysdata.net/network/#server

它实际上首先将加密文件发送到本地服务器,对其进行解密并将其发回。我使用了传入的流来播放。

我的意思是本地服务器,它在android系统中创建一个本地HTTP服务器。

你会在SO上找到很多这方面的例子。

答案 2 :(得分:0)

如果您使用IOCipherSQLCipher,则可以直接从其中流式传输文件,这样就无需解密到SD卡或其他地方。它们都使用AES256加密,并在一定程度上经过审核。

很容易添加任何Android应用。 IOCipher与java.io.*的API相同,而SQLCipher是相同的API和android.database.*,因此它们都非常易于使用。对于存储文件,您可以使用IOCipher创建虚拟加密磁盘。对于加密数据库存储,请使用SQLCipher for AndroidCacheWord库可以轻松管理该加密存储的用户密码。

以下是通过gradle添加它们的方法:

compile 'net.zetetic:android-database-sqlcipher:3.3.1-2@aar' compile 'info.guardianproject.cacheword:cachewordlib:0.1' compile 'info.guardianproject.iocipher:IOCipher:0.3'

答案 3 :(得分:0)

尝试

AES加密

public static String getEncryptedString(String value) {
        try {
          byte[] key = your Key in byte array;
          byte[] input = sault in byte array

            return Base64.encodeToString(encrypt(value.getBytes("UTF-8"), key, input), Base64.DEFAULT);
        } catch (UnsupportedEncodingException e) {
            return "";
        }
    }


 public static byte[] encrypt(byte[] data, byte[] key, byte[] ivs) {
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
            byte[] finalIvs = new byte[16];
            int len = ivs.length > 16 ? 16 : ivs.length;
            System.arraycopy(ivs, 0, finalIvs, 0, len);
            IvParameterSpec ivps = new IvParameterSpec(finalIvs);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivps);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

AES解密

public static String decrypt(String encrypted) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {

            byte[] key = your Key in byte array;
            byte[] input = sault in byte array


            SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
            IvParameterSpec ivSpec = new IvParameterSpec(input);
            Cipher ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            ecipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
            byte[] raw = Base64.decode(encrypted, Base64.DEFAULT);
            byte[] originalBytes = ecipher.doFinal(raw);
            String original = new String(originalBytes, "UTF8");
            return original;
        }