Importing 和转换编码的公钥字节

接下来,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);
首页