我阅读了一些有关使用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);
我对解密过程有两个问题。
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));
如果我将最后一行更改为[我想可以将它用于AES
SecretKeySpec keySpec = factory.generateSecret(new SecretKeySpec(key,"AES"));
- 我对于何时使用
SecretKeyFactory
生成密钥以及何时使用KeyGenerator
感到困惑。似乎后者是生成随机密钥,前者是从给定的密钥材料生成的。那么这意味着在解密模式下只能使用SecretKeyFactory吗?
我阅读了一些有关使用Java Cipher加密和解密数据的示例。例如:KeyGenerator keyGenerator = KeyGenerator.getInstance(“ AES”); SecureRandom secureRandom =新的SecureRandom(); ...
这是否意味着仅应使用
Cipher.init(int opmode, Key key, AlgorithmParameters params)
,并且应该从加密中获取IV,并在此处存储和传递?