【发布时间】:2020-07-27 19:20:10
【问题描述】:
我阅读了一些关于使用 Java Cipher 加密和解密数据的示例。例如:
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = new SecureRandom();
keyGenerator.init(256, secureRandom);
SecretKey secretKey = keyGenerator.generateKey();
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, secretKey);
我有两个关于解密过程的问题。
- 虽然需要 IV,但我们可以使用
Cipher.init(Cipher.ENCRYPT_MODE, Key)将其隐含。随机 IV 将自动应用到它。但是,在解密模式下,必须使用相同的 IV。这是否意味着应该只使用Cipher.init(int opmode, Key key, AlgorithmParameters params),并且应该从加密中获取IV,在此处存储和传递?
除了'''KeyGenerator''',我还看到了用'''SecretKeyFactory'''生成密钥的例子:
String key = ...
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
SecretKeySpec keySpec = factory.generateSecret(new DESKeySpec(key));
如果我将最后一行更改为
,我想我可以将它用于 AESSecretKeySpec keySpec = factory.generateSecret(new SecretKeySpec(key,"AES"));
- 我对何时使用
SecretKeyFactory生成密钥以及何时使用KeyGenerator感到困惑。似乎后者是生成随机密钥,前者是从给定的密钥材料生成的。那么是不是说在解密模式下只能使用 SecretKeyFactory 呢?
【问题讨论】:
标签: java encryption jce jca