最近遇到乙個專案,需要進行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,就是我的私鑰,來解密。這樣我就可以保護資料了...