首页 > 解决方案 > 如何将“AES”密钥从 byth[] 转换为 UTF-8 字符串

问题描述

标签: javaandroidencryptionpublic-key-encryption

解决方案


以字节数组的形式生成一个密钥,您可以使用它来加密和解密过程。

private SecretKey secretKey; // member variables (in class)

public byte[] generateAESKey() {
    try {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128);
        if (secretKey == null) {
            secretKey = kgen.generateKey();
        }
        byte[] keyBytes = secretKey.getEncoded(); 
        //Log.i("keyBytes", toHexString(keyBytes));
        return keyBytes;
    }
    catch (Exception ex){
        ex.printStackTrace();
    }
    return null;
}

生成AESKey的结果:

0x04 0x90 0x74 0x21 0x73 0xB9 0x3D 0x1F 0x7B 0x19 0xC4 0x95 0x85 0x20 0xDF 0x27

以可以保存或发送到另一个应用程序的字符串形式生成密钥。

public String getStrAESkey()  {
    try {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128);
        if (secretKey == null) {
            secretKey = kgen.generateKey();
        }
        String keyStr = toHexString(secretKey.getEncoded());
        Log.i("keyStr", keyStr);
        return keyStr;
    }
    catch (Exception ex){
        ex.printStackTrace();
    }
    return null;
}

getStrAESkey() 的结果:

0490742173B93D1F7B19C4958520DF27

//

public String toHexString(byte[] bytes) {
    return Utils.printHexBinary(bytes);
}

public byte[] toByteArray(String hexString) {
    return Utils.parseHexBinary(hexString);
}

实用程序.java

public class Utils {
    private static final char[] hexCode = "0123456789ABCDEF".toCharArray();

    private static int hexToBin(char ch) {
        if ('0' <= ch && ch <= '9') return ch - '0';
        if ('A' <= ch && ch <= 'F') return ch - 'A' + 10;
        if ('a' <= ch && ch <= 'f') return ch - 'a' + 10;
        return -1;
    }

    public static byte[] parseHexBinary(String s) {
        final int len = s.length();

        if (len % 2 != 0)
            throw new IllegalArgumentException("hexBinary needs to be even-length: " + s);

        byte[] out = new byte[len / 2];

        for (int i = 0; i < len; i += 2) {
            int h = hexToBin(s.charAt(i));
            int l = hexToBin(s.charAt(i + 1));
            if (h == -1 || l == -1)
                throw new IllegalArgumentException("contains illegal character for hexBinary: " + s);

            out[i / 2] = (byte) (h * 16 + l);
        }

        return out;
    }

    public static String printHexBinary(byte[] data) {
        StringBuilder r = new StringBuilder(data.length * 2);
        for (byte b : data) {
            r.append(hexCode[(b >> 4) & 0xF]);
            r.append(hexCode[(b & 0xF)]);
        }
        return r.toString();
    }
}

推荐阅读