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

2022-02-22 23:08:30 字數 1596 閱讀 7080

rsa是常用的非對稱加密演算法。近來有學生在專案中使用system.security類庫中的rsa加密演算法時,出現了「不正確的長度」,這實際上是因為待加密的資料超長所致。.net

framework中提供的rsa演算法規定,每次加密的位元組數,不能超過金鑰的長度值減去11,而每次加密得到的密文長度,卻恰恰是金鑰的長度。所以,如果要加密較長的資料,可以採用資料擷取的方法,分段加密,實現如下:

rsacryptoserviceprovider rsa = new

rsacryptoserviceprovider();

byte data = ........;        

//要加密的資料

string publickey = .... ;  //獲取公鑰

rsa.fromxmlstring(publickey);

int keysize = rsa.keysize / 8;

int buffersize = keysize - 11;

byte buffer = new

byte[buffersize];

memorystream msinput = new

memorystream(data);

memorystream msouput = new

memorystream();

int readlen = msinput.read(buffer, 0,

buffersize);

while(readlen > 0)

msinput.close();

byte result = msoutput.toarray();   

//得到加密結果

msoutput.close();

rsa.clear();

解密時肯定也要使用分段解密,演算法如下:

rsacryptoserviceprovider rsa = new

rsacryptoserviceprovider();

byte key = .....;    //載入私鑰

string privatekey =

encoding.ascii.getstring(key);

byte dataenc = ...;   //載入密文

rsa.fromxmlstring(privatekey);

int keysize = rsa.keysize / 8;

byte

buffer = new byte[keysize];

memorystream msinput = new

memorystream(dataenc );

memorystream msouput = new

memorystream();

int readlen = msinput.read(buffer, 0,

keysize);

while(readlen > 0)

msinput.close();

byte result = msoutput.toarray();   

//得到解密結果

msoutput.close();

rsa.clear();

RSA加密演算法

素數是這樣的整數,它除了能表示為它自己和1的乘積以外,不能表示為任何其它兩個整數的乘積。例如,15 3 5,所以15不是素數 又如,12 6 2 4 3,所以12也不是素數。另一方面,13除了等於13 1以外,不能表示為其它任何兩個整數的乘積,所以13是乙個素數。素數也稱為 質數 二 什麼是 互質數...

RSA加密演算法

演算法的描述 1.選取兩個素數p,q 2.計算n p q,fn p 1 q 1 3.選擇乙個整數e,使得e與fn的最大公約數為1,e將會用於對資料進行加密。4.計算出乙個整數d,使得d e除fn的餘數為1。d用於對密文進行解密,還原出明文。5.假設明文為m,密文為c。如果需要對原文進行加密,則進行如...

RSA加密演算法

一 rsa是公鑰加密演算法之一,該演算法的數學基礎是 1 初等數論的euler定理,即 若整數a與整數n互素,則a n 1 mod n 其中,n 為尤拉函式。2 大整數分解很困難,即給定乙個大整數n,將其分解為n p q,兩個素數乘積十分困難。二 rsa基本原理 1 金鑰的生成。選擇大素數p,q,計...