4.2 RSA數(shù)字簽名技術(shù)

數(shù)字簽名技術(shù) - RSA數(shù)字簽名技術(shù)

RSA算法不僅是非對(duì)稱加密算法朋其,也是數(shù)字簽名算法中的主力軍澄阳,和MD括授、SHA系列算法結(jié)合坞笙,產(chǎn)生數(shù)字簽名算法。

算法系列

RSA數(shù)字簽名技術(shù)可以分為MD和SHA系列量大類荚虚,數(shù)字簽名技術(shù)本身就是信息摘要和非對(duì)稱加密技術(shù)的結(jié)合薛夜。

  • MD系列包括:MD2withRSAMD5withRSA
  • SHA系列包括:SHA1withRSA版述、SHA224withRSA梯澜、SHA256withRSASHA384withRSA渴析、SHA512withRSA五種腊徙。

這些算法的密鑰長度都在512-65535位之間简十,必須是64的倍數(shù)。產(chǎn)生的簽名長度和密鑰長度一致撬腾。

算法基本過程

  • 將數(shù)據(jù)使用摘要算法計(jì)算摘要(hash值);
  • 使用私鑰對(duì)摘要進(jìn)行加密恢恼;
  • 將加密數(shù)據(jù)和原始數(shù)據(jù)一起傳輸民傻;
  • 接收方對(duì)原始數(shù)據(jù)(要保持原始數(shù)據(jù)的序列一致性,約定好)計(jì)算摘要;
  • 使用公鑰解密簽名串场斑,比較二者Hash值是否一致漓踢;

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

Java中不僅僅實(shí)現(xiàn)了RSA算法,還實(shí)現(xiàn)了RSA數(shù)字簽名算法漏隐,JDK僅提供了MD2withRSA喧半、MD5withRSASHA1withRSA三種數(shù)字簽名算法。

JDK中對(duì)三種算法的默認(rèn)密鑰長度為1024

示例代碼:

public class SignatureTest {

    public static final String SIGN_ALGORITHM = "MD5withRSA";
    private static final String KEY_ALGORITHM = "RSA";
    private static final int KEY_SIZE = 512;

    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);
        // 從二進(jìn)制位角度看,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);
        // 獲取算法實(shí)例并初始化
        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 {
        // 獲取算法實(shí)例并初始化
        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);
        // 驗(yàn)證數(shù)據(jù)和簽名是否一致,放否認(rèn),放篡改
        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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末青责,一起剝皮案震驚了整個(gè)濱河市挺据,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脖隶,老刑警劉巖扁耐,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異产阱,居然都是意外死亡婉称,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門构蹬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來王暗,“玉大人,你說我怎么就攤上這事庄敛∷滓迹” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵铐姚,是天一觀的道長策肝。 經(jīng)常有香客問我,道長隐绵,這世上最難降的妖魔是什么之众? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮依许,結(jié)果婚禮上棺禾,老公的妹妹穿的比我還像新娘。我一直安慰自己峭跳,他們只是感情好膘婶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布缺前。 她就那樣靜靜地躺著,像睡著了一般悬襟。 火紅的嫁衣襯著肌膚如雪衅码。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天脊岳,我揣著相機(jī)與錄音逝段,去河邊找鬼。 笑死割捅,一個(gè)胖子當(dāng)著我的面吹牛奶躯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亿驾,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼嘹黔,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了莫瞬?” 一聲冷哼從身側(cè)響起儡蔓,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乏悄,沒想到半個(gè)月后浙值,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檩小,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年开呐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片规求。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筐付,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阻肿,到底是詐尸還是另有隱情瓦戚,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布丛塌,位于F島的核電站较解,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赴邻。R本人自食惡果不足惜印衔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姥敛。 院中可真熱鬧奸焙,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玄糟,卻和暖如春勿她,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茶凳。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工嫂拴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贮喧。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像猪狈,于是被迫代替她去往敵國和親箱沦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 目錄 準(zhǔn)備 分析2.1. 三次握手2.2. 創(chuàng)建 HTTP 代理(非必要)2.3. TLS/SSL 握手2.4. ...
    RunAlgorithm閱讀 37,881評(píng)論 12 117
  • 前言 《圖解密碼技術(shù)》一書介紹了很多關(guān)于密碼的知識(shí)雇庙,通讀一遍需要不少時(shí)間谓形。為了方便學(xué)習(xí),我對(duì)書中關(guān)鍵的部分進(jìn)行了總...
    咖枯閱讀 7,149評(píng)論 1 25
  • “我也想喝啤酒” “冰箱里有疆前,自己拿” “奧”寒跳,我從冰箱里拿出兩個(gè)小時(shí)前我放進(jìn)去的那罐啤酒,暑假快過去一半了吧竹椒,老...
    等糖花花閱讀 231評(píng)論 0 0
  • 一日,賦閑在家,忽感口中無味,饑腸略顯轆轆之聲,尋思片刻,欲覓MIMI蝦條食之,暫充果腹之職.翻箱倒柜須臾,未果,...
    快樂的熙爺閱讀 190評(píng)論 3 2
  • 從現(xiàn)在開始:規(guī)律生活童太。
    暖_3ae5閱讀 121評(píng)論 1 0