gpt4 book ai didi

java - Java 中 AES 加密的初始化 vector (IV) 是否包含密码?

转载 作者:行者123 更新时间:2023-12-01 11:00:56 27 4
gpt4 key购买 nike

阅读不同的线程后,我将以下测试代码放在一起来加密和解密字符串。在实际应用程序中,加密的字符串将存储在文件中,并在重新启动应用程序并读取文件后解密。因此我也必须存储初始化 vector (IV)。在测试代​​码中,这是通过将 IV 保存在成员变量 initializer 中来模拟的。毕竟,应用程序和测试代码工作正常。

但我想知道,密码是否以某种方式成为IV的一部分:密码进入keySpeckeySpec用于生成secretKeysecretKey成为secretKeySpec的一部分,用于初始化cipher,IV从cipher参数的参数spec中检索 ...

...所以密码可能是 IV 的一部分,不是吗?当然,我不想将密码与加密文本一起存储。

@Test
public void test06() throws Exception {
char[] password = "password".toCharArray();
String s = "an unencryted string to be encrypted and decrypted";
byte[] sEncrypted = encrypt(password, s);
String sEncryptedDecrypted = decrypt(password, sEncrypted);
Assert.assertEquals(s, sEncryptedDecrypted);
}

private static final byte[] KEY_SALT = { (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c, (byte) 0x7e,
(byte) 0xc8, (byte) 0xee, (byte) 0x99 };
private static final int KEY_ITERATION_COUNT = 1024;
private static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static final int KEY_LENGTH = 128;
private static final String SECRET_KEY_FACTORY_ALGORITHM = "PBKDF2WithHmacSHA1";
private static final String CIPHER_ALGORITHM = "AES";
private static final String CHARSET_NAME = "UTF-8";
private byte[] initializer;

public byte[] encrypt(final char[] password, final String s) throws Exception {
KeySpec keySpec = new PBEKeySpec(password, KEY_SALT, KEY_ITERATION_COUNT, KEY_LENGTH);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(SECRET_KEY_FACTORY_ALGORITHM);
SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getEncoded(), CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
initializer = cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
return cipher.doFinal(s.getBytes(CHARSET_NAME));
}

public String decrypt(final char[] password, final byte[] sEncrypted) throws Exception {
KeySpec keySpec = new PBEKeySpec(password, KEY_SALT, KEY_ITERATION_COUNT, KEY_LENGTH);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(SECRET_KEY_FACTORY_ALGORITHM);
SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getEncoded(), CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(initializer));
final byte[] sByteArray = cipher.doFinal(sEncrypted);
return new String(sByteArray, CHARSET_NAME);
}

最佳答案

不,IV 不是根据密码生成的。 IV 是随机生成的,用于确保使用相同的 key 对相同的明文加密两次时不会得到相同的密文。

关于java - Java 中 AES 加密的初始化 vector (IV) 是否包含密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33331643/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com