请教:关于DSA数字签名的私钥的存储和读取问题

Netguy 2004-03-25 09:58:01
我先产生了一对DSA密钥,并采用X.509格式分别保存到文件中,然后从文件中读进来还原成公钥和私钥。同样的处理对公钥没问题,但是在处理私钥时产生一个异常。请问该如何保存、加载私钥呢?请大家帮忙看看。谢谢

生成密钥对并保存到文件中:

private static void GenerateDSAKeyPair()
{
try
{
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
keyGen.initialize(1024);
KeyPair keypair = keyGen.genKeyPair();
PrivateKey privateKey = keypair.getPrivate();
PublicKey publicKey = keypair.getPublic();

X509EncodedKeySpec ksp = new X509EncodedKeySpec(publicKey.getEncoded());
FileOutputStream fos = new FileOutputStream("public.key");
fos.write(ksp.getEncoded());
fos.close();

ksp = new X509EncodedKeySpec(privateKey.getEncoded());
fos = new FileOutputStream("private.key");
fos.write(ksp.getEncoded());
fos.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}

从文件中读取私钥并还原成PrivateKey:

X509EncodedKeySpec prvKeySpec;
KeyFactory keyFactory;
prvKeySpec = new X509EncodedKeySpec(EncodedPrvKey); //EncodedPrvKey是从文件中读取的字节流
keyFactory = KeyFactory.getInstance("DSA", "SUN");
PrivateKey prvKey = keyFactory.generatePrivate(prvKeySpec); //这里产生异常

异常信息为:

java.security.spec.InvalidKeySpecException: Inappropriate key specification
at sun.security.provider.DSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at dsakeygen.main(dsakeygen.java:325)
...全文
320 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leemaasn 2004-03-25
  • 打赏
  • 举报
回复
没接触过,,,
帮Up
flying310 2004-03-25
  • 打赏
  • 举报
回复
把私钥放在另一个文件中然后把整个文件做为密钥。
whyxx 2004-03-25
  • 打赏
  • 举报
回复
郁闷的问题是经常遇到的,我以前发过几个200分的求助贴,都是没人回答自己就搞定了.
Netguy 2004-03-25
  • 打赏
  • 举报
回复
倒,仔细查了文档,发现原来PrivateKey的编码应该用PKCS8规范,PublicKey才是X.509规范。搞定了。
数字签名标准(DSS)的研究与实现 1. 引言 5 2.数论基础 6 2.1 基本定义 6 2.2 散对数问题 7 3.数字签名标准DSS 9 3.1 DSA算法描述 9 3.1.1 DSA算法参数 9 3.1.2 DSA签名过程 9 3.1.3 DSA签名验证 10 3.2 DSA算法证明 10 3.3 DSA算法变形 11 3.3.1 Yen和Laih的改进方法1 12 3.3.2 Yen和Laih的改进方法2 12 3.3.3 Naccache的改进方法 12 4. DSS参数产生 13 4.1 DSA素数产生 13 4.1.1 Miller-Rabin概率素性检验算法 13 4.1.2 DSA素数产生算法 14 4.1.3 任意长度素数生成算法 16 4.2 DSA的随机数产生算法 16 4.2.1 产生m个DSA私钥的算法 16 4.2.2 产生m个DSA每消息密钥数的算法 17 4.2.3 SHA-1构造函数G(t,c) 17 4.2.4 利用SHA-1构造任意长度随机数 18 4.3 DSA其他参数的产生 18 4.3.1 产生DSA的g算法 18 4.3.2 计算 的算法 19 4.3.3 SHA-1算法 19 5. 数字签名标准DSS的Java实现 24 5.1 DSA素数产生的Java实现 27 5.1.1 Miller-Rabin概率素性检验算法的Java实现 27 5.1.2 DSA素数产生算法的Java实现 28 5.1.3 任意长度素数生成算法 30 5.2 DSA随机数产生算法的Java实现 31 5.2.1 产生m个DSA私钥的算法的Java实现 31 5.2.2 产生m个DSA每消息秘密数的算法的Java实现 32 5.2.3 利用SHA-1构造单向函数G(t,c)算法的Java实现 33 5.2.4 利用SHA-1构造任意长度随机数的Java实现 34 5.3 DSA其他参数产生算法的Java实现 35 5.3.1 生成DSA的g算法的Java实现 35 5.3.2 计算 算法的Java实现 36 5.3.3 生成DSA公钥的Java实现 36 5.3.4 求模幂 的Java实现 37 5.3.5 SHA-1的Java实现 38 5.4 本文Java实现的数字签名标准(DSS)测试 38 5.4.1 本文Java实现的DSS签名测试 38 5.4.2本文Java实现的SHA-1测试 39 5.4.3本文Java实现的其他参数测试 40 6. DSS数字签名的应用 41 结束语 42 致谢 43 参考文献 44

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧