數字簽名示例程式 Java編寫
package com.eos.lighting.java.test;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
public class TestDS {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestDS test=new TestDS();
test.run();
}
public void run()
{
if((new java.io.File("myprikey.dat")).exists()==false)
{
if(generateKey()==false)
{
return;
}
}
try
{
java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));
PrivateKey myprikey=(PrivateKey)in.readObject();
in.close();
//java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec();
String myinfo="這是我的資訊這是我的資訊這是我的資訊這是我的資訊這是我的資訊這是我的資訊這是我的資訊這是我的資訊這是我的資訊這是我的資訊這是我的資訊";
java.security.Signature signet=java.security.Signature.getInstance("DSA");
signet.initSign(myprikey);
signet.update(myinfo.getBytes());
byte[] signed=signet.sign();
System.out.println("signed(簽名內容)= "+this.byte2hex(signed));
//把資訊和數字簽名儲存在一個檔案中
java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat"));
out.writeObject(myinfo);
out.writeObject(signed);
out.close();
System.out.println("簽名並生成檔案成功");
}
catch(Exception e)
{
e.printStackTrace();
}
//其它人通過公共方式得到此戶的公鑰和檔案
try{
java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));
PublicKey pubkey=(PublicKey)in.readObject();
in.close();
System.out.println(pubkey.getFormat());
in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat"));
String info=(String)in.readObject();
byte[] signed=(byte[])in.readObject();
in.close();
java.security.Signature signetcheck=java.security.Signature.getInstance("DSA");
signetcheck.initVerify(pubkey);
signetcheck.update(info.getBytes());
if(signetcheck.verify(signed))
{
System.out.println("info = "+info);
System.out.println("簽名正常");
}
else
System.out.println("非簽名正常");
}
catch(Exception e)
{
e.printStackTrace();
}
}
public boolean generateKey()
{
try
{
java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance("DSA");
keygen.initialize(1024);
KeyPair keys=keygen.genKeyPair();
PublicKey pubkey=keys.getPublic();
PrivateKey prikey=keys.getPrivate();
java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat"));
out.writeObject(prikey);
out.close();
System.out.println("寫入物件 prikeys ok");
out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat"));
out.writeObject(pubkey);
out.close();
System.out.println("寫入物件 pubkeys od");
System.out.println("生成金鑰對成功");
return true;
}
catch(Exception e)
{
e.printStackTrace();
System.out.println("生成金鑰對失敗");
return false;
}
//return true;
}
public String byte2hex(byte[] b)
{
String hs="";
String stmp="";
for(int n=0;n<b.length;n++)
{
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if(stmp.length()==1)
hs=hs+'0'+stmp;
else
hs=hs+stmp;
if(n<b.length-1)
hs=hs+':';
}
return hs.toUpperCase();
}
}