RSA攻擊之wiener攻擊

2021-06-29 11:04:39 字數 2269 閱讀 8491

詳細資訊請參閱維基百科(連分數)

在數學中,連分數或繁分數即如下表示式:

這裡的a0是某個整數,而所有其他的數an都是正整數,可依樣定義出更長的表示式。

下面通過實際的例子來學習如何將乙個實數轉換為連分數

eg:找出3.245的連分數

結合rsa演算法,我們理解上面的定理

根據上面的定理,我們根據給定的實數a求出p、q。具體過程如下

在正式開啟程式設計之前,必須明確本次攻擊是有前提的:

1.嘗試的d有限(可以事先設定乙個閾值n,即嘗試的次數,本測試案例設定n為10,實際上這遠不夠,可根據自己的需要適當增大n)

其次,與其他rsa攻擊目標不同,這次攻擊的目標是d

[cpp]view plain

copy

#include 

#include 

#include "gmp.h"

#include "iostream"

#include

#define n 10

using

namespace

std;  

/*本案例為測試工程,所設定的n比較小*/

intmain()  

mpf_t b_tmp[n];  

for( i=0;i

mpz_t b[n];  

for( i=0;i

mpz_t q[n];  

for(i=0;i

mpf_div(a[0],e,n);  

gmp_printf("a[0]:%ff\n"

, a[0]);  

mpf_trunc(b_tmp[0],a[0]);  

gmp_printf("b_tmp[0]:%ff\n"

, b_tmp[0]);  

tmpb=mpf_get_ui (b_tmp[0]) ;  

mpz_set_ui(b[0],tmpb);  

gmp_printf("b[0]:%zd\n"

,b[0]);  

mpz_set_ui(q[0],1);  

gmp_printf("q[0]:%zd\n"

, q[0]);  

mpf_t sub_tmp;  

mpf_init(sub_tmp);  

mpf_sub(sub_tmp,a[0],b_tmp[0]);  

mpf_div(a[1],one,sub_tmp);  

gmp_printf("a[1]:%ff\n"

,a[1]);  

mpf_trunc(b_tmp[1],a[1]);  

tmpb=mpf_get_ui (b_tmp[1]) ;  

mpz_set_ui(b[1],tmpb);  

gmp_printf("b[1]:%zd\n"

,b[1]);  

mpz_set(q[1],b[1]);  

gmp_printf("q[1]:%zd\n"

,q[1]);  

mpz_t mul_tmp;  

mpz_init(mul_tmp);  

mpz_t ed,result;  

mpz_init(ed);  

mpz_init(result);  

for(i=2;i

}  printf("目前破解失敗,請調大n重試!"

);  

}   先假設n=9449868410449    e=6792605526025  執行程式觀察實驗結果:

RSA 時序攻擊

rsa的破解從理論上來講是大數質數分解,可是就是有一些人另闢蹊徑,根據你解密的時間長短就能破解你的rsa私鑰。舉乙個不恰當但是比較容易理解的例子 密文 0101 私鑰0110 明文0100 問題的關鍵來了,進行 運算時如果有乙個0,那麼運算的時間為1ms,如果兩個都是1,運算的時間是10ms 只是個...

RSA攻擊總結

相關概念 什麼是dp dp d mod p 1 推導過程 dp equiv d mod p 1 dp times e equiv d times e mod p 1 d times e k times p 1 dp times e d times e equiv 1 mod p 1 times q ...

DDOS攻擊之DNS放大攻擊

此ddos攻擊是基於反射的體積分布式拒絕服務 ddos 攻擊,其中攻擊者利用開放式dns解析器的功能,以便使用更大量的流量壓倒目標伺服器或網路,從而呈現伺服器和它周圍的基礎設施無法進入。所有放大攻擊都利用了攻擊者和目標web資源之間的頻寬消耗差異。當在許多請求中放大成本差異時,由此產生的流量可能會破...