RSA簽名和驗籤說明

2021-10-24 11:14:13 字數 2159 閱讀 4564

最近遇到乙個專案,需要進行rsa的驗籤,rsa的金鑰為2048位即256個位元組長。

上游是先對乙個檔案進行sha256做hash,得到32位元組的摘要,然後進行填充,填充規則為前面兩個位元組為0x00,0x01,然後填充全ff,接下來是32位元組的摘要資料,這樣填充之後的總資料長度為256位元組,然後使用rsa的私鑰對這256位元組進行簽名,下發下來,下游需要對這個簽名進行處理,得到原始摘要,然後跟自己計算的摘要比對,驗證通過則合法。

涉及的知識點如下:

一、rsa簽名演算法的填充方式,常用的有如下三種

1、rsa/ecb/pkcs1padding 填充模式,最常用的模式

要求:輸入:必須 比 rsa 金鑰長度 短至少11個位元組, 否則會報錯,資料不足時由介面自動進行隨機填充

如果輸入的明文過長,必須切割, 然後填充

輸出:和rsa金鑰長度一樣長

根據這個要求,對於2048bit的金鑰, block length = 2048/8 – 11 = 245位元組

注意:加密的時候會在你的明文中隨機填充一些資料,所以會導致對同樣的明文每次加密後的結果都不一樣。

對加密後的密文,伺服器使用相同的填充方式都能解密。解密後的明文也就是之前加密的明文。

如果是私鑰簽名,那麼填充的前面兩個位元組為0x00和0x01(表示私鑰簽名),如果是公鑰簽名,那麼填充的簽名的兩個位元組為0x00和0x02(表示公鑰簽名),然後填充全ff,在填充最後的有效資料之前,會填充乙個00,然後後面就全部是有效資料,所以使用rsa簽名的資料再解密之後得到的資料在真是資料之前一定有00,否則就是輸入沒有嚴格遵守rsa/ecb/pkcs1padding填充方式

2.rsa_pkcs1_oaep_padding

輸入:必須 比 rsa 金鑰長度 短至少41個位元組, 否則會報錯,資料不足時由介面自動進行隨機填充

輸出:和rsa金鑰長度一樣長

3.rsa/ecb/nopadding  不填充

輸入:可以和rsa鑰模長一樣長,如果輸入的明文過長,必須切割,然後填充,這種方式需要自己手動進行填充好輸入資料

輸出:和rsa金鑰長度一樣長

跟des,aes一樣, rsa也是乙個塊加密演算法( block cipher algorithm),總是在乙個固定長度的塊上進行操作。

但跟aes等不同的是, block length是跟key length有關的。

每次rsa加密的明文的長度是受rsa填充模式限制的,但是rsa每次加密的塊長度就是金鑰長度

具體**片段如下:

/*** rsa簽名

* * @param key rsa的金鑰 公鑰用x.509編碼;私鑰用pkcs#8編碼

* @param data 輸入資料

* @param mode 0-加密,1-解密

* @param type 0-私鑰加密,公鑰解密 1-公鑰加密,私鑰解密

* @return 簽名後的資料 為null表示操作失敗

*/public static string generatersa(string key, string data, int mode, int type) else

// 獲得乙個rsa的cipher類,使用私鑰加密

// rsa/ecb/nopadding表示無填充,待加密資料長度必須跟金鑰長度一致,填充需要自己完成

// rsa/ecb/pkcs1padding表示pkcs#1填充,前面填充0x00,0x01(私鑰加密,公鑰加密是02),然後填充0xff,在資料之前再填充乙個0x00,接下來是真正傳入的資料,待加密資料需要小於金鑰資料-11,這個是自動填充

cipher cipher = cipher.getinstance("rsa/ecb/nopadding"); // ,

// 初始化

cipher.init(opmode, strkey);

byte bytedata = str2bytes(data);

system.out.println("generatersa dofinal位元組長度為: " + bytedata.length);

// 返回加解密結果

return (bytestohexstring(cipher.dofinal(bytedata)))

.touppercase(locale.getdefault());// 開始計算

} catch (exception e)

return null;

}

RSA簽名與驗籤

rsa演算法除了可以進行加解密以外,還可以用來簽名與驗籤。rsa用來進行簽名與驗簽時是使用私鑰進行簽名,公鑰進行驗籤的。這點與加解密的時候剛好相反。加解密時使用公鑰加密,私鑰解密。簽名和驗籤是通過signature物件進行的。以下是乙個使用signature進行簽名的示例。初始化signature時...

rsa驗籤中文 RSA簽名及驗籤原理解析

一 名詞解釋 公鑰rsa 金鑰體系中對外公開的部分,通常用於資料加密 驗證數字簽名。私鑰rsa 金鑰體系中非公開的部分,通常用於資料解密 資料簽名。數字簽名 就是只有資訊的傳送者才能產生的,別人無法偽造的一段數字串,它同時也是對傳送者傳送的資訊的真實性的乙個證明。二 為什麼要使用簽名 在系統間報文互...

RSA簽名,驗籤的理解

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