在java中编程实现数字签名系统

原创 2003年05月30日 14:53:00
一个数字签名系统主要分为三个部分:
1。生成密钥对
2。在数据发送端对数据进行签名
3。在数据接收端对数据进行校验数据签名
下面从这三个方面分别说明:
1。生成密钥对
生成密钥对可用java提供的类KeyPairGenerator,用其中的getInstance方法创建KeypairGenerator对象,在用initialize进行初始化,最后用generateKeyPair生成密钥对,密钥对生成后,就可以将其写入文件中。通过网络或其他方式公告用户,用户接收到数据文件和签名文件后,就可以使用公约来校验数据文件的数字签名,

;判断数据在网络中的传输是否被非法修改。
////GenerateKeyPair.java/////////////
import java.io.*;
import java.security.*;
public class GenerateKeyPair{
public static void main(String[] args){
boolean bHelp=false;//sign for show help.
FileOutputStream fileOut;//输出密钥到文件
byte[] pubkey;//存储已编码的公钥字节
byte[] privKey;//存储已编码的私钥字节
if(args.length!=1){
System.out.println("Usage:GenerateKeyPair <keyname>;
System.out.println("Option:");
System.out.println("<keyname>:The key name that using to genera
te filename.");
System.exit(0);
}
try{
System.out.println("Generating a key pair.....");
KeyPairGenarator keyGen=KeyPairGenerator.getInstance("DSA");//使用DSA算法
KeyGen.initialize(1024,new SecureRandom());
KeyPair pair=keyGen.generateKeyPair();
PublicKey pub=pair.getPublic();
PrivateKey priv=pair.getPrivate();
pubkey=pub.getEncoded();
privateKey= priv.getEncoded();
fileOut=new FileOutputStream("PublicKey_"+args[0]);
fileOut.write(pubKey);
fileOut.close();
fileOut=new FileOutputStream("privateKey_"+args[0]):
fileOut.write(privateKey);
file.out.close();
System.out.println("OK!");
}catch(Exception e){
}
}
}
}

2.生成数字签名
从私钥文件读取数据文件并将其转换为PrivateKey对象,可以使用KeyFactory类和PKCS8EncodeKeySpec类。KeyFactory可以利用给定的蜜月规范来建立不透明的密钥对象,也可以适当的格式取出蜜月对象中的密钥信息。 Signature是个引擎类,提供了诸如DSA或是RSA with MD5这样的数字签名算法。密
码学上安全的签名算法可接受任意大小的输入和一个私月,并产生一个比较短的(常常是固定大小的)前名字揭穿。并且,签名和公钥部反映有关私钥的任何内容。Signature对象即可用于数据签名,也可用于校验某个签名是否为预制关联的数据的真实签名。

签名或教研签名的第一步是创建signature实例,为特定类型的签名算法或取signature对象的途径是调用signature德getInstance静态方法
初始化方法有两个,取决于Signature的用途:
initSign(...)////用于签名
initVerify(.....)//用于校验
如果sigature初始化为签名,则可将带钱数据通过update方法提供给对象在调用sign来产生签名即可。
下面以一个实例来说明。
///////////////////SignData.java////////////////
import java.io.*;
import java.security.*;
import java.security.spec.*;
public class SignData{
public static void main(String [] args)
{
FileOutputStream fileOut;
byte b;
if(args.length!=3)
{
System.out.println("Usage:SignData <PrivateKey> <dataFile> <SignatureFile>");
System.out.println("Option:");
System.out.println("<PrivateKey>:The file name of the private Key.");
System.out.println("<DataFile>: The filename that want to signature.");
System.out.println("<signatureFile>:the filename containing signture data.");
}
try{
System.out.println("Generating a digital signature....");
FileInputStream fileIn=new FileInputStream(args[0]);
byte[] encodedprivateKey=new byte[fileIn.available()];

finleIn.read(encodedprivateKey);
fileIn.close();

PKCS8EncodeKeySpec privKeySpec=
new PKCS8EncodeKeySpec(encodedprivateKey);
KeyFactory keyFactory=KeyFactory.getInstance("DSA");
PrivateKey privKey=keyFactory.generatePrivate(privateKeySpec);
Signature dsa=Signature.getInstance("SHA/DSA");
dsa.initSign(privKey);
FileInputStream fis=new FileInputStream(args[1]);
while(fis.available()!=0){
b=(byte)fis.read();
dsa.update(b);
}
fis.close();
byte[] sig=dsa.sign();
fileOut=new FileOutputStream(args[2]);
fileOut.write(sig);
fileOut.close();
System.out.println("OK");
}catch(Exception e){
/////////
}
}
}
///////////////////////End of SignData.java//////////////////
SignData.java从文津中读取已编码的私钥字节,利用PKCS8EncodeKeySpec对象将已编码的四月字节转换为PrivateKey对象,然后利用Signature签名数据文件,生成签名数据,并将签名数据写道文件中。

//////VerifySign.java/////////////
import java.io.*;
import java.security.*;
import java.security.spec.*;
public class VerifySign{
public static void main(String [] args)
{
if(args.length!=3){
System.out.println("Usage:VerifySign <PublicKey> <dataFile> <SignatureFile>");
System.out.println("Option:");
System.out.println("<Public Key >The filename of the public key.");
System.out.println("<DataFile>The filename that want to signature");
System.out.println("<SignatureFile>:The file name containing signature data.");
System.exit(0);
}
try{
FileInputStream fileIn=new FileInputStream(args[0]);
byte[] encodedpubKey =new byte[fileIn.available()];
fileIn.read(encodedpubKey);
fileIn.close();
X509EncodedKeySpec pubKeySpec=
new X509EncodedKeySpec(encodedpubKey);
KeyFactory keyFactory=KeyFactory.getInstance("DSA");
PublicKey pubKey=keyFactory.generatePublic(pubKeySpec);
FileInputStream sigStream=new FileInputStream(args[2]);
byte[] signature=new byte[sigStream.available()];
sigStream.read(signature);
sigStream.close();
signature sigObj=Signature.getInstance("SHA1WithDSA");
sigObj.initVerify(pubKey);
fileIn=new FileInputStream(args[1]);
byte b;
while(fileIn.available())!=0)
{
b=(byte)fileIn.read();
sigObj.update(b);
};
fileIn.close();
boolean verifies=sigObj.verify(signature);
System.out.println("Signature verifies:"+verifies);
}catch(Exception e){/////////////
}
}
}

 

DES、RSA、RSA数字签名、MD5、SHA 加密解密代码

///     /// 作者:李照     /// 时间:2014-06-05 15:56:23     ///     public static class E...
  • Icelove111
  • Icelove111
  • 2014年08月01日 14:21
  • 1239

Java实现数字签名

一、数字签名算法概述    签名认证是对非对称加密技术与数字摘要技术的综合运用,指的是将通信内容的摘要信息使用发送者的私钥进行加密,然后将密文与原文一起传输给信息的接收者,接收者通过发送者的公钥信息来...
  • lovelichao12
  • lovelichao12
  • 2017年07月12日 14:35
  • 2393

创建PowerShell脚本数字签名认证

.
  • itanders
  • itanders
  • 2014年06月17日 18:18
  • 2461

利用MS的CAPICOM控件与Java结合实现B/S系统中的数字签名

利用MS的CAPICOM控件与Java结合实现B/S系统中的数字签名 作者:  来自:  阅读次数: [大 中 小] -----------------------------------------...
  • lilo2
  • lilo2
  • 2006年02月27日 23:28
  • 2299

Java 数字签名原理及产生

比如对于applet 来说,它可以保护用户(客户端) 文件和私人数据不被恶意的程序或病毒感染和破坏,鉴别代码提供者的身份。对于开发者而言,通过使用API方法,能够将安全性功能集成到应用程序中,因为AP...
  • oscar999
  • oscar999
  • 2013年12月16日 20:39
  • 8530

Oracle EBS Forms数字签名无法验证卡住解决方法

Oracle EBS Forms正常情况下安装JRE 6+火狐浏览器可以正常打开Forms界面,但某些用户的新电脑有时候会出现不管用什么浏览器都会卡住在下面的界面,打钩点不了, 案例“运行”也点不了,...
  • sunansheng
  • sunansheng
  • 2017年03月17日 15:03
  • 15174

日常小结-RSA加密算法、数字签名和数字证书及其java实现

前段时间遇到过RSA这里把前段时间学到的东西做一些总结:RSARSA是目前为止应用最为广泛的非对称加密算法。非对称加密算法简单的说就是分成公钥和私钥。加密和解密采用不同的算法实现,这样的好处是不需要像...
  • u011518120
  • u011518120
  • 2016年08月11日 19:54
  • 1626

Java加解密密和数字签名

最近初步接触了下Java加密和数字签名的相关内容,目前学习的主要内容如下: 1)消息摘要 2)私钥加密 3)公钥加密 4)数字签名 5)数字证书  以下是对这几步的代码实例,代码就是我...
  • sunguangran
  • sunguangran
  • 2011年09月02日 11:36
  • 15112

基于java的数字签名技术在电子政务中的应用

肖蕾    杨世平      摘要  本文介绍了数字签名技术在电子政务中的应用,传统的数字签名技术都是基于非对称的密码算法,原文以明文的方式传送,在这种方式下,原文的安全性受到了极大的威胁,因此,...
  • shine0181
  • shine0181
  • 2012年02月29日 17:27
  • 1555

如何验证PDF文档中的数字签名

编辑--首选项--安全性--高级首选项--windows集成--勾选 确认签名项
  • wzyzzu
  • wzyzzu
  • 2016年01月21日 16:41
  • 370
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在java中编程实现数字签名系统
举报原因:
原因补充:

(最多只允许输入30个字)