2016密碼挑戰賽(RSA 加密體制破譯)解題過程

 曾經做過的密碼挑戰賽的題目想寫出來和大家分享下。

首屆(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)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章