數字簽名和驗籤過程實現分析

2021-06-07 12:34:37 字數 4882 閱讀 5796

數字簽名在網路安全領域用的比較多,可實現使用者身份的真實可靠性;實現資訊的完整性,確保資料在儲存、傳輸和處理的過程中免遭任何非授權的或非預期的修改、插入、刪除、重發等破壞,從而實現資料的真實性、有效性和一致性;實現抗抵賴性,通過數字簽名確保資訊的傳送方不能抵賴曾經傳送的資訊,不能否認自己的操作行為。

下面結合著名的vpn開源專案openswan-2.4.7來理解數字簽名和解簽名的具體過程。

一、數字簽名和解籤(驗籤)過程:使用hash函式對報文資料生成摘要,使用自己的私鑰對摘要進行簽名(其實就是加密過程),生成簽名資料,把原始資料報文和簽名資料傳送給對方。接收方收到原始資料報文和簽名資料後,首先使用相同的hash函式對原始資料生成乙個摘要,其次,用對方的公鑰對簽名資料進行解簽名(解密過程),這個解簽名的結果也是個摘要,最後比較這兩個摘要是否相同,如果相同那麼接收方就能確認該數字簽名是傳送方的。

用以下hash1、hash2和hash3表明不同時期的摘要:

傳送方:  簽名值=f(hash1(msg),私鑰); (msg表示原始報文資料)

接收方:hash2(msg) = f^(-1)(簽名值,公鑰);(我覺得就是f的反函式,所以寫了f^(-1)表示)

hash3(msg);

正常情況下hash2通過公鑰對「傳送方發過來的簽名值」解籤後應該等於hash1。hash1和hash3都是對原始報文資料進行摘要,所以只要最後比較hash2和hash3是否相同,就能確定訊息的完整性和證明資料是由對方傳送的(抗抵賴)。

二、openswan協商總體流程,只關注第5、6個包即可。

initiator                          responder

-----------                        -----------

hdr, sa                     -->

第1個包      main_outi1(傳送初始化資料1)

<--    hdr, sa

第2個包                                            main_ini1_outr1(接收到初始化資料1, 傳送響應資料1)

hdr, ke, ni                 -->

第3個包        main_inr1_outi2(接收到響應資料1,傳送初始化資料2)

<--    hdr, ke, nr

第4個包                                             main_ini2_outr2(接收到初始化資料2, 傳送響應資料2)

hdr*, idii, [ cert, ] sig_i -->

第5個包        main_inr2_outi3(接收到響應資料2,傳送初始化資料3)

<--    hdr*, idir, [ cert, ] sig_r

第6個包                                             main_ini3_outr3(接收到初始化資料3, 傳送響應資料3)

main_inr3(接收到響應資料3, 完成主模式協商, 建立isakmp sa)

由rfc2409 5.1 使用簽名方法進行ike第一階段認證,可知簽名載荷sig_i在第5個包中傳送給對方,對方在第6個包中對簽名進行驗籤,並傳送另外乙個簽名給發起方,最後發起方對收到的簽名進行驗籤。

5.1 使用簽名方法進行ike第一階段認證

使用簽名方法時,在第二個傳輸往返中交換的輔助資訊是當前時間(nonce);

交換的認證是通過對乙個相互可得到的hash值進行簽名。使用簽名認證的主模

式描述如下:   

發起者                             響應者

-----------                        -----------

hdr, sa                     -->

<--    hdr, sa

hdr, ke, ni                 -->

<--    hdr, ke, nr

hdr*, idii, [ cert, ] sig_i -->

<--    hdr*, idir, [ cert, ] sig_r

三、簽名過程

1,函式呼叫過程:        

main_inr2_outi3()

->main_mode_hash()

->rsa_sign_hash()

->sign_hash()

2,具體分析(只是摘取關鍵**片段):

main_inr2_outi3()

else

if (!out_generic_raw(isakmp_next_none

, &isakmp_signature_desc

, &md->rbody

, sig_val

, "sig_i"))

return stf_internal_error;}}

}//hash函式

static size_t   /* length of hash */

main_mode_hash(struct state *st

, u_char *hash_val  /* resulting bytes */

, bool hashi    /* initiator? */

, const pb_stream *idpl)    /* id payload, as pbs; cur must be at end */

//簽名函式

static size_t

rsa_sign_hash(struct connection *c

, u_char sig_val[rsa_max_octets]

, const u_char *hash_val, size_t hash_len)

…………

}四、驗籤過程

1,函式呼叫關係:

main_ini3_outr3()

->main_ini3_outr3_tail()

->main_id_and_auth()

->oakley_id_and_auth()

->decode_peer_id()//使用ca校驗對方證書的合法性,先不關注。

->decode_cert()

->verify_x509cert()

->rsa_check_signature()//驗籤

->take_a_crack()

->try_rsa_signature()//最終的比較過程

2,具體分析(摘取關鍵**片段):

static stf_status

oakley_id_and_auth(struct msg_digest *md

, bool initiator   /* are we the initiator? */

, bool aggrmode                /* aggressive mode? */

, cont_fn_t cont_fn    /* continuation function */

, const struct key_continuation *kc    /* current state, can be null */

)switch (st->st_oakley.auth)

}break;

case oakley_rsa_sig:

r = rsa_check_signature(st, hash_val, hash_len//hash_val是剛上面計算出來的hash3,這裡的st沒什麼意義,公鑰會在函式裡取到。

, &md->chain[isakmp_next_sig]->pbs//pbs中存放傳送方發過來的簽名值

);…………}

rsa_check_signature(struct state *st

, const u_char hash_val[max_digest_len]

, size_t hash_len

, const pb_stream *sig_pbs

#ifdef use_keyrr

, const struct pubkey_list *keys_from_dns

#endif /* use_keyrr */

, const struct gw_info *gateways_from_dns)}

for (p = pubkeys; p != null; p = *pp)//獲取需要使用的公鑰,如何獲取不再深入。

/* check if found public key has expired */

time(&now);

if (key->until_time != undefined_time && key->until_time < now)

if (take_a_crack(&s, key, "preloaded key"))//傳入s(包含簽名值和hash3)和公鑰。

return stf_ok;

}pp = &p->next;}}

…………

}take_a_crack(struct tac_state *s

, struct pubkey *kr

, const char *story used_by_debug)

static err_t

try_rsa_signature(const u_char hash_val[max_digest_len], size_t hash_len

, const pb_stream *sig_pbs, struct pubkey *kr

, struct state *st)

unreference_key(&st->st_peer_pubkey);

st->st_peer_pubkey = reference_key(kr);

}

數字簽名和驗籤

數字簽名使用了公鑰加密領域的技術 通常定義兩種互補的運算,乙個用於簽名,另乙個用於驗證。數字簽名是只有資訊的傳送者才能產生的別人無法偽造的一段數字串,這段數字串標明這段資訊是傳送者傳送的。數字簽名是非對稱金鑰加密技術與數字摘要技術的應用。數字簽名的作用 保證資訊傳輸的完整性 數字摘要 確認傳送者的身...

RSA加密 解密和簽名 驗籤過程理解

這裡將a理解為客戶端,b理解為服務端,可以比較好理解.a和b進行通訊加密,b要先生成一對rsa金鑰,b自己持有私鑰,給a公鑰 a使用b的公鑰加密要傳送的內容,然後b接收到密文後通過自己的私鑰解密內容 a給b傳送訊息,a先計算出訊息的訊息摘要,然後使用自己的私鑰加密訊息摘要,被加密的訊息摘要就是簽名....

實現數字簽名

數字簽名演算法 dsa,digital signature algorithm 是一種公開金鑰演算法,不能用於加密,只能用於數字簽名。主要用作為接收者驗證數字的完整性和資料傳送者的身份,dsa演算法的安全性基於解離散對數的困難性。package main import crypto dsa cryp...