一个数字签名系统主要分为三个部分:
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签名数据文件,生成签名数据,并将签名数据写道文件中。