JAVA上加密演算法的實現用例(2)

weixin_34247155發表於2016-12-29

JAVA上加密演算法的實現用例(2)

新增要簽名的資訊

public final byte[] sign()

throws SignatureException

返回簽名的陣列,前提是initSign和update

public final void initVerify(PublicKey publicKey)

throws InvalidKeyException

JAVA工程師介紹,用指定的公鑰初始化

引數:publicKey 驗證時用的公鑰

public final boolean verify(byte[] signature)

throws SignatureException

驗證簽名是否有效,前提是已經initVerify初始化

引數: signature 簽名陣列

*/

import Java.security.*;

import java.security.spec.*;

public class testdsa {

public static void main(String[] args) throws

java.security.NoSUChAlgorithmException,java.lang.Exception {

testdsa my=new testdsa();

my.run();

}

public void run()

{

//數字簽名生成金鑰

//第一步生成金鑰對,假如已經生成過,本過程就可以跳過,對使用者來講myprikey.dat要儲存在本地

//而mypubkey.dat給釋出給其它使用者

if ((new java.io.File(quot;myprikey.datquot;)).exists()==false) {

if (generatekey()==false) {

System.out.println(quot;生成金鑰對敗quot;);

return;

};

}

//第二步,此使用者

//從檔案中讀入私鑰,對一個字串進行簽名後儲存在一個檔案(myinfo.dat)中

//並且再把myinfo.dat傳送出去

//為了方便數字簽名也放進了myifno.dat檔案中,當然也可分別傳送

try {

java.io.ObjectInputStream in=new java.io.ObjectInputStream(new

java.io.FileInputStream(quot;myprikey.datquot;));

PrivateKey myprikey=(PrivateKey)in.readObject();

in.close();

// java.security.spec.X509EncodedKeySpec pubX509=new

java.security.spec.X509EncodedKeySpec(bX509);

//java.security.spec.X509EncodedKeySpec

pubkeyEncode=java.security.spec.X509EncodedKeySpec

String myinfo=quot;這是我的資訊quot;; //要簽名的資訊

//用私鑰對資訊生成數字簽名

java.security.Signature

signet=java.security.Signature.getInstance(quot;DSAquot;);

signet.initSign(myprikey);

signet.update(myinfo.getBytes());

byte[] signed=signet.sign(); //對資訊的數字簽名

System.out.println(quot;signed(簽名內容)=quot;+byte2hex(signed));

//把資訊和數字簽名儲存在一個檔案中

java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new

java.io.FileOutputStream(quot;myinfo.datquot;));

out.writeObject(myinfo);

out.writeObject(signed);

out.close();

System.out.println(quot;簽名並生成檔案成功quot;);

}

catch (java.lang.Exception e) {

e.printStackTrace();

System.out.println(quot;簽名並生成檔案失敗quot;);

};

//第三步

//其他人通過公共方式得到此戶的公鑰和檔案

//其他人用此戶的公鑰,對檔案進行檢查,假如成功說明是此使用者釋出的資訊.

//

try {

java.io.ObjectInputStream in=new java.io.ObjectInputStream(new

java.io.FileInputStream(quot;mypubkey.datquot;));

PublicKey pubkey=(PublicKey)in.readObject();

in.close();

System.out.println(pubkey.getFormat());

in=new java.io.ObjectInputStream(new

java.io.FileInputStream(quot;myinfo.datquot;));

String info=(String)in.readObject();

byte[] signed=(byte[])in.readObject();

in.close();

java.security.Signature

signetcheck=java.security.Signature.getInstance(quot;DSAquot;);

signetcheck.initVerify(pubkey);

signetcheck.update(info.getBytes());

if (signetcheck.verify(signed)) {

System.out.println(quot;info=quot;+info);

System.out.println(quot;簽名正常quot;);

}

else System.out.println(quot;非簽名正常quot;);

}

catch (java.lang.Exception e) {e.printStackTrace();};

}

//生成一對檔案myprikey.dat和mypubkey.dat---私鑰和公鑰,

//公鑰要使用者傳送(檔案,網路等方法)給其它使用者,私鑰儲存在本地

public boolean generatekey()

{

try {

java.security.KeyPairGenerator

keygen=java.security.KeyPairGenerator.getInstance(quot;DSAquot;);

// SecureRandom secrand=new SecureRandom();

// secrand.setSeed(quot;ttttquot;.getBytes()); //初始化隨機產生器

// keygen.initialize(576,secrand); //初始化金鑰生成器

keygen.initialize(512);

KeyPair keys=keygen.genKeyPair();

// KeyPair keys=keygen.generateKeyPair(); //生成金鑰組

PublicKey pubkey=keys.getPublic();

PrivateKey prikey=keys.getPrivate();

java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new

java.io.FileOutputStream(quot;myprikey.datquot;));

out.writeObject(prikey);

out.close();

System.out.println(quot;寫入物件 prikeys okquot;);

out=new java.io.ObjectOutputStream(new

java.io.FileOutputStream(quot;mypubkey.datquot;));

out.writeObject(pubkey);

out.close();

System.out.println(quot;寫入物件 pubkeys okquot;);

System.out.println(quot;生成金鑰對成功quot;);

return true;

}

catch (java.lang.Exception e) {

e.printStackTrace();

System.out.println(quot;生成金鑰對失敗quot;);

相關文章