曾經做過的密碼挑戰賽的題目想寫出來和大家分享下。
首屆(2016)全國高校密碼數學挑戰賽 賽題三
一、 賽題名稱 :RSA加密體制破譯
賽題官網下不到了,我上傳到我的資源裏面了。
查看 附件3-2(發佈截獲數據),結合pdf說明文檔,分析Frame數據。
得出解密方法:
第2、6、19用p-1方法分解N;
第10、14用p-q方法分解N;
第0、4共模攻擊低加密指數
第3、8、12、16、20用廣播
第1 、18用因數碰撞思想。
1.採用共模攻擊和廣播攻擊
首先我利用python 進行提取文件所有值並歸類爲n[20],e[20],c[20]這三個數組,繼續又編寫了解密函數。
2.p-1方法
適用範圍
pollard’s p-1方法有點特殊,它只能應用在求整數n的一個素因子p,且p-1能被“小”因子整除的情況下,除此之外該方法無法正常應用。但是這個方法運用起來相當簡單,所以在防止因式分解攻擊時,必須考慮這一方法。
2.p-q方法
4.因子碰撞
5.總結結果
附錄實驗代碼
Base.py
#coding=utf-8
'''
Created on 2017年5月24日
@author: xxx
'''
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
def bin2hex(string_num):
return dec2hex(bin2dec(string_num)).zfill(16)
def dec2bin(num):
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 2)
mid.append(base[rem])
return ''.join([str(x) for x in mid[::-1]])
def dec2hex(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 16)
mid.append(base[rem])
return ''.join([str(x) for x in mid[::-1]])
def hex2dec(string_num):
return str(int(string_num.upper(), 16))
def bin2dec(string_num):
return int(string_num, 2)
def hex2bin(string_num):
a=[]
for i in range(int(len(string_num)/16)):
a.append(dec2bin(hex2dec(string_num[16*i:16*(i+1)-1].upper())).zfill(64))
# return dec2bin(hex2dec(string_num.upper())).zfill(64)
return a
def str2asc_bin(string):
a,c=[],''
for i in string:
a.append(ord(i))
for i in a:
c+=str(dec2bin(i).zfill(8))
return c
def asc_bin2str(string):
a=''
for i in range(len(string)/8):
a+=str(chr(bin2dec(string[8*i:8*i+8])))
return a
Readfile.py
'''
Created on 2018年1月4日 上午9:13:04
@author: xxx
'''
import Base
from operator import is_
def is_same(list):
for i in range(len(list)-1):
for j in [i+1,len(list)-1]:
if(list[i]==list[j]):
print i,j
def print_list(string,list):
print string,'***************************************************************************'
for i in range(len(list)):
if(i<=9):print str(i),'',list[i],str(i)
else:print str(i),list[i],str(i)
def decryped(num,string,string2):
c,a,count=[],'',0
for i in range(len(string)):
a+=string[i]
count+=1
if(count%2==0):
count=0
c.append(a)
a=''
for i in c:
a+=chr(int(i.upper(), 16))
print 'Part',num,'---->',a
def fun(x,n,N):
'''快速模取冪算法'''
res=1
while n>0:
if(n & 1):
res=(res*x)%N
x=(x*x)%N
n >>= 1
return res
def match(allkinds,n,e,c,num_of_Frame):
a=''
for i in range(len(allkinds)):
a+=Base.dec2hex(ord(allkinds[i]))
#print 'a',a
n2=int(Base.hex2dec(n))
#print 'n2',n2,type(n2)
a2=int(Base.hex2dec('0x9876543210ABCDEF'+Base.dec2hex(num_of_Frame).zfill(8)+'0'*88+a))
#print 'a2',Base.dec2hex(str(a2)),Base.dec2hex(num_of_Frame).zfill(8)
e2=int(Base.hex2dec(e))
#print 'e2',e2
#print 'c',c
un_c=fun(a2,e2,n2)
un_c2=Base.dec2hex(str(un_c))
#print 'un_c2',un_c2
if(un_c2==c):return 1
else:return 0
m,N,e,c=[],[],[],[]
filename=['Frame'+str(i) for i in range(21)]
for i in range(21):
fd = open(filename[i],'r')
m.append(fd.read())
fd.close()
for frame in m:
N.append(frame[0:256])
e.append(frame[256:512])
c.append(frame[512:768])
print_list('N=',N)
print_list('e=',e)
print_list('c=',c)
decryped(0,'4D79207365637265','From Frame 0 and 4')
decryped(1,'7420697320612066','From Frame 3,8,12,16 and 20')
decryped(5,'696E737465696E2E','From Frame 19')
decryped(6,'2054686174206973','From Frame 2')
decryped(7,'20224C6F67696320','From Frame 6')
decryped(8,'77696C6C20676574','From Frame 10')
decryped(9,'20796F752066726F','From Frame 14')
decryped(10,'6D204120746F2042','From Frame 18')
decryped(11,'2E20496D6167696E','From Frame 1')
print match('m A to B', N[18], e[18], c[18], 10)
def final_match(mingwen):
for i in range(20):
for j in range(20):
if(match(mingwen, N[i], e[i], c[i], j)):print 'seccessful','Result is right!!','Frame',i,'<======>','Part',j
'''
以下都是我們的猜測字符串,然後進行匹配
'''
mingwen2=['ll take ','you ever','ywhere. ']
for i in mingwen2:
final_match(i)