Android:Java:使用密钥而不是密码解密AES
我正在使用一个片段来解密AES文件 但是,我希望使用密钥文件而不是密码来解密该文件 我需要对下面的代码进行哪些更改才能实现这一点Android:Java:使用密钥而不是密码解密AES,java,android,encryption,aes,Java,Android,Encryption,Aes,我正在使用一个片段来解密AES文件 但是,我希望使用密钥文件而不是密码来解密该文件 我需要对下面的代码进行哪些更改才能实现这一点 import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; public class AESCrypto { public static String
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class AESCrypto {
public static String encrypt(String seed, String cleartext) throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] result = encrypt(rawKey, cleartext.getBytes());
return Converters.toHex(result);
}
public static String decrypt(String seed, String encrypted) throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] enc = Converters.toByte(encrypted);
byte[] result = decrypt(rawKey, enc);
return new String(result);
}
public static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
sr.setSeed(seed);
try {
kgen.init(256, sr);
} catch (Exception e) {
// Log.w(LOG, "This device doesn't support 256 bits, trying 192 bits.");
try {
kgen.init(192, sr);
} catch (Exception e1) {
// Log.w(LOG, "This device doesn't support 192 bits, trying 128 bits.");
kgen.init(128, sr);
}
}
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}
private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
}
AES密钥仅为随机生成的数据的16、24或32字节。因此,要创建一个密钥文件,请将大量随机数据保存在其中,并使用它实例化
SecretKeySpec(byte[]data,“AES”)
请注意,为方便起见,
SecretKeySpec
也是一种SecretKey
学习加密,不要使用随机片段。这个片段可能会给你留下你永远无法解密的密文。即使你能解密它,它也是不安全的。我把它列为android的标准密码?为什么这个代码有问题?你能指出上面的代码“作为Android的默认密码”在哪里吗。问题在于getRawKey
使用的随机数生成器既不是确定性的,也不是定义良好的,实现取决于提供程序,并且它可能(而且已经)在没有警告的情况下更改。此外,您只需请求Cipher.getInstance(“AES”)
,就可以为操作模式和填充使用提供程序默认值。这也不是确定性的,它通常默认为不安全的ECB加密模式。实际上,Android有一个问题,SecureRandom
实际返回了。。。等等。。。产生随机AES密钥的随机值。现在,由于随机AES密钥无法在不破坏AES的情况下检索:再见,明文。我想我在developer.android.com上看到了它,但我现在找不到它。所以我看到了你的建议,但是作为一个noob,你能推荐如何改进侵权代码以使其更好吗?或者只是指出一个更好的代码示例来解决这些问题?