本教程是针对JDK 8编写的。本页面描述的示例和实践未利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变更以了解Java SE 9及后续版本中更新的语言特性的概要。
请参阅JDK版本说明以获取所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
接下来,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);
现在您需要一个能够与DSA密钥一起工作的KeyFactory
对象来进行转换。
KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
最后,您可以使用KeyFactory
对象从密钥规范生成PublicKey
。
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);