DSA签名算法 - Java加密与安全
生活随笔
收集整理的這篇文章主要介紹了
DSA签名算法 - Java加密与安全
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
DSA簽名算法DSA就是Digital Signature Algorithm,他使用的是EIGamal數(shù)字簽名算法DSA只能配合SHA使用:1. 所以有SHA1withDSA2. SHA256withDSA3. SHA512withDSA和RSA數(shù)字簽名相比,DSA的簽名算法更快
package com.learn.securl;import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;/*** 用DSA簽名的時候和RSA是完全一樣的* 可以看到使用DSA和RSA簽名是非常類似的* 用公鑰簽名的結(jié)果為true* 修改原始簽名的結(jié)果為false* @author Leon.Sun**/
public class SecDSASignature {PrivateKey sk;PublicKey pk;/*** 生成公鑰/私鑰對* @throws GeneralSecurityException*/public SecDSASignature() throws GeneralSecurityException{/*** 只是算法名稱從RSA變成了DSA*/KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DSA");kpGen.initialize(1024);KeyPair kp = kpGen.generateKeyPair();this.sk = kp.getPrivate();this.pk = kp.getPublic();}/*** 從以保存的字節(jié)中(例如:讀取文件)恢復(fù)公鑰/私鑰* @param pk* @param sk* @throws GeneralSecurityException*/public SecDSASignature(byte[] pk, byte[] sk) throws GeneralSecurityException{KeyFactory kf = KeyFactory.getInstance("DSA");X509EncodedKeySpec pkSpec = new X509EncodedKeySpec(pk);this.pk = kf.generatePublic(pkSpec);PKCS8EncodedKeySpec skSpec = new PKCS8EncodedKeySpec(sk);this.sk = kf.generatePrivate(skSpec);}/*** 把私鑰導(dǎo)出為字節(jié)* @return*/public byte[] getProvateKey(){return this.sk.getEncoded();}/*** 把公鑰導(dǎo)出為字節(jié)* @return*/public byte[] getPublicKey(){return this.pk.getEncoded();}/*** sign by sk* @param message* @return* @throws GeneralSecurityException*/public byte[] sign(byte[] message) throws GeneralSecurityException{Signature signature = Signature.getInstance("SHA1withDSA");signature.initSign(this.sk);signature.update(message);return signature.sign();}/*** sign by pk* @param message* @param sign* @return* @throws GeneralSecurityException*/public boolean verify(byte[] message, byte[] sign) throws GeneralSecurityException{Signature signature = Signature.getInstance("SHA1withDSA");signature.initVerify(this.pk);signature.update(message);return signature.verify(sign);}public static void main(String[] args) throws Exception{byte[] message = "Hello, 使用SHA1withDSA算法進(jìn)行數(shù)字簽名!".getBytes();SecDSASignature rsas = new SecDSASignature();byte[] sign = rsas.sign(message);System.out.println("sign: " + Base64.getEncoder().encodeToString(sign));boolean verified = rsas.verify(message, sign);System.out.println("verify: " + verified);// 用另一個公鑰驗證:boolean verified2 = new SecDSASignature().verify(message, sign);System.out.println("verify with another public key: " + verified2);// 修改原始信息:message[0] = 100;boolean verified3 = rsas.verify(message, sign);System.out.println("verify changed message: " + verified3);}
}
最后我們總結(jié)一下:1. DSA是另一種數(shù)字簽名算法2. 還有另一種數(shù)字簽名算法,例如ECDSA:Elliptic Curve Digital Signature Algorithm(Bouncy Castle)
?
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的DSA签名算法 - Java加密与安全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RSA签名算法 - Java加密与安全
- 下一篇: 数字证书 - Java加密与安全