在使用带有“ AES / CBC / PKCS5Padding”的Java Cipher进行解密时,必须指定IV吗?只能使用SecretKeyFactory吗?

问题描述 投票:2回答:1

我阅读了一些有关使用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);

我对解密过程有两个问题。

  1. 尽管需要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));

如果我将最后一行更改为[我想可以将它用于AES

SecretKeySpec keySpec = factory.generateSecret(new SecretKeySpec(key,"AES"));
  1. 我对于何时使用SecretKeyFactory生成密钥以及何时使用KeyGenerator感到困惑。似乎后者是生成随机密钥,前者是从给定的密钥材料生成的。那么这意味着在解密模式下只能使用SecretKeyFactory吗?

我阅读了一些有关使用Java Cipher加密和解密数据的示例。例如:KeyGenerator keyGenerator = KeyGenerator.getInstance(“ AES”); SecureRandom secureRandom =新的SecureRandom(); ...

java encryption jce jca
1个回答
0
投票

这是否意味着仅应使用Cipher.init(int opmode, Key key, AlgorithmParameters params),并且应该从加密中获取IV,并在此处存储和传递?

© www.soinside.com 2019 - 2024. All rights reserved.