KeySpec & KeyGenerator

July 15, 2023 / Administrator / 41阅读 / 0评论/ 分类: Crypto

密钥相关类

SecretKeySpec,KeyGenerator,KeyFactory,SecretKeyFactory,KeyPairGenerator

  • 对称密钥生成:SecretKeySpec 、keyGenerator 、SecretKeyFactory
  • 非对称密钥生成:KeyPairGenerator

常用的KeyGenerator、KeyPairGenerator ;可以满足使用

先导入maven依赖:

<dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.15</version>
        </dependency>

KeySpec

这个类,顾名思义,就是一个规范。什么意思呢?

当我们想使用密钥,对某段明文信息进行加密时,不同的加密算法,对密钥的要求不同,比如要求密钥key的长度只能是8 byte。

为了解决这个密钥key的标准化问题,我们创建了一个KeySpec类,指定长度等参数,提供一个不标准的密钥key,就能得到一个标准的密钥key了。

同时为了方便后面的计算,需要指明当前这个密钥,是使用什么算法生成的。

SecretKeySpec

refer to : https://docs.oracle.com/javase/8/docs/api/javax/crypto/spec/SecretKeySpec.html

用SecretKeySpec类生成密钥。构建SecretKeySpec类,只需要传入密钥key的字节数组,以及这个密钥key使用的生成算法。

  String secretKey = "123456";
  SecretKeySpec aes = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES");

可以看到,使用SecretKeySpec,其实并没有生成使用密钥,密钥其实就是明文的。

所以SecretKeySpec类的作用,不是生成一个密钥,而是指明这个密钥是使用什么算法生成的。


SecretKeySpec类支持创建密匙的加密算法(ASE,DES,DES3)

SecretKey secretKey = new SecretKeySpec(slatKey.getBytes(), "AES");

但需要主要的是不同的加密算法的byte数组的长度是不同的,创建密匙前最好先检测下byte数组的长度。各加密算法的密匙长度如下

加密算法 密匙长度
AES 128、192、256
DES 56
DESede 112

KeyGenerator

  • 用KeyGenerator生成密钥,此类提供(对称)密钥生成器的功能。

  • 密钥生成器是使用此类的某个 getInstance 类方法构造的。

  • KeyGenerator 对象可重复使用,也就是说,在生成密钥后,可以重复使用同一个 KeyGenerator 对象来生成更多的密钥。


 // 创建KeyGenerator对象,指定算法
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        // 可以初始化一些配置:密钥长度,随机数等
        keyGenerator.init(256);
        // 配置随机串,加强加密安全性
        // 声明随机串,可以指定种子 SecureRandom(byte[] seed)
        SecureRandom random = new SecureRandom();
        keyGenerator.init(random);
        SecretKey secretKey = keyGenerator.generateKey();

这里的 keyGenerator.init的作用是什么呢?上面我们说到,不同的加密算法的byte数组的长度是不同的,创建密匙前最好先检测下byte数组的长度,如果指定的saltKey的长度不够,那么就需要通过KeyGenerator,来生成一个标准长度的密钥。

SecretKeyFactory

用SecretKeyFactory生成密钥,此类表示秘密密钥的工厂。


// 设置密钥参数
        String key = "1234567812345678";
        byte[] keyByte = key.getBytes("UTF-8");
        // 打印原始的密钥key
        System.out.println("origin:"+Hex.encodeHexString(keyByte)); // 31323334353637383132333435363738


        // 创建SecretKeyFactory对象,指定算法
        SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
        // 指定密钥规范,此处的SecretKeySpec是密钥规范,而不是密钥。API真搓
        DESKeySpec keySpec = new DESKeySpec(keyByte);
        // 根据密钥规范生成密钥
        SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);

        // 打印使用SecretKeyFactory生成的密钥key
        String s = Hex.encodeHexString(secretKey.getEncoded());
        System.out.println(s); // 3132323434373738

KeyPairGenerator

  • 密钥对生成,生成非对称密钥

  • KeyPairGenerator类用于生成公钥和私钥对。密钥对生成器是使用getInstance工厂方法(返回一个给定类的实例的静态方法)构造的。

  • 特定算法的密钥对生成器可以创建能够与此算法一起使用的公钥/私钥对。它还可以将特定于算法的参数与每个生成的密钥关联。

// 创建 KeyPairGenerator对象,指定加密算法
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        // 可以初始化一些配置:密钥长度,随机数。
        // 配置随机串,加强加密安全性
        // 声明随机串,可以指定种子 SecureRandom(byte[] seed)
        SecureRandom random = new SecureRandom();
        keyPairGenerator.initialize(512, random);
        // 生成密钥
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // 获取公私密钥
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

文章作者:Administrator

文章链接:http://localhost:8090//archives/keyspeckeygenerator

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!


评论