# 输入和转换编码的公钥字节

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

接下来，`VerSig`需要从指定为第一个命令行参数的文件中导入编码的公钥字节，并将它们转换为`PublicKey`。需要`PublicKey`，因为这是`Signature` `initVerify`方法为了初始化`Signature`对象进行验证所需的。

首先，读入编码的公钥字节。

```
FileInputStream keyfis = new FileInputStream(args[0]);
byte[] encKey = new byte[keyfis.available()];  
keyfis.read(encKey);

keyfis.close();

```

现在字节数组`encKey`包含编码的公钥字节。

您可以使用`KeyFactory`类从其编码中实例化 DSA 公钥。 `KeyFactory`类提供不透明键（类型`Key`）和键规范之间的转换，键规范是底层密钥材料的透明表示。使用不透明密钥，您可以获得算法名称，格式名称和编码密钥字节，但不能获取密钥材料，例如，密钥材料可能包含密钥本身和用于计算密钥的算法参数。 （注意`PublicKey`，因为它扩展了`Key`，本身就是`Key`。）

所以，首先你需要一个关键规范。您可以通过以下方式获得一个，假设密钥是根据 X.509 标准编码的，例如，如果密钥是使用 SUN 提供商提供的内置 DSA 密钥对生成器生成的：

```
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);

```

现在您需要`KeyFactory`对象来进行转换。该对象必须是与 DSA 密钥一起使用的对象。

```
KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");

```

最后，您可以使用`KeyFactory`对象从密钥规范生成`PublicKey`。

```
PublicKey pubKey =
    keyFactory.generatePublic(pubKeySpec);

```