java - Android:Java:使用 key 而不是密码解密 AES

标签 java android encryption aes

我正在使用代码 fragment 来解密 AES 文件。

但是,我想使用 key 文件而不是密码来解密文件。

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

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 key 只不过是随机生成的 16、24 或 32 字节数据。因此,要创建 key 文件,请在其中保存一定数量的随机数据,并使用它来实例化 SecretKeySpec(byte[] data, "AES")

请注意,为方便起见,SecretKeySpec 也是一个 SecretKey

关于java - Android:Java:使用 key 而不是密码解密 AES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26151172/

相关文章:

android - 如何实现幻灯片以显示 recyclerview 中的操作?

android - 使用 Nougat Android 7 的 IccLockSettings 调用抛出 ActivityNotFoundException

java - Android 字符编码与 Java 字符编码

java - 在我的 android 项目中遇到 nullPointerExecption

android - 在 React Native 的标题中创建带图像的抽屉导航

android - Android API 24 及更低版本上的 PBKDF2WithHmacSHA256

c++ - 向 TCP 流添加加密?

java - 如何在 Windows 7 上安装 Connector/J?

java - 使用多个构造函数创建不可变类

java - 如何在Activity类中播放android声音