RSA簽名驗證

2021-08-21 07:24:21 字數 2578 閱讀 4587

1、rsa加密過程簡述

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

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

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

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

3、簽名過程

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

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

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

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

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

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

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

4、驗證過程

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

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

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

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

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

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

h(m) = s^e mod n;

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

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.windows.forms;

using system.security.cryptography;

using system.io;

namespace sectest

hexstring = strb.tostring();

}return hexstring;

}public rsasv()

private void button1_click(object sender, eventargs e)

private void button2_click(object sender, eventargs e)

private void button3_click(object sender, eventargs e)

catch

finally

byte signdata = rsa1.signdata(data, sh);

textbox4.text =convert.tobase64string(signdata);

}private void button4_click(object sender, eventargs e)

}private void button5_click(object sender, eventargs e)

catch

finally

filestream fkeyin = new filestream("c:\\rsakey1.dat", filemode.open, fileaccess.read);

long keyl=fkeyin.length;

byte key_buf = new byte[keyl];

fkeyin.read(key_buf, 0, (int)keyl);

string strpublickey;

strpublickey = system.text.encoding.default.getstring(key_buf);

rsacryptoserviceprovider rsa1 = new rsacryptoserviceprovider();

rsa1.fromxmlstring(strpublickey);

byte data = convert.frombase64string(textbox4.text);

sha1 sh = new sha1cryptoserviceprovider();

result = rsa1.verifydata(data, sh, data);

if (result)

textbox5.text = "驗證通過。";

else

textbox5.text = "驗證失敗。";}}

}

rsa加密 簽名解釋

rsa的公鑰和私鑰到底哪個才是用來加密和哪個用來解密?我們來回顧一下rsa的加密演算法。我們從公鑰加密演算法和簽名演算法的定義出發,用比較規範的語言來描述這一演算法。rsa公鑰加密體制包含如下3個演算法 keygen 金鑰生成演算法 encrypt 加密演算法 以及decrypt 解密演算法 所以,...

rsa加解密,簽名

一 公鑰加密 假設一下,我找了兩個數字,乙個是1,乙個是2。我喜歡2這個數字,就保留起來,不告訴你們 私鑰 然後我告訴大家,1是我的公鑰。我有乙個檔案,不能讓別人看,我就用1加密了。別人找到了這個檔案,但是他不知道2就是解密的私鑰啊,所以他解不開,只有我可以用 數字2,就是我的私鑰,來解密。這樣我就...

RSA簽名php實現

介面資料加上簽名,可以防止別人篡改資料,過濾非法請求。param data array 需要加密的陣列 function getsign data,private key param data array 需要加密的陣列 return bool 是否驗證通過 function checksign d...