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,計...