一个数字签名系统主要分为三个部分: 
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.*; SAAS 
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){///////////// 


}