数字签名实例代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

一个数字签名系统主要分为三个部分:

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 ;

System.out.println("Option:");

System.out.println(":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 "); System.out.println("Option:");

System.out.println(":The file name of the private Key.");

System.out.println(": The filename that want to signature."); System.out.println(":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]);

相关文档
最新文档