Digital Signature Algorithm (DSA)是Schnorr和ElGamal簽名算法的變種,被美國NIST作為DSS(DigitalSignature Standard)。
算法中應(yīng)用了下述參數(shù): p:L bits長的素數(shù)。L是64的倍數(shù),范圍是512到1024; q:p - 1的160bits的素因子; g:g = h^((p-1)/q) mod p,h滿足h < p - 1, h^((p-1)/q) mod p > 1; x:x < q,x為私鑰 ; y:y = g^x mod p ,( p, q, g, y )為公鑰; H( x ):One-Way Hash函數(shù)。DSS(FIPS186-4)中選用SHA-1或者SHA-2( Secure Hash Algorithm系列中的2個較新版本,其中SHA-2有4個,SHA-224,SHA-256,SHA-384,SHA-512,最原始的SHA已經(jīng)不再被使用)。 p, q, g可由一組用戶共享,但在實際應(yīng)用中,使用公共模數(shù)可能會帶來一定的威脅。簽名及驗證協(xié)議如下:
(1)編碼實現(xiàn)DSA算法,源代碼如下:
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.interfaces.DSAPrivateKey;
import java.security.interfaces.DSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.xml.bind.DatatypeConverter;
public class DSAUtil {
private static String src = "I LOVE CHINA!";
public static void main(String[] args) {
jdkDSA();
}
public static void jdkDSA() {
// 1. 初始化 秘鑰
try {
KeyPairGenerator generator = KeyPairGenerator.getInstance("DSA");
generator.initialize(512);
KeyPair keyPair = generator.generateKeyPair();
DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();
DSAPrivateKey dsaPrivateKey = (DSAPrivateKey) keyPair.getPrivate();
System.out.println("public="+dsaPublicKey);
System.out.println("x="+dsaPrivateKey.getX());
// 2。 執(zhí)行簽名
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());
KeyFactory factory = KeyFactory.getInstance("DSA");
PrivateKey privateKey = factory.generatePrivate(pkcs8EncodedKeySpec);
Signature signature = Signature.getInstance("SHA1withDSA");
signature.initSign(privateKey);
signature.update(src.getBytes());
byte[] sign = signature.sign();
System.out.println("sign=\n"+DatatypeConverter.printHexBinary(sign));
// 驗證簽名
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded());
factory = KeyFactory.getInstance("DSA");
PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec);
signature = Signature.getInstance("SHA1withDSA");
signature.initVerify(publicKey);
signature.update(src.getBytes());
boolean verify = signature.verify(sign);
System.out.println(verify);
} catch (Exception e) {
e.printStackTrace();
}
}
}
1、KeyPairGenerator KeyPairGenerator 類用于生成公鑰和私鑰對。密鑰對生成器是使用 getInstance 工廠方法(返回一個給定類的實例的靜態(tài)方法)構(gòu)造的。 特定算法的密鑰對生成器可以創(chuàng)建能夠與此算法一起使用的公鑰/私鑰對。它還可以將特定于算法的參數(shù)與每個生成的密鑰關(guān)聯(lián)。 有兩種生成密鑰對的方式:與算法無關(guān)的方式和特定于算法的方式。 下面我們將按照指定RSA算法去生成秘鑰KeyPairGenerator.getInstance("RSA"); 2、DSAPublicKey DSA 公用密鑰的接口 3、DSAPublicKey DSA 專用密鑰的接口 4、PKCS8EncodedKeySpec PKCS8EncodedKeySpec類繼承EncodedKeySpec類,以編碼格式來表示私鑰。 PKCS8EncodedKeySpec類使用PKCS#8標準作為密鑰規(guī)范管理的編碼格式 5、Signature Signature 類用來為應(yīng)用程序提供數(shù)字簽名算法功能。數(shù)字簽名用于確保數(shù)字數(shù)據(jù)的驗證和完整性。 在所有算法當中,數(shù)字簽名可以是 NIST 標準的 DSA,它使用 DSA 和 SHA-1??梢詫⑹褂?SHA-1 消息摘要算法的 DSA 算法指定為 SHA1withDSA。
q= fca682ce 8e12caba 26efccf7 110e526d b078b05e decbcd1e b4a208f3 ae1617ae 01f35b91 a47e6df6 3413c5e1 2ed0899b cd132acd 50d99151 bdc43ee7 37592e17 ,
p= 962eddcc 369cba8e bb260ee6 b6a126d9 346e38c5
,
g= 678471b2 7a9cf44e e91a49c5 147db1a9 aaf244f0 5a434d64 86931d2d 14271b9e
35030b71 fd73da17 9069b32e 2935630e 1c206235 4d0da20a 6c416e50 be794ca4 ;
x=138516119351592938244070748724284462948007803693 ,
y= 49db7b9c a9183fbb 00a501e7 6daf9d92 860858cd adf45cfb 9d872326 3dd7c6b5 4fc5f98e adba02dc f3ba65c3 5f3514d8 4c9c9425 ee761ceb a54a05ed 084e3e7c 。
302D021500833DF27D1E55304611F1E82AF7602747D85F01DA0214711A399689EF29756E3D46A59CBE219C9E590A67
更多建議: