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)

原文地址:https://www.cnblogs.com/duke77--null/p/9026458.html

时间: 2024-10-24 23:43:41

RSA连分数攻击实现的相关文章

RSA学习档案

RSA 学习档案 基本原理 随机选择两个质数p,q模数n=p*qφ(n)=(p?1)(q?1)选择加密指数e: 1 < e < φ(n)计算机密指数d: e*d % φ(n) = 1c = m ^ e % nm = c ^ d % n 常见攻击方式 模数分解 1.直接分解 n小于256bit可以本地暴力分解.去factordb查询是否有已经分解成功的结果. 2.给出多个n,可以尝试计算n之间的最大公约数. from libnum import * n1 = 905101396540408448

RSA进阶之低加密指数攻击

适用场景: n很大,4000多位,e很小,e=3 一般来说,e选取65537.但是在RSA加密的时候有可能会选用e=3(不要问为什么,因为选取e =3省时省力,并且他可能觉得n在4000多位是很安全的,). RSA加密是m的e次方模n等于c. ①m^3<n,也就是说m^3=c. ②m^3>n,即(m^3+in)mod n=c(爆破i,不知道i取什么值) 我们可以直接开三次方,其实上边这两个情况可以用一个脚本完成. import gmpy N=72105952757214595949786607

MD5加密和RSA加密

1.MD5加密  MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),MD5算法的使用不需要支付任何版权费用. MD5的功能:     ①.输入任意长度的信息,经过处理,输出为128位的信息(数字指纹):    ②.不同的输入得到的不同的结果(唯一性):    ③.根据128位的输出结果不可能反推出输入的信息(不可逆),也就是只能加密,不能解密:  MD5的用途:     1.防止被篡改:    1)比如发送一个电子文档,发送前,我先得到MD5的

web安全之攻击

转自 知乎https://www.zhihu.com/question/22953267 作者:潘良虎链接:https://www.zhihu.com/question/22953267/answer/80141632来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 多年前写过一篇 「Web安全之SQL注入攻击技巧与防范」,今天回头再看依然有价值,就偷个懒,直接贴过来了. Web安全简史 在Web1.0时代,人们更多是关注服务器端动态脚本语言的安全问题,比如将一个可

iOS RSA的网络安全模型、iOS签名机制总结(登录、token安全、签名)

摘要 最近公司准备做一个安全级别比较高的项目:技术总监给我们提出了一个这样子的需求:在http请求过程中,即使嗅探器捕获到网络请求的链接也无法去请求到数据.经过一番思考,觉得支付宝的签名完全符合这样子的需求.但是之前自己对签名.RSA等知识也是知道的很少,所以花了一番功夫学习了一下.本文将针对RSA登录和http请求作讲解,希望对大家有所帮助. 一.登录.登录保持(http请求) 登录机制 登录机制大概可以分为一下三个阶段: 1. 登录验证:是指客户端提供用户名和密码,向服务器提出登录请求,服务

RSA算法(二)

转载:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html 作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解RSA算法.假设爱丽丝要与鲍勃进行加密通信,她该怎么生成公钥和私钥呢? 第一步,随机选择两个不相等的质数p和q. 爱丽丝选择了61和53.(实际应用中,这两个质数越

AES,SHA1,DES,RSA,MD5区别

AES:更快,兼容设备,安全级别高: SHA1:公钥后处理回传 DES:本地数据,安全级别低 RSA:非对称加密,有公钥和私钥 MD5:防篡改 相关: 公开密钥加密(英语:public-key cryptography,又译为公开密钥加密),也称为非对称加密(asymmetric cryptography),一种密码学算法类型,在这种密码学方法中,需要一对密钥,一个是私人密钥,另一个则是公开密钥.这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密.如果知道了其中一

由脱库攻击谈口令字段的加密策略——密码泄露事件杂谈之一

转自:http://blog.sina.com.cn/s/blog_61efbd3c01012wmx.html (原作者:江海客 知名网络安全专家,安天实验室首席技术架构设计师.) 我不得不惨痛地写在前面的是,这是一个安全崩盘的时代.在过去一年,已经证实遭遇入侵的.并导致关键数据被窃或者被泄露的公司,包括索尼.世嘉这样的大型游戏设备厂商,包括花旗银行这样的金融机构,也包括了RSA这样的安全厂商. 这些事件中最令业界瞠目的是RSA的被入侵,这导致多家工业巨头遭遇连锁地攻击,还有很多安全企业本身也使

python实现RSA加密算法

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. 今天只有短的RSA钥匙才可能被强力方式解破.到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式.只要其密钥的长度足够长,用RSA加密的信息实际上是不能被解破的.但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战. RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥.