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)



阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页