Java 对称密钥生成

Java 对称密钥生成,java,jce,Java,Jce,我有两个问题: 何时使用SecretKeySpec以及何时使用KeyGenerator生成密钥 密钥实例和密码实例是否必须遵循相同的算法?背后的概念是什么 取决于你的申请 对。不同的密码可以使用不同的密钥长度。将AlgorithmParameterSpec传递给密钥生成器 KeyGenerator每次调用时都会创建一个新的随机密钥。还保证返回的密钥的长度与获取KeyGenerator实例时指定的算法兼容 SecretKeySpec包装现有字节数组。字节源可以是十六进制或Base64字符串,也可以

我有两个问题:

  • 何时使用
    SecretKeySpec
    以及何时使用
    KeyGenerator
    生成密钥
  • 密钥实例和密码实例是否必须遵循相同的算法?背后的概念是什么
  • 取决于你的申请

  • 对。不同的密码可以使用不同的密钥长度。将AlgorithmParameterSpec传递给密钥生成器


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

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

    通常,
    SecretKeySpec
    的实例可以直接用作密钥,因为
    SecretKeySpec
    实现了
    SecretKey
    ,并且大多数使用密钥的加密算法都支持所谓的“原始”密钥,“原始”密钥基本上是没有特定内部结构的随机字节序列

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

    如果加密算法支持“原始”密钥,那么唯一的要求是密钥长度与算法期望相匹配


    但是加密提供者的实现者可以决定他需要使用特定的密钥表示,例如,基于初始“原始”字节缓存或预计算一些值。在这种情况下,除了从
    Key.getAlgorithm()
    Key.getFormat()
    返回正确的标识符外,算法还需要传入
    SecretKey
    实例,因此,必须使用
    SecretKeyFactory
    将密钥规范转换为密钥。此类案例通常记录在提供商文档中。

    谢谢斯塔克,但问题1的标准是什么。