# 生成公钥和私钥

> 原文： [https://docs.oracle.com/javase/tutorial/security/apisign/step2.html](https://docs.oracle.com/javase/tutorial/security/apisign/step2.html)

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

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

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

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

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

创建密钥对生成器

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

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

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

之后加上以下声明

```
else try {

```

在上一步创建的文件中的行，[准备初始程序结构](step1.html)：

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

```

初始化密钥对生成器

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

DSA 密钥生成器的密钥大小是密钥长度（以位为单位），您将设置为 1024。

随机源必须是`SecureRandom`类的一个实例，它提供加​​密强随机数生成器（RNG）。有关`SecureRandom`的更多信息，请参阅 [SecureRandom API 规范](https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html)和 [Java 密码体系结构参考指南](https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#SecureRandom)。

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

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

```

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

生成一对密钥

最后一步是生成密钥对并将密钥存储在`PrivateKey`和`PublicKey`对象中。

```
KeyPair pair = keyGen.generateKeyPair();
PrivateKey priv = pair.getPrivate();
PublicKey pub = pair.getPublic();

```