在阅读不同的线程之后,我将以下测试代码放在一起以加密和解密字符串。 在实际应用程序中,加密字符串将存储在文件中,并在重新启动应用程序并读取文件后进行解密。 因此我也要存储初始化向量(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);
}