RSA连分数攻击实现

一:程序主逻辑

#codeing:UTF-8
#__author__:Administrator
#date:2018/4/27/027 0:23
import time
import os
import sys
base_dir = os.path.dirname((__file__))  #路径的加入
# print(base_dir)
sys.path.append(base_dir)#路径的加入
import wiener

def encode(N,e):
    file_name = input("请输入数据保存的文件名:>如:RSA加密1.txt>>")
    file = open(file_name, "w", encoding="utf-8")
    need_code_data = input("请输入需要加密的数据>>>").strip()
    need_code_data = int(need_code_data)
    print("需要加密的数据为:",need_code_data)
    # need_code_data_list = []
    # encode_data_list = []
    # col_num = int(len(need_code_data)/8) +1
    # for i in range(col_num):
    #     if i < col_num -1:
    #         deal_data = need_code_data[i*8:i*8+8]
    #     else:
    #         deal_data = need_code_data[i*8:]
    #     # print(int(deal_data))
    #     need_code_data_list.append(int(deal_data))
    # print(need_code_data_list)
    # print(bin(e))
    e_of_b = str(bin(e))[2:]
    # print(e_of_b)
    save_data = 1
    for x in e_of_b:
        g = need_code_data
        if x == "1":
            save_data = (save_data*g)%N
        else:
            save_data = (save_data ** 2)%N
    # print(save_data)
    file.write(str(save_data))
    file.close()
    return save_data
    # for i in need_code_data_list:   #分组计算
    #     save_data = 1#pow(i,e)
    #     # cal_num = 2
    #     print(i,type(i))
    #     for x in e_of_b:
    #         if x == "1":
    #             save_data = (save_data*i)%N
    #         else:
    #             save_data = (save_data ** 2) % N
    #     print(save_data)
    #     encode_data_list.append(save_data)
    # print(encode_data_list)
def calculate_data(N,e):
    file_name = input("请输入数据保存的文件名:>如:连分数展开1.txt>>")
    file = open(file_name,"w",encoding="utf-8")
    # N = 28562942440499
    # e = 7502876735617
    a_list = wiener.calculate_a(e / N)
    # print(a_list)
    A_list = wiener.calcul_A(a_list, len(a_list))
    # print(A_list)
    for i in range(len(a_list)):
        mas = "a"+str(i)+"="+str(a_list[i])+"    A"+str(i)+"="+str(A_list[i])+"="+str(A_list[i][0])+"/"+str(A_list[i][1])+"\n"
        file.write(mas)
    file.close()
def mi_key_hack(N,e):
    file_name = input("请输入数据保存的文件名:>如:RSA攻击1.txt>>")
    file = open(file_name, "w", encoding="utf-8")
    a_list = wiener.calculate_a(e / N)
    A_list = wiener.calcul_A(a_list, len(a_list))
    d_use_data = wiener.check_N(e, N, A_list)
    finall_d_data = wiener.finally_check_d(d_use_data, e, N)
    for i in range(len(finall_d_data)):
        mas = "d=" + str(finall_d_data[i][0]) + " p=" + str(finall_d_data[i][1]) + " q=" + str(
            finall_d_data[i][2]) + "PHI=" + str(finall_d_data[i][3]) + "\n"
        file.write(mas)
    file.close()
    # print(finall_d_data)
def write_N_e(N,e):
    print("之前的N,e分别为:>>>>",N,e)
    input_data = input("请重新输入N、e,用空格隔开>>>>").split(" ")
    # print(input_data)
    N,e = int(input_data[0]),int(input_data[1])
    # print(N,e)
    return (N,e)
def exit_fun(N,e):
    exit()
def main(N,e):
    choice_dict = {1: encode, 2: calculate_data, 3: mi_key_hack ,4:write_N_e,5:exit_fun}
    while True:
        masg = """
        =====功能菜单:============================
        ===           1:数据加密              ===
        ===           2:连分式展开            ===
        ===           3:密钥的攻击            ===
        ===           4:重置N,e               ===
        ===           5:退出函数
        ==========================================
        """
        print(masg)
        choice = int(input("请输入你选择的功能号:>>>>"))
        N_and_e = choice_dict[choice](N,e)
        if choice == 4:
            N,e = N_and_e[0],N_and_e[1]
            print("更改后的N、e为:",N,e)
        print("执行结束,即将返回....")
        time.sleep(1)
if __name__ == "__main__":
    N= 28562942440499
    e = 7502876735617
    print("初始公钥为N,e :",N,e)
    print("提示:进入菜单后可以更改公钥")
    print("提示:进入菜单......")
    # N=160523347  #公钥1
    # e=60728973
    # N=4254607303    #公钥2
    # e=3231248239
    # time.sleep(2)
    main(N,e)

连分数攻击主程序  提示1024bit的攻击未成功

#codeing:UTF-8
#__author__:Administrator
#date:2018/4/26/026 10:06
def calculate_a(calculate_num):
    list_a = []
    deal_num = calculate_num
    for i in range(300):
        moment_a = deal_num % 1
        append_a = deal_num - moment_a
        list_a.append(append_a)
        # print(deal_num,append_a)
        deal_num = 1 /(deal_num-append_a)
    return list_a

def calcul_A(list_a,length_a):
    list_A = []
    for i in range(length_a):
        deal_list = list_a[:i+1]
        deal_num =len(deal_list)
        flag = True
        while deal_num > 1:
            if flag == True:
                p = deal_list[deal_num- 1] * deal_list[deal_num-2] + 1
                q = deal_list[deal_num- 1]
                append_tuple_pq = (int(p),int(q))
                # print(append_tuple_pq)
                deal_num -=2
                flag = False
            else:
                new_q = append_tuple_pq[0]  # p 3
                new_p = append_tuple_pq[1]  # q 2
                p = deal_list[deal_num - 1] * new_q + new_p
                q = new_q
                append_tuple_pq = (int(p),int(q))
                # print(append_tuple_pq)
                deal_num -= 1

        else:
            if flag == True and deal_num ==1 :
                q = deal_list[deal_num-1]
                p = 1
                append_tuple_pq = (int(p),int(q))
                # print(append_tuple_pq)
            else :
                new_q = append_tuple_pq[0]  # p 3
                new_p = append_tuple_pq[1]  # q 2
                p = deal_list[deal_num - 1] * new_q +new_p
                q = new_q
                append_tuple_pq = (int(p), int(q))
        list_A.append(append_tuple_pq)
    return list_A

def check_N(e,N,list_A):  #过滤可用的k/d
    useful_data = []
    for i in list_A:
        k = int(i[0])
        d = int(i[1])
        if (e*d-1)%k==0 and d !=1 and d<N and d!=0:
            useful_data.append(i)
    return useful_data

def finally_check_d(d_list,e,N):
    result_data = []
    for i in d_list:
        k = int(i[0])
        d = int(i[1])
        FIN = int((e * i[1] - 1) / i[0])
        # print(F_and_N)
        p_and_q = N - FIN +1
        # print(p_and_q)
        for x in range(int(p_and_q/2),p_and_q):
            if x * (p_and_q - x) == N:
                result_data.append((d ,x,p_and_q-x,FIN))
    return result_data

# N = 10088821
# e=3905745

if __name__ == "__main__":
    # N=160523347  #公钥1
    # e=60728973

    # N=4254607303    #公钥2
    # e=3231248239

    N = 28562942440499   #公钥3
    e = 7502876735617

    # 公钥4
   #  N=67413492557336846539848944654588427510674136710336496477536280434149753427064025563334904527604187742536389581868217454855192496861370028546941279678384891963660931858219195511402645528868253750722549516549902488662436218392592253709764220778391139803580637991034641103694298696184202191875835150171491066691
   #  e=55668825058376388576113884040385292667510043490011858212473465931416310111625430534836493367797004997544370288958836993585093703688885638705916296545617964378468562419875481220082488169256684043454124045215432169627429196661617858371465847627303530906317588472913047600188255485102837752107180962349209908663
   # # 相关数据
    # [(27763604.0, 33620999.0)]
    # PHI 67413492557336846539848944654588427510674136710336496477536280434149753427062861174765678995902826007920042704951772509122046163305406233434817786489802796641662960034324556978613332350467285294794906107031877163314306505878423580552717416452810213936256441506719861839980217226929893614313258623609084051456
    a_list = calculate_a(e / N)
    # print(a_list)
    A_list = calcul_A(a_list, len(a_list))
    print(A_list)
    print(len(A_list))
    d_use_data = check_N(e, N, A_list)
    print(d_use_data)
    finall_d_data = finally_check_d(d_use_data, e, N)
    print(finall_d_data)

 

posted @ 2018-09-12 21:46  Duke777  阅读(1267)  评论(1编辑  收藏  举报