JAVA上加密演算法的實現用例(2)
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;);
相關文章
- Java中Blowfish加密演算法實現Java加密演算法
- QQ TEA加密演算法 JAVA實現加密演算法Java
- Java實現常用加密演算法-SM4Java加密演算法
- Hanlp分詞例項:Java實現TFIDF演算法HanLP分詞Java演算法
- 【Java】跳躍表的實現以及用例測試Java
- 用 Java 實現的八種常用排序演算法Java排序演算法
- [2]十道演算法題【Java實現】演算法Java
- 單例模式的 Java 實現與思考單例模式Java
- 【JS 逆向百例】醫保局 SM2+SM4 國產加密演算法實戰JS加密演算法
- v2ray實現偽加密加密
- 用Rust實現單例Rust單例
- PHP 實現 Base64 加密演算法PHP加密演算法
- Java 實現單例模式的 9 種方法Java單例模式
- 單例模式的各種實現方式(Java)單例模式Java
- 量子圖形加密演算法的MATLAB程式碼實現加密演算法Matlab
- 使用Java中的Luhn演算法實現信用卡驗證 - Java2BlogJava演算法
- 用 Java 實現常見的 8 種內部排序演算法Java排序演算法
- 線上出現bug解決用例
- PAT1048數字加密(java實現)加密Java
- 使用Java加密與解密實現步驟Java加密解密
- 排序演算法Java實現排序演算法Java
- KMP演算法 Java實現KMP演算法Java
- 排序演算法 Java實現排序演算法Java
- 用例驅動實現DDD的方法 - codex
- Java中Blowfish加密演算法Java加密演算法
- Java 常用加密解密演算法Java加密解密演算法
- Twitter雪花演算法SnowFlake演算法的java實現演算法Java
- 推薦演算法在用例排序最佳化上的應用演算法排序
- 淺談常見的七種加密演算法及實現加密演算法
- 一文帶你學會國產加密演算法SM4的java實現方案加密演算法Java
- 演算法案例2-求冰雹數 java程式碼實現演算法Java
- java實現MD5加鹽加密方法Java加密
- Java 利用列舉實現單例模式Java單例模式
- Java中6種單例實現方法Java單例
- 五種方式實現 Java 單例模式Java單例模式
- JAVA中實現單例(Singleton)模式的八種方式Java單例模式
- 設計模式:單例模式的使用和實現(JAVA)設計模式單例Java
- Java安全之安全加密演算法Java加密演算法
- 有向圖的基本演算法-Java實現演算法Java