4.3 DSA數(shù)字簽名技術(shù)

數(shù)字簽名技術(shù) -- DSA算法

DSA算法是1991年美國國家標準技術(shù)協(xié)會公布的數(shù)字簽名標準(DSS)的核心算法浦箱。DSA算法本質(zhì)是ElGamal數(shù)字簽名算法棒掠,僅能與SHA系列算法結(jié)合,沒有相應(yīng)的MD融合算法蜂绎。

DSA算法和RSA算法的異同

DSA算法是DSS技術(shù)的核心算法娇昙,與RSA算法的異同如下:

  • 二者都是數(shù)字簽名算法中的重要組成谓晌,缺一不可具温;
  • DSA算法僅僅包含數(shù)字簽名算法蚕涤,一般不用于加密算法中;
  • DSA算法僅產(chǎn)生數(shù)字證書铣猩,信息僅能用于驗證揖铜,不適合進行加密通信,所以HTTPS不會使用這個算法剂习;
  • RSA算法包含加解密的密鑰信息蛮位,同時可作為數(shù)字簽名算法较沪;

下面是一段DSA和RSA的不同的比較原文鳞绕,可以參考下:

The main difference is in RSA ,message hash value is generated then this hash value is encryption using sender's private key this is treated as a signature and this signature is pretended with message .then receiver side perform decryption using sender's public key and this compare with new hash value that are generate by msg if both are same then msg is accepted otherwise rejected.

But in DSS approach additional add a signing algorithm that take input as a hash value of msg,random key ,global public key and sender's private key then the output is pretended to the msg . at receiver side pass the result (output), signature and msg, as well as global public key using this four take as the input of verification function then output of verification function is compare with result. The main difference is in RSA compare with hash value other hand in DSS output of verification is compare with result.

算法基本流程

  • 發(fā)送方:使用信息摘要算法對原始數(shù)據(jù)計算摘要
  • 發(fā)送方:產(chǎn)生一個隨機數(shù)尸曼,將摘要信息们何、隨機數(shù)私鑰控轿、全局公鑰(不是私鑰對應(yīng)的公鑰)傳入到算法中冤竹;
  • 發(fā)送方:算法計算一個簽名串,將簽名串和原始數(shù)據(jù)一起傳輸茬射;
  • 接收方:對原始數(shù)據(jù)計算摘要鹦蠕;
  • 接收方:將接受到的簽名串發(fā)送給驗證函數(shù),驗證函數(shù)使用發(fā)送方公鑰全局公鑰來比較驗證簽名信息在抛;

算法家族

包含:SHA1withDSA钟病、SHA224withDSASHA256withDSA刚梭、SHA384withDSA肠阱、SHA512withDSA五種算法。

密鑰長度都是512-1024位朴读。

Java中的算法實現(xiàn)

JDK實現(xiàn)了DSA算法屹徘,但僅僅實現(xiàn)了SHA1withDSA算法。

示例代碼衅金,代碼和RSA數(shù)字簽名算法的一樣噪伊,只不過是算法名字變了下,可見Java的API設(shè)計還是很不錯的氮唯。

public class SignatureTest {
    //唯一不一樣的是這里
    public static final String SIGN_ALGORITHM = "SHA1withDSA";
    private static final String KEY_ALGORITHM = "RSA";
    private static final int KEY_SIZE = 1024;

    public static void main(String[] args) throws Exception {
        KeyPair keyPair = initKey();
        String input = "Sign Me";
        
        byte[] sign = sign(input.getBytes(), keyPair.getPrivate().getEncoded());
        boolean verify = verify(input.getBytes(), sign, keyPair.getPublic().getEncoded());

        String msg = String.format("原始數(shù)據(jù): %s , Sign : %s , Verify : %s", input, toBase64(sign), verify);
        System.out.println(msg);
        // 從二進制位角度看,sign的長度和密鑰長度一致
        System.out.println("Sign Size : " + (sign.length * 8) + " Key Size : " + KEY_SIZE);
    }

    public static KeyPair initKey() throws Exception {
        KeyPairGenerator keyPairGr = KeyPairGenerator.getInstance(KEY_ALGORITHM);
        keyPairGr.initialize(KEY_SIZE);
        KeyPair keyPair = keyPairGr.generateKeyPair();
        return keyPair;
    }

    public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {
        // 將byte[]的key格式化回來
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
        // 獲取算法實例并初始化
        Signature signature = Signature.getInstance(SIGN_ALGORITHM);
        signature.initSign(priKey);
        signature.update(data);
        byte[] sign = signature.sign();
        return sign;
    }

    public static boolean verify(byte[] data, byte[] sign, byte[] publicKey) throws Exception {
        // 獲取算法實例并初始化
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKey);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
        Signature signature = Signature.getInstance(SIGN_ALGORITHM);
        signature.initVerify(pubKey);
        signature.update(data);
        // 驗證數(shù)據(jù)和簽名是否一致,放否認,放篡改
        boolean verify = signature.verify(sign);
        return verify;
    }

    public static String toBase64(byte[] data) {
        return new String(Base64.getEncoder().encode(data));
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鉴吹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子您觉,更是在濱河造成了極大的恐慌拙寡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琳水,死亡現(xiàn)場離奇詭異肆糕,居然都是意外死亡般堆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門诚啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淮摔,“玉大人,你說我怎么就攤上這事始赎『统龋” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵造垛,是天一觀的道長魔招。 經(jīng)常有香客問我,道長五辽,這世上最難降的妖魔是什么办斑? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮杆逗,結(jié)果婚禮上乡翅,老公的妹妹穿的比我還像新娘。我一直安慰自己罪郊,他們只是感情好蠕蚜,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悔橄,像睡著了一般靶累。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橄维,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天尺铣,我揣著相機與錄音,去河邊找鬼争舞。 笑死凛忿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的竞川。 我是一名探鬼主播店溢,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼委乌!你這毒婦竟也來了床牧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤遭贸,失蹤者是張志新(化名)和其女友劉穎戈咳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡著蛙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年删铃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踏堡。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡猎唁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顷蟆,到底是詐尸還是另有隱情诫隅,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布帐偎,位于F島的核電站逐纬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肮街。R本人自食惡果不足惜风题,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫉父。 院中可真熱鬧,春花似錦眼刃、人聲如沸绕辖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仪际。三九已至,卻和暖如春昵骤,著一層夾襖步出監(jiān)牢的瞬間树碱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工变秦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留成榜,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓蹦玫,卻偏偏與公主長得像赎婚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子樱溉,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 文中首先解釋了加密解密的一些基礎(chǔ)知識和概念挣输,然后通過一個加密通信過程的例子說明了加密算法的作用,以及數(shù)字證書的出現(xiàn)...
    納蘭三少閱讀 1,901評論 1 6
  • 轉(zhuǎn)載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,124評論 1 5
  • 數(shù)字簽名技術(shù) 信息摘要算法福贞、對稱加密撩嚼、非對稱加密的著眼點都在于信息本身的編解碼,將信息轉(zhuǎn)換為一種不易被識別的序列,...
    saillen閱讀 2,504評論 0 0
  • 晚上完丽,跟著媳婦參加她們家族的一個聚會向瓷,大娘大爺結(jié)婚50周年慶。這是金婚舰涌?鉆石婚猖任? 不曉得,只是知道來的人不少瓷耙,連我...
    煩人的昵稱閱讀 139評論 0 0
  • 咖啡冥想 目標:18年6月30日前收入5萬元 1朱躺、常燈法師日捐群捐助1元,將護持師傅的功德回向給求子的夫妻搁痛,早日成...
    暴走高跟鞋閱讀 444評論 0 0