rsa演算法破解
⑴ RSA演算法加解密 寫出寫出簡單加解密過程給我 謝謝大家了!!!
import java.security.*;
import java.security.interfaces.*;
import java.math.*;
import java.io.*;
public class Password_Test {
public static void main(String[] args) {
try {
new Password_Test();
Encryption_RSA();
} catch (Exception e) {
e.printStackTrace();
}
}
public Password_Test() throws Exception {// 構造方法 創建公鑰和私鑰
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");//生成實現RSA演算法的KeyPairGenerator對象。
kpg.initialize(1024);// 初始化確定密鑰的大小
KeyPair kp = kpg.genKeyPair();// 生成密鑰對
PublicKey pbkey = kp.getPublic();// 創建公鑰
PrivateKey prkey = kp.getPrivate();// 創建私鑰
// 保存公鑰
FileOutputStream file1 = new FileOutputStream("D:/temp/Skey_RSA_pub.dat");
ObjectOutputStream ob1 = new ObjectOutputStream(file1);//創建ObjectOutputStream對象
ob1.writeObject(pbkey); //將指定的對象寫入 ObjectOutputStream。
// 保存私鑰
FileOutputStream file2 = new FileOutputStream("D:/temp/Skey_RSA_priv.dat");
ObjectOutputStream ob2 = new ObjectOutputStream(file2);
ob2.writeObject(prkey);
}
public static void Encryption_RSA() throws Exception {
System.out.println("根據公鑰生成密文:"+"\n");
String string = "I am a student";
// 獲取公鑰及參數e,n
FileInputStream f_in = new FileInputStream("D:/temp/Skey_RSA_pub.dat");
ObjectInputStream o_in = new ObjectInputStream(f_in);
RSAPublicKey pbk = (RSAPublicKey) o_in.readObject();
BigInteger e = pbk.getPublicExponent();//返回此公鑰的指數
BigInteger n = pbk.getMolus();//返回此公鑰的模
System.out.println("公鑰的指數 e= " + e);
System.out.println("公鑰的模 n= " + n);
// 明文 bit
byte bt[] = string.getBytes("UTF8");
BigInteger bit = new BigInteger(bt);
// 計算密文c,列印
BigInteger mi = bit.modPow(e, n);//生成密文
System.out.println("生成密文為: " + mi+"\n\n");//列印密文
// 保存密文
String save = mi.toString();
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("D:/temp/Enc_RSA.dat")));
out.write(save, 0, save.length());
out.close();
Decrypt_RSA();
}
public static void Decrypt_RSA() throws Exception {
System.out.println("根據私鑰破解密文:"+"\n");
// 讀取密文
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream("D:/temp/Enc_RSA.dat")));
String ctext = in.readLine();
BigInteger mi = new BigInteger(ctext);
// 讀取私鑰
FileInputStream f = new FileInputStream("D:/temp/Skey_RSA_priv.dat");
ObjectInputStream b = new ObjectInputStream(f);
RSAPrivateKey prk = (RSAPrivateKey) b.readObject();
BigInteger d = prk.getPrivateExponent();//返回此私鑰的指數
BigInteger n = prk.getMolus();//返回此私鑰的模
System.out.println("私鑰的指數 d= " + d);
System.out.println("私鑰的模 n= " + n);
BigInteger jie = mi.modPow(d, n);//進行解密操作
System.out.println("m= " + jie); // 顯示解密結果
byte[] mt = jie.toByteArray();
System.out.println("解密後的文本內容為: ");
for (int i = 0; i < mt.length; i++) {
System.out.print((char) mt[i]);
}
}
}
⑵ rsa解密演算法
我剛剛復習完關於rsa的演算法知識,告訴你吧:
RSA公鑰密碼系統:
1.密鑰對的產生:隨機產生兩個大的素數:p,q 計算n=p×q
2.隨機產生加密密鑰e:選擇一個隨機的e使Gcd(e,(p-1)*(q-1))= 1就是選擇一個隨機的e,使e和 (p-1)*(q-1)互素。通常e也選擇成素數。
這樣,公鑰對(n,e)就產生了
3.計算解密密鑰d:計算一個數d 條件是使得e*d mod (p-1)*(q-1)=1,其中n與d也要互素。
這樣就產生了私鑰對(n,d)
發送者給持有密鑰(n,d)的人發送某數M
發送密文C=M^e mod n
接受者利用私鑰解密M=C^d mod n
計算模指數當然需要特殊的演算法啦,要不然計算機也沒辦法算啊:演算法如下:
#include <iostream>
#include <cmath>
using namespace std;
int exp_mod(int a,int n,int z)
{
int exp = 1;
int x = a % z;
while (n>0)
{
if(n%2==1)
exp = (exp * x) % z;
x = (x * x) % z;
n = n/2;
}
return exp;
}
int main()
{
int a,n,z;
cout<< "請輸入底數: ";
cin>>a;
cout<< "請輸入指數: ";
cin>>n;
cout<< "請輸入被模數: ";
cin>>z;
int result = exp_mod(a,n,z);
cout<< "結果是:"<<result<<endl;
cout<<"普通演算法結果"<<long(pow(a,n))%z <<endl;/*double pow(int
x,int y)求x的y次方*/
return 0;
}
這個是算A^B mod C 的C++源碼。
希望對你有幫助,好的話別忘了加分啊!
⑶ 為何能分解大整數n即意味著破解rsa演算法
因為如果n可以被因數分解,d就可以算出,也就意味著私鑰被破解。
可是,大整數的因數分解,是一件非常困難的事情。目前,除了暴力破解,還沒有發現別的有效方法。
對極大整數做因數分解的難度決定了RSA演算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA演算法愈可靠。
假如有人找到一種快速因數分解的演算法,那麼RSA的可靠性就會極度下降。但找到這樣的演算法的可能性是非常小的。今天只有短的RSA密鑰才可能被暴力破解。到2008年為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。
只要密鑰長度足夠長,用RSA加密的信息實際上是不能被解破的。
RSA演算法簡介:
RSA演算法是一種加密演算法,廣泛應用於現在的信息加密傳輸等領域,它的狹義應用流程如下:
現在加如你需要傳送某一串信息M(這里簡化為數字)給一些人,利用RSA演算法加密以後你可以得到一個密文C,然後你將密文C傳送給你需要傳達的人,而對方有一個密鑰D,對方可以比較容易地利用密鑰D將密文C解密得到需要的信息M。
那麼這里為了傳輸信息的保密,我們就要盡可能保證密文C不會被其它人解密,也就是盡可能無法讓旁人得到D的值。
⑷ 使用高強度的RSA等演算法對錄像中的幀數據進行加密後怎樣解密
既然用了RSA演算法加密,顯然要用公鑰解密了。 假如沒有公鑰,那就沒法破解,除非你有量子計算機~
問私鑰的持有者拿,如果他不公開公鑰,那也沒辦法~
⑸ 4096位RSA演算法被側信道攻擊破解,這對當前的IT界安全有什麼影響
最近的網路中,4096位RSA演算法被側信道攻擊破解,這引起了一陣轟動和不安。安全不是個問題,問題的關鍵是:投入多少,要求多少安全強度的信道。DES的弱點密鑰開始通信的時候必須基於可信信道,如果密鑰被截獲。那麼信息毫無保密可以言。所以可以用diffid-Hellman交換DES的密鑰。
所以說,安全問題刻不容緩,我們需要加強對網路安全的監管和維護,促進網路和諧發展。
⑹ rsa演算法的攻擊方法有哪些
1 密碼破譯者知道的信息
密文:可以通過竊聽來獲取。
數E和N:公鑰是公開的信息,因此密碼破譯者知道E和N。
2 密碼破譯者不知道的信息
明文:需要破譯的內容。
數D:私鑰至少D是不知道的信息。
其他:密碼破譯者不知道生成密鑰對時所使用的p、q和L
二 通過密文來求明文
RSA的加密過程如下。
密文=明文的E次方 mod N
由於密碼破譯者知道密文、E和N,那麼有沒有一種方法能夠用E次方 mod N之後的密文求出原來的明文呢?如果沒有 mod
N的話,即:
密文=明文的E次方
通過密文求明文的難度不大,因為這可以被看作是一個求對數的問題。
但是,加上 mod N之後,求明文就變成了求離散對數的問題,這是非常困難的,因為人類還沒有發現求離散對數的高效演算法。
三 通過暴力破解來找出D
只要知道數D,就能夠對密文進行解密。因此,可以逐一嘗試有可能作為D的數字來破譯RSA,也就是暴力破解法。暴力破解的難度會隨著D的長度增加而變大,當D足夠長時,就不可能在現實的時間內通過暴力破解找出數D。
現在,RSA中所使用的p和q的長度都在1024比特以上,N的長度為2048比特以上。由於E和D的長度可以和N差不多,因此要找出D,就需要進行2048比特以上的暴力破解。要在這樣的長度下用暴力破解找出D是極其困難的。
⑺ rsa加密解密演算法
1978年就出現了這種演算法,它是第一個既能用於數據加密
也能用於數字簽名的演算法。它易於理解和操作,也很流行。算
法的名字以發明者的名字命名:Ron Rivest, AdiShamir 和
Leonard Adleman。但RSA的安全性一直未能得到理論上的證明。
RSA的安全性依賴於大數分解。公鑰和私鑰都是兩個大素數
( 大於 100個十進制位)的函數。據猜測,從一個密鑰和密文
推斷出明文的難度等同於分解兩個大素數的積。
密鑰對的產生:選擇兩個大素數,p 和q 。計算:
n = p * q
然後隨機選擇加密密鑰e,要求 e 和 ( p - 1 ) * ( q - 1 )
互質。最後,利用Euclid 演算法計算解密密鑰d, 滿足
e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )
其中n和d也要互質。數e和
n是公鑰,d是私鑰。兩個素數p和q不再需要,應該丟棄,不要讓任
何人知道。 加密信息 m(二進製表示)時,首先把m分成等長數據
塊 m1 ,m2,..., mi ,塊長s,其中 2^s <= n, s 盡可能的大。對
應的密文是:
ci = mi^e ( mod n ) ( a )
解密時作如下計算:
mi = ci^d ( mod n ) ( b )
RSA 可用於數字簽名,方案是用 ( a ) 式簽名, ( b )
式驗證。具體操作時考慮到安全性和 m信息量較大等因素,一般是先
作 HASH 運算。
RSA 的安全性。
RSA的安全性依賴於大數分解,但是否等同於大數分解一直未能得到理
論上的證明,因為沒有證明破解RSA就一定需要作大數分解。假設存在
一種無須分解大數的演算法,那它肯定可以修改成為大數分解演算法。目前,
RSA的一些變種演算法已被證明等價於大數分解。不管怎樣,分解n是最顯
然的攻擊方法。現在,人們已能分解140多個十進制位的大素數。因此,
模數n必須選大一些,因具體適用情況而定。
RSA的速度:
由於進行的都是大數計算,使得RSA最快的情況也比DES慢上100倍,無論
是軟體還是硬體實現。速度一直是RSA的缺陷。一般來說只用於少量數據
加密。
RSA的選擇密文攻擊:
RSA在選擇密文攻擊面前很脆弱。一般攻擊者是將某一信息作一下偽裝
(Blind),讓擁有私鑰的實體簽署。然後,經過計算就可得到它所想要的信
息。實際上,攻擊利用的都是同一個弱點,即存在這樣一個事實:乘冪保
留了輸入的乘法結構:
( XM )^d = X^d *M^d mod n
前面已經提到,這個固有的問題來自於公鑰密碼系統的最有用的特徵
--每個人都能使用公鑰。但從演算法上無法解決這一問題,主要措施有
兩條:一條是採用好的公鑰協議,保證工作過程中實體不對其他實體
任意產生的信息解密,不對自己一無所知的信息簽名;另一條是決不
對陌生人送來的隨機文檔簽名,簽名時首先使用One-Way HashFunction
對文檔作HASH處理,或同時使用不同的簽名演算法。在中提到了幾種不
同類型的攻擊方法。
RSA的公共模數攻擊。
若系統中共有一個模數,只是不同的人擁有不同的e和d,系統將是危險
的。最普遍的情況是同一信息用不同的公鑰加密,這些公鑰共模而且互
質,那末該信息無需私鑰就可得到恢復。設P為信息明文,兩個加密密鑰
為e1和e2,公共模數是n,則:
C1 = P^e1 mod n
C2 = P^e2 mod n
密碼分析者知道n、e1、e2、C1和C2,就能得到P。
因為e1和e2互質,故用Euclidean演算法能找到r和s,滿足:
r * e1 + s * e2 = 1
假設r為負數,需再用Euclidean演算法計算C1^(-1),則
( C1^(-1) )^(-r) * C2^s = P mod n
另外,還有其它幾種利用公共模數攻擊的方法。總之,如果知道給定模數
的一對e和d,一是有利於攻擊者分解模數,一是有利於攻擊者計算出其它
成對的e』和d』,而無需分解模數。解決辦法只有一個,那就是不要共享
模數n。
RSA的小指數攻擊。 有一種提高
RSA速度的建議是使公鑰e取較小的值,這樣會使加密變得易於實現,速度
有所提高。但這樣作是不安全的,對付辦法就是e和d都取較大的值。
RSA演算法是第一個能同時用於加密和數字簽名的演算法,也易於理解和操作。
RSA是被研究得最廣泛的公鑰演算法,從提出到現在已近二十年,經歷了各
種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。
RSA的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難
度與大數分解難度等價。即RSA的重大缺陷是無法從理論上把握它的保密性
能如何,而且密碼學界多數人士傾向於因子分解不是NPC問題。
RSA的缺點主要有:
A)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次
一密。B)分組長度太大,為保證安全性,n 至少也要 600 bits
以上,使運算代價很高,尤其是速度較慢,較對稱密碼演算法慢幾個數量級;
且隨著大數分解技術的發展,這個長度還在增加,不利於數據格式的標准化。
目前,SET(Secure Electronic Transaction)協議中要求CA採用2048比特長
的密鑰,其他實體使用1024比特的密鑰。
⑻ 什麼是手機破解RSA 有什麼用呢
簡單的說~~~RSA~~、就是保護手機的!!! 一般別破`~~
⑼ 簡述RSA體制密鑰的生成及其加密、解密演算法。
RSA體制密鑰的生成:
1. 選擇兩個大素數,p 和q 。
2. 計算: n = p * q (p,q分別為兩個互異的大素數,p,q 必須保密,一般要求p,q為安全素數,n的長度大於512bit ,這主要是因為RSA演算法的安全性依賴於因子分解大數問題)。有歐拉函數 (n)=(p-1)(q-1)。
3. 然後隨機選擇加密密鑰e,要求 e 和 ( p - 1 ) * ( q - 1 ) 互質。
4. 最後,利用Euclid 演算法計算解密密鑰d, 滿足de≡1(mod φ(n))。其中n和d也要互質。數e和n是公鑰,d是私鑰。兩個素數p和q不再需要,應該丟棄,不要讓任何人知道。
加密、解密演算法:
1. 加密信息 m(二進製表示)時,首先把m分成等長數據塊 m1 ,m2,..., mi ,塊長s,其中 2^s <= n, s 盡可能的大。
2. 對應的密文是:ci ≡mi^e ( mod n ) ( a )
3. 解密時作如下計算:mi ≡ci^d ( mod n ) ( b ) RSA 可用於數字簽名,方案是用 ( a ) 式簽名, ( b )式驗證。
⑽ 怎麼爆破rsa演算法的密鑰
已知的破解的過程需要將模數分解質因數,當模數足夠大的情況下,以現在的人類算力因為難度極大可以視為是無法破解的。
不知是否存在不需要分解質因數的破解方法,但是已經從數學上被證明即使存在這樣的破解方法,該方法的算力難度同分解質因數法是相當的,故以今天的算力水平可也視為無法破解。