當前位置:首頁 » 操作系統 » rsa演算法破解

rsa演算法破解

發布時間: 2022-06-17 11:01:43

⑴ 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演算法的密鑰

已知的破解的過程需要將模數分解質因數,當模數足夠大的情況下,以現在的人類算力因為難度極大可以視為是無法破解的。

不知是否存在不需要分解質因數的破解方法,但是已經從數學上被證明即使存在這樣的破解方法,該方法的算力難度同分解質因數法是相當的,故以今天的算力水平可也視為無法破解。

熱點內容
安卓哪個型號不卡 發布:2024-11-07 00:19:03 瀏覽:484
mxml庫編譯 發布:2024-11-07 00:18:07 瀏覽:212
dnsdns伺服器地址 發布:2024-11-07 00:16:23 瀏覽:10
怎麼搭建推流到拉流伺服器 發布:2024-11-07 00:16:22 瀏覽:499
處理器源碼 發布:2024-11-07 00:15:15 瀏覽:339
PHP里tr 發布:2024-11-07 00:10:18 瀏覽:348
壓縮彈簧的計算 發布:2024-11-07 00:10:18 瀏覽:836
c語言四位數字 發布:2024-11-07 00:04:59 瀏覽:221
丹江口一中ip和dns伺服器 發布:2024-11-06 23:54:45 瀏覽:880
pythonwithfileas 發布:2024-11-06 23:53:24 瀏覽:19