如何在android中进行AES解密,无需在SD卡存储中编写解密文件,直接用于android应用程序?或者如果有任何其他方式对脱机数据存储进行文件加密?
答案 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)
如果您使用IOCipher或SQLCipher,则可以直接从其中流式传输文件,这样就无需解密到SD卡或其他地方。它们都使用AES256加密,并在一定程度上经过审核。
很容易添加任何Android应用。 IOCipher与java.io.*
的API相同,而SQLCipher是相同的API和android.database.*
,因此它们都非常易于使用。对于存储文件,您可以使用IOCipher创建虚拟加密磁盘。对于加密数据库存储,请使用SQLCipher for Android。 CacheWord库可以轻松管理该加密存储的用户密码。
以下是通过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;
}