Java 使用 AES 256 和 128 对称密钥加密128 位的答案

2022-09-03 12:17:10

我是密码技术的新手。我发现这个代码来做对称加密。

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);

它的工作原理。在这里,我可以使用自己的密码。而这正是我所需要的。但我不知道如何做128或256对称Enctryption。如何在代码中使用128和256键?


答案 1

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/index.html 下载并安装“Java加密扩展(JCE)无限强度管辖权策略文件6”。


答案 2

128 位的答案

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

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;
}

下一个方法将解密 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;
}

是一个 128 位密钥,编码在 .以下方法中的 生成适当的 128 位密钥secKeyBASE64EncoderBASE64Decoder

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

推荐