RSA數字簽名演算法

2021-08-03 08:24:17 字數 2165 閱讀 2815

數字簽名無非就兩個目的:

證明這訊息是你發的;

證明這訊息內容確實是完整的---也就是沒有經過任何形式的篡改(包括替換、缺少、新增)

這種是兩個目的都達到了,還有一些只達到乙個目的

公鑰和私鑰都可以用來加密或解密---只要能保證用a加密,就用b解密就行。至於a是公鑰還是私鑰,其實可以根據不同的用途而定。例如說,如果你想把某個訊息秘密的發給某人,那你就可以用他的公鑰加密。因為只有他知道他的私鑰,所以這訊息也就只有他本人能解開,於是你就達到了你的目的。

但是如果你想發布乙個公告,需要乙個手段來證明這確實是你本人發的,而不是其他人冒名頂替的。那你可以在你的公告開頭或者結尾附上一段用你的私鑰加密的內容(例如說就是你公告正文的一段話),那所有其他人都可以用你的公鑰來解密,看看解出來的內容是不是相符的。如果是的話,那就說明這公告確實是你發的---因為只有你的公鑰才能解開你的私鑰加密的內容,而其他人是拿不到你的私鑰的。

最後再說一下數字簽名。

數字簽名無非就兩個目的:

證明這訊息是你發的;

證明這訊息內容確實是完整的---也就是沒有經過任何形式的篡改(包括替換、缺少、新增)。

其實,上面關於「公告」那段內容,已經證明了第一點:證明這訊息是你發的。那麼要做到第二點,也很簡單,就是把你公告的原文做一次雜湊(md5或者sha1都行),然後用你的私鑰加密這段雜湊作為簽名,並一起公布出去。當別人收到你的公告時,他可以用你的公鑰解密你的簽名,如果解密成功,並且解密出來的雜湊值確實和你的公告原文一致,那麼他就證明了兩點:這訊息確實是你發的,而且內容是完整的。

其實概念很簡單:

小明想秘密給小英傳送訊息

小英手裡有乙個盒子(public key),這個盒子只有小英手裡的鑰匙(private key)才打得開

小英把盒子送給小明(分發公鑰)

小明寫好訊息放進盒子裡,鎖上盒子(公鑰加密)

小明把盒子寄給小英(密文傳輸)

小英用手裡的鑰匙開啟盒子,得到小明的訊息(私鑰解密)

假設小剛劫持了盒子,因為沒有小英的鑰匙,他也打不開

a和b進行加密通訊時,b首先要生成一對金鑰。乙個是公鑰,給a,b自己持有私鑰。a使用b的公鑰加密要加密傳送的內容,然後b在通過自己的私鑰解密內容。

要想b傳送訊息,a會先計算出訊息的訊息摘要,然後使用自己的私鑰加密這段摘要加密,最後將加密後的訊息摘要和訊息一起傳送給b,被加密的訊息摘要就是「簽名」。

b收到訊息後,也會使用和a相同的方法提取訊息摘要,然後使用a的公鑰解密a傳送的來簽名,並與自己計算出來的訊息摘要進行比較。如果相同則說明訊息是a傳送給b的,同時,a也無法否認自己傳送訊息給b的事實。

其中,a用自己的私鑰給訊息摘要加密成為「簽名」;b使用a的公鑰解密簽名檔案的過程,就叫做「驗籤」。

數字簽名的作用是保證資料完整性,機密性和傳送方角色的不可抵賴性

下面是對簽名和驗籤過程的簡要描述:

簽名過程:

1.a計算訊息m的訊息摘要,記為 h(m)

2.a使用私鑰(n,d)對h(m)加密,生成簽名s ,s滿足:

s=(h(m))^d mod n;

由於a是用自己的私鑰對訊息摘要加密,所以只用使用s的公鑰才能解密該訊息摘要,這樣a就不可否認自己傳送了該訊息給b。

3.a傳送訊息和簽名(m,s)給b。

驗籤過程:

1.b計算訊息m的訊息摘要,記為h(m);

2.b使用a的公鑰(n,e)解密s,得到

h(m) = s^e mod n;

3.b比較h(m)與h(m),相同則證明

下面簡單總結加密和解密的完整過程。

簽名過程:

1.a提取訊息m的訊息摘要h(m),並使用自己的私鑰對摘要h(m)進行加密,生成簽名s

2.a將簽名s和訊息m一起,使用b的公鑰進行加密,生成密文c,傳送給b。

驗證過程:

1.b接收到密文c,使用自己的私鑰解密c得到明文m和數字簽名s

2.b使用a的公鑰解密數字簽名s解密得到h(m).

3.b使用相同的方法提取訊息m的訊息摘要h(m)

4.b比較兩個訊息摘要。相同則驗證成功;不同則驗證失敗。

數字簽名演算法 RSA

數字簽名 又稱公鑰數字簽名 是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑑別數字資訊的方法。一套數字簽名通常定義兩種互補的運算,乙個用於簽名,另乙個用於驗證,但法條中的電子簽章與數字簽名,代表之意義並不相同,電子簽章用以辨識及確認電子檔案簽署人身份 資格及電子檔案真偽者...

rsa數字簽名實現

使用openssl庫進行封裝實現,如下 static int base64 decode char str,int str len,char decode,int decode buffer len static int base64 encode char str,int str len,char...

數字簽名演算法

gost3411,keccak,md2,md4,md5,sha1,ripemd128,ripemd160,ripemd256,ripemd320,sha224,sha256,sha384,sha512,sha3,skein,sm3,tiger,whirlpool rsa演算法實現參見另一篇文章 md...