生成公钥和私钥

原文: https://docs.oracle.com/javase/tutorial/security/apisign/step2.html

为了能够创建数字签名,您需要一个私钥。 (为了验证签名的真实性,将需要相应的公钥。)

在某些情况下,密钥对(私钥和相应的公钥)已在文件中可用。在这种情况下,程序可以导入和使用私钥进行签名,如弱点和替代所示。

在其他情况下,程序需要生成密钥对。使用KeyPairGenerator类生成密钥对。

在此示例中,您将为数字签名算法(DSA)生成公钥/私钥对。您将生成 1024 位长度的密钥。

生成密钥对需要几个步骤:

创建密钥对生成器

第一步是获取密钥对生成器对象,以生成 DSA 签名算法的密钥。

与所有引擎类一样,为特定类型的算法获取KeyPairGenerator对象的方法是在KeyPairGenerator类上调用getInstance静态工厂方法。这种方法有两种形式,都有String algorithm第一个参数;一种形式也有String provider第二个参数。

因此,调用者可以选择性地指定提供者的名称,这将保证所请求的算法的实现来自命名的提供者。本课程的示例代码始终指定 JDK 中内置的默认 SUN 供应器。

之后加上以下声明

  1. else try {

在上一步创建的文件中的行,准备初始程序结构

  1. KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");

初始化密钥对生成器

下一步是初始化密钥对生成器。所有密钥对生成器共享密钥大小和随机源的概念。 KeyPairGenerator类有一个initialize方法,它接受这两种类型的参数。

DSA 密钥生成器的密钥大小是密钥长度(以位为单位),您将设置为 1024。

随机源必须是SecureRandom类的一个实例,它提供加​​密强随机数生成器(RNG)。有关SecureRandom的更多信息,请参阅 SecureRandom API 规范Java 密码体系结构参考指南

以下示例请求使用 SHA1PRNG 算法的SecureRandom实例,由内置 SUN 供应器提供。然后,该示例将此SecureRandom实例传递给密钥对生成器初始化方法。

  1. SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
  2. keyGen.initialize(1024, random);

某些情况需要强大的随机值,例如在创建 RSA 公钥和私钥等高价值和长期密码时。为帮助指导应用程序选择合适的强SecureRandom实现,从 JDK 8 Java 发行版开始,在java.security.Security类的securerandom.strongAlgorithms属性中包含已知的强SecureRandom实现列表。在创建此类数据时,应考虑使用SecureRandom.getInstanceStrong(),因为它获取了已知强算法的实例。

生成一对密钥

最后一步是生成密钥对并将密钥存储在PrivateKeyPublicKey对象中。

  1. KeyPair pair = keyGen.generateKeyPair();
  2. PrivateKey priv = pair.getPrivate();
  3. PublicKey pub = pair.getPublic();