密碼學(xué) DSA算法

2020-07-31 13:46 更新

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. P產(chǎn)生隨機數(shù)k,k < q;
  2. P計算 r = ( g^k mod p ) mod q s = ( k^(-1) (H(m) + xr)) mod q 簽名結(jié)果是( m, r, s )。
  3. 驗證時計算 w = s^(-1)mod q u1 = ( H( m ) w ) mod q u2 = ( r w ) mod q v = (( g^u1 * y^u2 ) mod p ) mod q 若v = r,則認為簽名有效。 DSA是基于整數(shù)有限域離散對數(shù)難題的,其安全性與RSA相比差不多。DSA的一個重要特點是兩個素數(shù)公開,這樣,當使用別人的p和q時,即使不知道私鑰,你也能確認它們是否是隨機產(chǎn)生的,還是作了手腳。RSA算法卻做不到。

JAVA代碼實現(xiàn)

(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 。

對明文“I LOVE CHINA.”生成簽名消息

302D021500833DF27D1E55304611F1E82AF7602747D85F01DA0214711A399689EF29756E3D46A59CBE219C9E590A67

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號