Android:Java:使用密钥而不是密码解密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

我正在使用一个片段来解密AES文件

但是,我希望使用密钥文件而不是密码来解密该文件

我需要对下面的代码进行哪些更改才能实现这一点

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,你能推荐如何改进侵权代码以使其更好吗?或者只是指出一个更好的代码示例来解决这些问题?