java aes iv 24位_Java中AES加密的初始化向量(IV)是否包含密码?

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

但我想知道,密码是否成为IV的一部分:密码进入keySpec , keySpec用于生成secretKey , secretKey成为secretKey一部分,用于初始化cipher ,IV从参数spec中检索参数cipher ......

...所以密码可能是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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值