java

位置:IT落伍者 >> java >> 浏览文章

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


发布日期:2021年01月25日
 
如何在java中编程实现数字签名系统

生成密钥对

生成密钥对可用java提供的类KeyPairGenerator用其中的getInstance方法创建KeypairGenerator对象在用initialize进行初始化最后用generateKeyPair生成密钥对密钥对生成后就可以将其写入文件中通过网络或其他方式公告用户用户接收到数据文件和签名文件后就可以使用公约来校验数据文件的数字签名

判断数据在网络中的传输是否被非法修改

////GenerateKeyPairjava/////////////

import javaio*;

import javasecurity*;

public class GenerateKeyPair{

public static void main(String[] args){

boolean bHelp=false;//sign for show help

FileOutputStream fileOut;//输出密钥到文件

byte[] pubkey;//存储已编码的公钥字节

byte[] privKey;//存储已编码的私钥字节

if(argslength!=){

Systemoutprintln(Usage:GenerateKeyPair <keyname>;

Systemoutprintln(Option:);

Systemoutprintln(<keyname>:The key name that using to genera

te filename);

Systemexit();

}

try{

Systemoutprintln(Generating a key pair);

KeyPairGenarator keyGen=KeyPairGeneratorgetInstance(DSA);//使用DSA算法

KeyGeninitialize(new SecureRandom());

KeyPair pair=keyGengenerateKeyPair();

PublicKey pub=pairgetPublic();

PrivateKey priv=pairgetPrivate();

pubkey=pubgetEncoded();

privateKey= privgetEncoded();

fileOut=new FileOutputStream(PublicKey_+args[]);

fileOutwrite(pubKey);

fileOutclose();

fileOut=new FileOutputStream(privateKey_+args[]):

fileOutwrite(privateKey);

fileoutclose();

Systemoutprintln(OK!);

}catch(Exception e){

}

}

}

}

生成数字签名

从私钥文件读取数据文件并将其转换为PrivateKey对象可以使用KeyFactory类和PKCSEncodeKeySpec类KeyFactory可以利用给定的蜜月规范来建立不透明的密钥对象也可以适当的格式取出蜜月对象中的密钥信息 Signature是个引擎类提供了诸如DSA或是RSA with MD这样的数字签名算法

码学上安全的签名算法可接受任意大小的输入和一个私月并产生一个比较短的(常常是固定大小的)前名字揭穿并且签名和公钥部反映有关私钥的任何内容Signature对象即可用于数据签名也可用于校验某个签名是否为预制关联的数据的真实签名

签名或教研签名的第一步是创建signature实例为特定类型的签名算法或取signature对象的途径是调用signature德getInstance静态方法

初始化方法有两个取决于Signature的用途

initSign()////用于签名

initVerify()//用于校验

如果sigature初始化为签名则可将带钱数据通过update方法提供给对象在调用sign来产生签名即可

下面以一个实例来说明

///////////////////SignDatajava////////////////

import javaio*;

import javasecurity*;

import javasecurityspec*;

public class SignData{

public static void main(String [] args)

{

FileOutputStream fileOut;

byte b;

if(argslength!=)

{

Systemoutprintln(Usage:SignData <PrivateKey> <dataFile> <SignatureFile>);

Systemoutprintln(Option:);

Systemoutprintln(<PrivateKey>:The file name of the private Key);

Systemoutprintln(<DataFile>: The filename that want to signature);

Systemoutprintln(<signatureFile>:the filename containing signture data);

}

try{

Systemoutprintln(Generating a digital signature);

FileInputStream fileIn=new FileInputStream(args[]);

byte[] encodedprivateKey=new byte[fileInavailable()];

finleInread(encodedprivateKey);

fileInclose();

PKCSEncodeKeySpec privKeySpec=

new PKCSEncodeKeySpec(encodedprivateKey);

KeyFactory keyFactory=KeyFactorygetInstance(DSA);

PrivateKey privKey=keyFactorygeneratePrivate(privateKeySpec);

Signature dsa=SignaturegetInstance(SHA/DSA);

dsainitSign(privKey);

FileInputStream fis=new FileInputStream(args[]);

while(fisavailable()!=){

b=(byte)fisread();

dsaupdate(b);

}

fisclose();

byte[] sig=dsasign();

fileOut=new FileOutputStream(args[]);

fileOutwrite(sig);

fileOutclose();

Systemoutprintln(OK);

}catch(Exception e){

/////////

}

}

}

///////////////////////End of SignDatajava//////////////////

SignDatajava从文津中读取已编码的私钥字节利用PKCSEncodeKeySpec对象将已编码的四月字节转换为PrivateKey对象然后利用Signature签名数据文件生成签名数据并将签名数据写道文件中

//////VerifySignjava/////////////

import javaio*;

import javasecurity*;

import javasecurityspec*;

public class VerifySign{

public static void main(String [] args)

{

if(argslength!=){

Systemoutprintln(Usage:VerifySign <PublicKey> <dataFile> <SignatureFile>);

Systemoutprintln(Option:);

Systemoutprintln(<Public Key >The filename of the public key);

Systemoutprintln(<DataFile>The filename that want to signature);

Systemoutprintln(<SignatureFile>:The file name containing signature data);

Systemexit();

}

try{

FileInputStream fileIn=new FileInputStream(args[]);

byte[] encodedpubKey =new byte[fileInavailable()];

fileInread(encodedpubKey);

fileInclose();

XEncodedKeySpec pubKeySpec=

new XEncodedKeySpec(encodedpubKey);

KeyFactory keyFactory=KeyFactorygetInstance(DSA);

PublicKey pubKey=keyFactorygeneratePublic(pubKeySpec);

FileInputStream sigStream=new FileInputStream(args[]);

byte[] signature=new byte[sigStreamavailable()];

sigStreamread(signature);

sigStreamclose();

signature sigObj=SignaturegetInstance(SHAWithDSA);

sigObjinitVerify(pubKey);

fileIn=new FileInputStream(args[]);

byte b;

while(fileInavailable())!=)

{

b=(byte)fileInread();

sigObjupdate(b);

};

fileInclose();

boolean verifies=sigObjverify(signature);

Systemoutprintln(Signature verifies:+verifies);

}catch(Exception e){/////////////

}

}

}               

上一篇:Java中使用JCOM操作Office对象

下一篇:用Java制作十六进制编辑器