RSA加密長度限制及如何分段加密

2021-10-07 01:43:10 字數 3015 閱讀 5335

rsa加解密中必須考慮到的金鑰長度、明文長度和密文長度問題。明文長度需要小於金鑰長度,而密文長度則等於金鑰長度。因此當加密內容長度大於金鑰長度時,有效的rsa加解密就需要對內容進行分段。

這是因為,rsa演算法本身要求加密內容也就是明文長度m必須0這樣,對於1024長度的金鑰。128位元組(1024bits)-減去11位元組正好是117位元組,但對於rsa加密來講,padding也是參與加密的,所以,依然按照1024bits去理解,但實際的明文只有117位元組了。

所以如果要對任意長度的資料進行加密,就需要將資料分段後進行逐一加密,並將結果進行拼接。同樣,解碼也需要分段解碼,並將結果進行拼接。

/***

* @descriptions rsa 加解密類

* @create 阿湯哥

* @date: 2020/6/10 14:03

* @company

* @version v1.0.0

**/public class rsaencrypt catch (nosuchalgorithmexception e)

// 初始化keypairgenerator物件,金鑰長度

kpg.initialize(keysize);

// 生成密匙對

keypair keypair = kpg.generatekeypair();

// 得到公鑰

key publickey = keypair.getpublic();

string publickeystr = base64.encodebase64urlsafestring(publickey.getencoded());

// 得到私鑰

key privatekey = keypair.getprivate();

string privatekeystr = base64.encodebase64urlsafestring(privatekey.getencoded());

// map裝載公鑰和私鑰

mapkeypairmap = new hashmap();

keypairmap.put("publickey", publickeystr);

keypairmap.put("privatekey", privatekeystr);

// 返回map

return keypairmap;

}/**

* 得到公鑰

* @param publickey 金鑰字串(經過base64編碼)

* @throws exception

*/public static rsapublickey getpublickey(string publickey) throws nosuchalgorithmexception, invalidkeyspecexception

/*** 得到私鑰

* @param privatekey 金鑰字串(經過base64編碼)

* @throws exception

*/public static rsaprivatekey getprivatekey(string privatekey) throws nosuchalgorithmexception, invalidkeyspecexception

/*** 公鑰加密

* @param data

* @param publickey

* @return

*/public static string publicencrypt(string data, rsapublickey publickey) catch (exception e)

}/**

* 私鑰解密

* @param data

* @param privatekey

* @return

*/public static string privatedecrypt(string data, rsaprivatekey privatekey) catch (exception e)

}/**

* 私鑰加密

* @param data

* @param privatekey

* @return

*/public static string privateencrypt(string data, rsaprivatekey privatekey) catch (exception e)

}/**

* 公鑰解密

* @param data

* @param publickey

* @return

*/public static string publicdecrypt(string data, rsapublickey publickey) catch (exception e)

}//rsa切割解碼 , encrypt_mode,加密資料 ,decrypt_mode,解密資料

private static byte rsasplitcodec(cipher cipher, int opmode, byte datas, int keysize) else

bytearrayoutputstream out = new bytearrayoutputstream();

int offset = 0;

byte buff;

int i = 0;

try else

out.write(buff, 0, buff.length);

i++;

offset = i * maxblock;

}} catch (exception e)

byte resultdatas = out.tobytearray();

ioutils.closequietly(out);

return resultdatas;

}// 簡單測試____________

public static void main(string args) throws exception

}

關於RSA加密演算法的長度限制問題

rsa是常用的非對稱加密演算法。近來有學生在專案中使用system.security類庫中的rsa加密演算法時,出現了 不正確的長度 這實際上是因為待加密的資料超長所致。net framework中提供的rsa演算法規定,每次加密的位元組數,不能超過金鑰的長度值減去11,而每次加密得到的密文長度,卻...

C RSA加密,無限制長度

rsa加密,無限制長度 rsa加密 無長度限制 public class encrypthelper 解密 public static string decrypt string encryptedinput 生成金鑰 public static void rsakey out string xml...

RSA不限長度非對稱加密解密C

rsa 是常用的非對稱加密演算法。最近使用時卻出現了 不正確的長度 的異常,研究發現是由於待加密的資料超長所致。net framework 中提供的 rsa 演算法規定 待加密的位元組數不能超過金鑰的長度值除以 8 再減去 11 即 rsacryptoserviceprovider.keysize ...