Java使用AES 256和128对称密钥加密

Bhu*_*ban 12 java encryption aes

我是密码技术的新手.我发现这段代码可以进行对称加密.

byte[] key = //... secret sequence of bytes
byte[] dataToSend = ...
Cipher c = Cipher.getInstance("AES");
SecretKeySpec k = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal(dataToSend);
Run Code Online (Sandbox Code Playgroud)

它的工作.在这里,我可以使用自己的密码.那就是我需要的东西.但我不知道怎么做128或256 Symmetric Enctryption.如何在代码中使用128和256键?

Pet*_*aný 16

AES是使用128位还是256位模式取决于密钥的大小,密钥长度必须为128或256位.通常,您不会将密码用作密钥,因为密码很少具有您需要的确切长度.相反,您可以使用某些密钥派生函数从密码派生加密密钥.

非常简单的示例:获取密码的MD5以获得128位密钥.如果需要256位密钥,可以使用SHA-256获取密码的256位哈希值.密钥派生函数通常运行此散列数百次并使用额外的盐.有关详细信息,请查看http://en.wikipedia.org/wiki/Key_derivation_function.

另请注意:要运行超过128位的加密,您需要从http://www.oracle.com/technetwork/java/javase/downloads下载并安装"Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files 6" . /index.html.

  • MD5?我今天早上在1996年醒来了吗?SHA系列具有产生128,256,348和512位哈希的算法. (6认同)
  • @Peter:这只是一个快速的例子,说明如何从密码中获得128位密钥.如果您的密码少于16个字节,您也可以将其填充到16个字节.你在挑剔不重要的细节.(无论如何我已经更新了我的答案,说使用SHA-256从密码中获取256位密钥) (5认同)
  • @Peter::-)它在某些用途中"破碎"......但在这种情况下,你选择的散列算法并不重要.无论您如何获得密钥,都希望保护密钥.它不像你的密钥(密码的md5哈希)是公开的,有人想知道你的密码.一旦有人拥有你的密钥(我的例子中的md5哈希)你就注定了.MD5与它几乎没有关系. (5认同)
  • 正如Peter Stibrany所描述的那样使用MD5没有任何问题.MD5存在漏洞,使其不适合很多情况,但这不是其中之一.但是,一般情况下,从密码派生密钥应使用密钥派生算法,如PBKDF2(默认情况下使用SHA-1),bcrypt或scrypt. (2认同)

小智 6

答案为128位

以下方法是valueEnc使用AES加密来加密字符串():

private static final String ALGORITHM = "AES"; 

public String encrypt(final String valueEnc, final String secKey) { 

    String encryptedVal = null;

    try {
        final Key key = generateKeyFromString(secKey);
        final Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.ENCRYPT_MODE, key);
        final byte[] encValue = c.doFinal(valueEnc.getBytes());
        encryptedVal = new BASE64Encoder().encode(encValue);
    } catch(Exception ex) {
        System.out.println("The Exception is=" + ex);
    }

    return encryptedVal;
}
Run Code Online (Sandbox Code Playgroud)

下一个方法将解密AES加密的字符串(encryptedVal):

    public String decrypt(final String encryptedValue, final String secretKey) {

    String decryptedValue = null;

    try {

        final Key key = generateKeyFromString(secretKey);
        final Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.DECRYPT_MODE, key);
        final byte[] decorVal = new BASE64Decoder().decodeBuffer(encryptedValue);
        final byte[] decValue = c.doFinal(decorVal);
        decryptedValue = new String(decValue);
    } catch(Exception ex) {
        System.out.println("The Exception is=" + ex);
    }

    return decryptedValue;
}
Run Code Online (Sandbox Code Playgroud)

secKey是一个128位密钥,编码在BASE64Encoder.将BASE64Decoder在下面的方法产生一个适当的128位密钥

private Key generateKeyFromString(final String secKey) throws Exception {
    final byte[] keyVal = new BASE64Decoder().decodeBuffer(secKey);
    final Key key = new SecretKeySpec(keyVal, ALGORITHM);
    return key;
}
Run Code Online (Sandbox Code Playgroud)

  • 您忘记使用初始化向量,并且您也没有指定要使用的 AES 的模式和填充。虽然这是对问题的回答,但请注意,这 ** 不是** 安全使用加密。 (2认同)