Java加密的常用的加密算法类型有三种

1单向加密:

也就是不可逆的加密,例如MD5,SHA,HMAC

2对称加密:

也就是加密方和解密方利用同一个秘钥对数据进行加密和解密,例如DES,PBE等等

3非对称加密:

非对称加密分为公钥和秘钥,二者是非对称的,例如用私钥加密的内容需要使用公钥来解密,使用公钥加密的内容需要用私钥来解密,DSA,RSA…

而keyGenerator,KeyPairGenerator,SecretKeyFactory的三种使用方法刚好和这三种加密算法类型对上

keyGenerator:

秘钥生成器,也就是更具算法类型随机生成一个秘钥,例如HMAC,所以这个大部分用在非可逆的算法中。

SecretKeyFactory:

秘密秘钥工厂,言外之意就是需要根据一个秘密(password)去生成一个秘钥,例如DES,PBE,所以大部分使用在对称加密中。

KeyPairGenerator:

秘钥对生成器,也就是可以生成一对秘钥,也就是公钥和私钥,所以大部分使用在非对称加密中。


下面主要介绍一下KeyPairGenerator

KeyPairGenerator类

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

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

有两种生成密钥对的方式:与算法无关的方式特定于算法的方式。两种方式的唯一区别在于对象的初始化:

与算法无关的初始化
所有的密钥对生成器遵循密钥大小和随机源的概念。对于不同的算法,密钥大小的解释也不相同(例如,对于 DSA 算法,密钥大小对应于模的长度)。此 KeyPairGenerator 类有一个 initialize 方法,该方法带有两个通用的共享类型的参数。还有一个只带有 keysize 参数的方法,它使用以最高优先级安装的提供者的 SecureRandom 实现作为随机源。(如果任何安装的提供者都不提供 SecureRandom 的实现,则使用系统提供的随机源。)

因为调用上述与算法无关的 initialize 方法时没有指定其他参数,所以由提供者决定如何处理与每个密钥关联的特定于算法的参数(如果有)。

如果算法为 DSA 算法,密钥大小(模大小)为 512、768 或 1024,那么 Sun 提供者对 p、q 和 g 参数使用一组预计算值。如果模大小不是上述值之一,则 Sun 提供者创建一个新的参数集合。其他提供者可能具有供更多模大小(不仅仅是上文提及的那三个)使用的预计算参数集合。其他提供者也可能没有任何预计算参数列表,而总是创建新的参数集合。

特定于算法的初始化
对于特定于算法的参数集合已存在的情况(例如,DSA 中所谓的公用参数),有两个 initialize 方法具有 AlgorithmParameterSpec 参数。其中一个方法还有一个 SecureRandom 参数,而另一个方法使用以最高优先级安装的提供者的 SecureRandom 实现作为随机源。(如果任何安装的提供者都不提供 SecureRandom 的实现,则使用系统提供的随机源。)

每个提供者都必须提供(并记录)默认的初始化,以防客户端没有显式初始化 KeyPairGenerator(通过调用 initialize 方法)。例如,Sun 提供者使用 1024 位的默认模大小(密钥大小)。

注意,由于历史原因,此类是抽象类,是从 KeyPairGeneratorSpi 扩展的。应用程序开发人员只需注意在此 KeyPairGenerator 类中定义的方法;超类中的所有方法是供加密服务提供者使用的,这些加密服务提供者希望提供自己的密钥对生成器实现。


Java提供的`KeyPairGenerator`类。 用于生成公钥和私钥对。 要使用`KeyPairGenerator`类生成密钥,按照以下步骤操作。
第1步:创建KeyPairGenerator对象

KeyPairGenerator类提供getInstance()方法,该方法接受表示所需密钥生成算法的String变量,并返回生成密钥的KeyPairGenerator对象。

使用getInstance()方法创建KeyPairGenerator对象,如下所示。

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
第2步:初始化KeyPairGenerator对象

KeyPairGenerator类提供了一个名为initialize()的方法,该方法用于初始化密钥对生成器。 此方法接受表示密钥大小的整数值。

使用此方法初始化在上一步中创建的KeyPairGenerator对象,如下所示。

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
第3步:生成KeyPairGenerator

可以使用KeyPairGenerator类的generateKeyPair()方法生成KeyPair。 使用此方法生成密钥对,如下所示。

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
第4步:获取私钥/公钥

可以使用getPrivate()方法从生成的密钥对对象中获取私钥,如下所示。

//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();

可以使用getPublic()方法从生成的KeyPair对象获取公钥,如下所示。

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
Java

示例
下面的示例演示了使用javax.crypto包的KeyPairGenerator类生成密钥的密钥。

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

public class KeyPairGenertor {
   public static void main(String args[]) throws Exception{
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

      //Initializing the KeyPairGenerator
      keyPairGen.initialize(2048);

      //Generating the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();

      //Getting the private key from the key pair
      PrivateKey privKey = pair.getPrivate();   

      //Getting the public key from the key pair
      PublicKey publicKey = pair.getPublic(); 
      System.out.println("Keys generated");
   }
}

执行上面示例代码,得到下结果:

Keys generated

获取公钥接口

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(512);
KeyPair key = keyPairGen.generateKeyPair();
Base64.Encoder encoder = Base64.getEncoder();
Map.Entry<String, String> keyPair = new 
   AbstractMap.SimpleEntry(encoder.encodeToString(key.getPublic().getEncoded()),
    encoder.encodeToString(key.getPrivate().getEncoded()));
temporaryCodeDAO.cache(keyPair.getKey(), keyPair.getValue(), 100, TimeUnit.SECONDS);//缓存到Redis
return ResponseResult.data(keyPair.getKey());
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐