rsa加密演算法的實現
❶ RSA演算法的實現
RSA畢業設計論文
http://wenku..com/view/8b1804c42cc58bd63186bd77.html
❷ RSA加密演算法原理
RSA加密演算法是一種典型的非對稱加密演算法,它基於大數的因式分解數學難題,它也是應用最廣泛的非對稱加密演算法,於1978年由美國麻省理工學院(MIT)的三位學著:Ron Rivest、Adi Shamir 和 Leonard Adleman 共同提出。
它的原理較為簡單,假設有消息發送方A和消息接收方B,通過下面的幾個步驟,就可以完成消息的加密傳遞:
消息發送方A在本地構建密鑰對,公鑰和私鑰;
消息發送方A將產生的公鑰發送給消息接收方B;
B向A發送數據時,通過公鑰進行加密,A接收到數據後通過私鑰進行解密,完成一次通信;
反之,A向B發送數據時,通過私鑰對數據進行加密,B接收到數據後通過公鑰進行解密。
由於公鑰是消息發送方A暴露給消息接收方B的,所以這種方式也存在一定的安全隱患,如果公鑰在數據傳輸過程中泄漏,則A通過私鑰加密的數據就可能被解密。
如果要建立更安全的加密消息傳遞模型,需要消息發送方和消息接收方各構建一套密鑰對,並分別將各自的公鑰暴露給對方,在進行消息傳遞時,A通過B的公鑰對數據加密,B接收到消息通過B的私鑰進行解密,反之,B通過A的公鑰進行加密,A接收到消息後通過A的私鑰進行解密。
當然,這種方式可能存在數據傳遞被模擬的隱患,但可以通過數字簽名等技術進行安全性的進一步提升。由於存在多次的非對稱加解密,這種方式帶來的效率問題也更加嚴重。
❸ rsa的加密演算法可以使用什麼軟體實現密碼加密
您可以多嘗試一些加密軟體,我是用的是隱身俠加密軟體,給用戶名密碼加密都可以,您可以試試,希望可以幫到您。
❹ 計算機網路中公鑰加密技術如何實現RSA演算法的
證書密鑰的默認時間是一年,有的也不是一年,也都是有期限的,並不是一直是這樣啊!
❺ RSA演算法的實現細節
首先要使用概率演算法來驗證隨機產生的大的整數是否質數,這樣的演算法比較快而且可以消除掉大多數非質數。假如有一個數通過了這個測試的話,那麼要使用一個精確的測試來保證它的確是一個質數。
除此之外這樣找到的p和q還要滿足一定的要求,首先它們不能太靠近,此外p-1或q-1的因子不能太小,否則的話N也可以被很快地分解。
此外尋找質數的演算法不能給攻擊者任何信息,這些質數是怎樣找到的,尤其產生隨機數的軟體必須非常好。要求是隨機和不可預測。這兩個要求並不相同。一個隨機過程可能可以產生一個不相關的數的系列,但假如有人能夠預測出(或部分地預測出)這個系列的話,那麼它就已經不可靠了。比如有一些非常好的隨機數演算法,但它們都已經被發表,因此它們不能被使用,因為假如一個攻擊者可以猜出p和q一半的位的話,那麼他們就已經可以輕而易舉地推算出另一半。
此外密鑰d必須足夠大,1990年有人證明假如p大於q而小於2q(這是一個很經常的情況)而,那麼從N和e可以很有效地推算出d。此外e = 2永遠不應該被使用。 由於進行的都是大數計算,使得RSA最快的情況也比DES慢上好幾倍,無論是軟體還是硬體實現。速度一直是RSA的缺陷。一般來說只用於少量數據加密。RSA的速度比對應同樣安全級別的對稱密碼演算法要慢1000倍左右。
比起DES和其它對稱演算法來說,RSA要慢得多。實際上Bob一般使用一種對稱演算法來加密他的信息,然後用RSA來加密他的比較短的對稱密碼,然後將用RSA加密的對稱密碼和用對稱演算法加密的消息送給Alice。
這樣一來對隨機數的要求就更高了,尤其對產生對稱密碼的要求非常高,因為否則的話可以越過RSA來直接攻擊對稱密碼。 1995年有人提出了一種非常意想不到的攻擊方式:假如Eve對Alice的硬體有充分的了解,而且知道它對一些特定的消息加密時所需要的時間的話,那麼她可以很快地推導出d。這種攻擊方式之所以會成立,主要是因為在進行加密時所進行的模指數運算是一個位元一個位元進行的而位元為1所花的運算比位元為0的運算要多很多,因此若能得到多組訊息與其加密時間,就會有機會可以反推出私鑰的內容。
❻ RSA加密演算法怎樣用C語言實現 急急急!!!
/*數據只能是大寫字母組成的字元串。
加密的時候,輸入Y,然後輸入要加密的文本(大寫字母)
解密的時候,輸入N,然後輸入一個整數n表示密文的個數,然後n個整數表示加密時候得到的密文。
*/
/*RSA algorithm */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MM 7081
#define KK 1789
#define PHIM 6912
#define PP 85
typedef char strtype[10000];
int len;
long nume[10000];
int change[126];
char antichange[37];
void initialize()
{ int i;
char c;
for (i = 11, c = 'A'; c <= 'Z'; c ++, i ++)
{ change[c] = i;
antichange[i] = c;
}
}
void changetonum(strtype str)
{ int l = strlen(str), i;
len = 0;
memset(nume, 0, sizeof(nume));
for (i = 0; i < l; i ++)
{ nume[len] = nume[len] * 100 + change[str[i]];
if (i % 2 == 1) len ++;
}
if (i % 2 != 0) len ++;
}
long binamod(long numb, long k)
{ if (k == 0) return 1;
long curr = binamod (numb, k / 2);
if (k % 2 == 0)
return curr * curr % MM;
else return (curr * curr) % MM * numb % MM;
}
long encode(long numb)
{ return binamod(numb, KK);
}
long decode(long numb)
{ return binamod(numb, PP);
}
main()
{ strtype str;
int i, a1, a2;
long curr;
initialize();
puts("Input 'Y' if encoding, otherwise input 'N':");
gets(str);
if (str[0] == 'Y')
{ gets(str);
changetonum(str);
printf("encoded: ");
for (i = 0; i < len; i ++)
{ if (i) putchar('-');
printf(" %ld ", encode(nume[i]));
}
putchar('\n');
}
else
{ scanf("%d", &len);
for (i = 0; i < len; i ++)
{ scanf("%ld", &curr);
curr = decode(curr);
a1 = curr / 100;
a2 = curr % 100;
printf("decoded: ");
if (a1 != 0) putchar(antichange[a1]);
if (a2 != 0) putchar(antichange[a2]);
}
putchar('\n');
}
putchar('\n');
system("PAUSE");
return 0;
}
/*
測試:
輸入:
Y
FERMAT
輸出:
encoded: 5192 - 2604 - 4222
輸入
N
3 5192 2604 4222
輸出
decoded: FERMAT
*/
❼ rsa演算法實現代碼
你看看這個行不行,位數可以自己改,今天在網上找到了,我也想用C生成512、1024位的大素數進行RSA加密。。如果誰有好方法麻煩共享下:[email protected],跪謝
package test;
import java.math.BigInteger;
// 生成一個隨機大整數,然後找出比這個整數大的下一個素數
public class Primes {
// 下面的 BigInteger.ZERO 和 BigInteger.ONE 在 JDK 1.1 中是無效的
private static final BigInteger ZERO = BigInteger.ZERO;
private static final BigInteger ONE = BigInteger.ONE;
private static final BigInteger TWO = new BigInteger("2");
// 產生一個錯誤素數的概率小於 1/2 的 ERR_VAL 次方,可以將 ERR_VAL 定義為 200,降低其錯誤率
// Java 應該使用的是 Miller-Rabin 測試法,這種錯誤概率基本上可以認為是無錯誤。
private static final int ERR_VAL = 100;
private static StringBuffer[] digits = { new StringBuffer("0"), new StringBuffer("1"), new StringBuffer("2"), new StringBuffer("3"), new StringBuffer("4"), new StringBuffer("5"),
new StringBuffer("6"), new StringBuffer("7"), new StringBuffer("8"), new StringBuffer("9") };
private static StringBuffer randomDigit(boolean isZeroOK) {
// 產生一個隨機的數字(字元串形式的),isZeroOK 決定這個數字是否可以為 0
int index;
if (isZeroOK)
index = (int) Math.floor(Math.random() * 10);
else
index = 1 + (int) Math.floor(Math.random() * 9);
return (digits[index]);
}
public static BigInteger bigRandom(int numDigits) {
// 產生一個隨機大整數,各位上的數字都是隨機產生的,首位不為 0
StringBuffer s = new StringBuffer("");
for (int i = 0; i < numDigits; i++)
if (i == 0)
s.append(randomDigit(false));
else
s.append(randomDigit(true));
return (new BigInteger(s.toString()));
}
private static boolean isEven(BigInteger n) {
// 測試一個大整數是否為偶數
return (n.mod(TWO).equals(ZERO));
}
public static BigInteger nextPrime(BigInteger start) {
// 產生一個比給定大整數 start 大的素數,錯誤率低於 1/2 的 ERR_VAL 次方
if (isEven(start))
start = start.add(ONE);
else
start = start.add(TWO);
if (start.isProbablePrime(ERR_VAL))
return (start);
else
// 採用遞歸方式(遞歸的層數會是個天文數字嗎?)
return (nextPrime(start));
}
// 一個基於命令行的測試程序,如果位數錯誤,默認 150 位,輸出 20 個素數
public static void main(String[] args) {
int numDigits;
try {
numDigits = Integer.parseInt(args[0]);
} catch (Exception e) {
numDigits = 128;
}
BigInteger start = bigRandom(numDigits);
start = nextPrime(start);
BigInteger end = bigRandom(5);
end = nextPrime(end);
System.out.println("大素數" + start);
System.out.println("大素數" + end);
BigInteger result = start.multiply(end);
System.out.println("結果數" + result);
❽ 如何利用RSA加密演算法編程實現對M=1234567的加密過程
<一>基礎
RSA演算法非常簡單,概述如下:
找兩素數p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一個數e,要求滿足e< p>
取d*e%t==1
這樣最終得到三個數: n d e
設消息為數M (M < p>
設c=(M**d)%n就得到了加密後的消息c
設m=(c**e)%n則 m == M,從而完成對c的解密。
注:**表示次方,上面兩式中的d和e可以互換。
在對稱加密中:
n d兩個數構成公鑰,可以告訴別人;
n e兩個數構成私鑰,e自己保留,不讓任何人知道。
給別人發送的信息使用e加密,只要別人能用d解開就證明信息是由你發送的,構成了簽名機制。
別人給你發送信息時使用d加密,這樣只有擁有e的你能夠對其解密。
rsa的安全性在於對於一個大數n,沒有有效的方法能夠將其分解從而在已知n d的情況下無法獲得e;同樣在已知n e的情況下無法
求得d。
❾ rsa演算法加密演算法的實現問題
RSA加密是把數據當作數值運算,而且會進行大數運算,加密演算法很慢,建議加密小的數據可採用。你把任何的數據流當位元組流來讀取,那每個位元組就是就是一個數了,分組取決你使用的模長,比如rsa1024,那麼每次分片可加密數據的大小是,1024/8-11=117個,為什麼減11參見RSA理論。解密每片是1024/8=128個。
❿ RSA加密演算法簡易演示
RSA演算法安全性本質是三大數學困難問題之一也就是大數分解問題,因為目前尚沒有一種有效的方法可以在短時間內分解兩個大素數的乘積。驗證步驟如上面所說的,原理書上有,具體程序實現簡單講一下
判斷質數,這是基本水平,可以窮舉也可以建表,按自己喜好
這一步是計算兩個大素數乘積沒什麼好說的
判斷兩個數互質,一般採用歐幾里得演算法,輾轉相除直到得到gcd(e1,m)=1。當然你也可以窮舉公因數一直到sqrt(min{e1,m})
計算乘法逆元是依靠廣義歐幾里得演算法,乘法逆元的意思是形如a*a1 ≡ 1(mod m)這樣的(因為這里的群的乘法定義就是數學乘法),a和a1互為彼此模m的逆元,記作a1=a^-1 mod m,只有gcd(a,m)=1時才有唯一解否則無解。
計算方法是廣義歐幾里得除法,設r0=m,r1=a,s0=1,s1=0,t0=0,t1=1;
計算ai=[r(i-1)/ri],r(i+1)=r(i-1)-airi,s(i+1)=s(i-1)-aisi,t(i+1)=t(i-1)-aiti,直到ri=0
舉例如a=7,m=13,計算a^-1 mod m:
a1=[13/7]=1,r2=r0-a1r1=6,s2=s0-a1s1=1,t2=t0-a1t1=-1;
a2=[7/6]=1,r3=r1-a2r2=1,s3=s1-a2s2=-1,t3=t1-a2t2=2;
a3=[6/1]=6,r4=r2-a3r3=0.
取s=s3=-1,t=t3=2,則有7*2-1*13=1,故a^-1mod m=t=2。
把上面的方法寫成C++演算法應該很簡單
5和6都是計算同餘沒什麼好說的,記得要用到a^e≡b^e(mod m)化簡
要畢業了還搞不懂逆元有點拙計啊,回去好好看看離散數學吧