对称密钥生成

时间:2014-06-09 12:45:56

标签: java jce

我有两个问题:

  1. 何时使用SecretKeySpec以及何时使用KeyGenerator进行密钥生成?
  2. Key实例和Cipher实例是否必须遵循相同的算法?背后的概念是什么?

2 个答案:

答案 0 :(得分:0)

  1. 取决于您的申请

  2. 是。不同的密码可以使用不同的密钥长度。您将AlgorithmParameterSpec传递给密钥生成器。

答案 1 :(得分:0)

KeyGenerator每次调用时都会创建一个 new 随机密钥。返回的密钥也保证长度与获取KeyGenerator实例时指定的算法兼容。

SecretKeySpec包装现有的字节数组。字节源可以是十六进制或Base64字符串,或者实际上是先前生成的密钥的任何其他文本或二进制表示。因此,SecretKeySpec的用例是当您需要重用先前存储在某些外部表示中的密钥时。

通常SecretKeySpec的实例可以直接用作密钥,因为SecretKeySpec实现SecretKey,大多数使用密钥的加密算法支持所谓的" raw&#34 ;键在哪里" raw" key基本上是一个没有特定内部结构的随机字节序列。

当算法需要特定的SecretKey表示(通常是算法实现内部的SecretKey的子类)时,您必须使用SecretKeyFactorySecretKeySpec转换为适当的SecretKey

如果加密算法支持" raw"密钥然后唯一的要求是密钥长度符合算法期望。

但加密提供程序的实现者可以决定他需要使用特定的键表示,例如,根据初始" raw"来缓存或预先计算某些值。字节。在这种情况下,除了从SecretKeyKey.getAlgorithm()方法返回正确的标识符之外,算法还可以要求传入的Key.getFormat()实例也是SecretKey的特定子类,因此使用SecretKeyFactory将密钥规范转换为密钥是必需的。此类案例通常记录在提供者文档中。