如何生成用于AES算法的128位密钥

时间:2014-04-29 09:50:14

标签: java javascript android

我正在使用下面提到的帖子中的代码来加密和解密我的应用程序的Java和Java脚本模块之间的值。

Compatible AES algorithm for Java and Javascript

在上面的帖子中,他们使用128位密钥值。我想使用自己的密钥而不是硬编码128位密钥值。

我的问题是我可以将任意随机字符串转换为128位密钥值。

如果可以将任何字符串转换为128位值,请发布一些示例。

2 个答案:

答案 0 :(得分:5)

字符用8位表示。因此,为了形成128位密钥,创建一个具有16个字符(16 * 8 = 128)的字符串,例如, “abcdefgh12345678”。

将此键掩码为base64,您可以使用Apache commons-codec Base64.encodeBase64 ... @see http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html

答案 1 :(得分:2)

谷歌提供的东西,并在我的项目中使用:

private final static String algorithm = "PBKDF2WithHmacSHA1";

private final static String HEX = "0123456789ABCDEF";

private static final String CP_ALGORITH = "AES";
private static final String CP_KEY = "PUTsomeKEYinHere";

public static String cipher(String cipherKey, String data) throws NoSuchAlgorithmException, 
                    InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, 
                    IllegalBlockSizeException, BadPaddingException {
    SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
    KeySpec spec = new PBEKeySpec(cipherKey.toCharArray(), cipherKey.getBytes(), 128, 256);
    SecretKey tmp = skf.generateSecret(spec);
    SecretKey key = new SecretKeySpec(tmp.getEncoded(), CP_ALGORITH);
    Cipher cipher = Cipher.getInstance(CP_ALGORITH);
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return toHex(cipher.doFinal(data.getBytes()));
}

public static String decipher(String cipherKey, String data) throws NoSuchAlgorithmException, 
                        InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, 
                        IllegalBlockSizeException, BadPaddingException {
    SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
    KeySpec spec = new PBEKeySpec(cipherKey.toCharArray(), cipherKey.getBytes(), 128, 256);
    SecretKey tmp = skf.generateSecret(spec);
    SecretKey key = new SecretKeySpec(tmp.getEncoded(), CP_ALGORITH);
    Cipher cipher = Cipher.getInstance(CP_ALGORITH);
    cipher.init(Cipher.DECRYPT_MODE, key);
    return new String(cipher.doFinal(toByte(data)));
}

private static byte[] toByte(String data) throws NullPointerException{
    int len = data.length()/2;
    byte[] result = new byte[len];
    for (int i = 0; i < len; i++)
        result[i] = Integer.valueOf(data.substring(2*i, 2*i+2), 16).byteValue();
    return result;
}

private static String toHex(byte[] doFinal) {
    StringBuffer result = new StringBuffer(2*doFinal.length);
    for (int i = 0; i < doFinal.length; i++) {
        result.append(HEX.charAt((doFinal[i]>>4)&0x0f)).append(HEX.charAt(doFinal[i]&0x0f));
    }
    return result.toString();
}

用法:

cipher(CP_KEY, STRINGtoCIPHER);

decipher(CP_KEY, YOURcipheredSTRING)

我把它全部放在一个带有静态字段和方法的共享类中,所以我可以在我的应用程序的任何地方使用它。我使用它来存储SessionID我共享的首选项,它运行良好。