zoukankan      html  css  js  c++  java
  • 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])+"
    "
            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]) + "
    "
            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)
  • 相关阅读:
    【学习笔记】整除分块
    【Luogu P2201】【JZOJ 3922】数列编辑器
    【SSL1786】麻将游戏
    【SSL2325】最小转弯问题
    【JZOJ 3910】Idiot 的间谍网络
    【Luogu P1879】[USACO06NOV]玉米田Corn Fields
    【JZOJ 3909】Idiot 的乘幂
    【JZOJ 3918】蛋糕
    【Luogu P3174 】[HAOI2009]毛毛虫
    【SSL1194】最优乘车
  • 原文地址:https://www.cnblogs.com/duke77--null/p/9026458.html
Copyright © 2011-2022 走看看