Python RSA暴力检查

Python RSA暴力检查,python,encryption,cryptography,rsa,brute-force,Python,Encryption,Cryptography,Rsa,Brute Force,我做了一个练习,用一个很小的密钥对一段文本进行了加密。我拥有的公钥是(e=5,n=203)。文本已转换为ASCII码,移位为固定数字,然后使用RSA公钥进行加密。我只能用蛮力解密这段文字。要解密,我使用以下简单公式: decrypt = (value**d)%n 其中value是我想要解密的东西,d是我不确定的值,n是模数 到目前为止,我已经将这些数字放入一个名为en的元组中,然后像这样循环: for i in range(1,10): for a in range(0,41):

我做了一个练习,用一个很小的密钥对一段文本进行了加密。我拥有的公钥是(e=5,n=203)。文本已转换为ASCII码,移位为固定数字,然后使用RSA公钥进行加密。我只能用蛮力解密这段文字。要解密,我使用以下简单公式:

decrypt = (value**d)%n
其中value是我想要解密的东西,d是我不确定的值,n是模数

到目前为止,我已经将这些数字放入一个名为en的元组中,然后像这样循环:

for i in range(1,10):   
    for a in range(0,41):
       ans = (en[a]**i)%203
       print (chr(ans))

第一个for循环是“d”,这是我不确定的私钥值,第二个for循环用于遍历41长度的元组。我还没有实现块移位部分,但我想检查这是否是暴力强制使用简单RSA密钥的正确方法。

您应该尝试使用暴力将n因子化:

for i in range(n):
    if n%i == 0:
        print i
,从中可以找到p=7和q=29

d=e^-1模φ(n)
=e^-1模(p-1)*(q-1)


因此
d=e^-1 mod 168
,因此
d=162
我冒昧地改进了L3viathan的答案,并提供了一个完整的工作源代码,可以复制粘贴并运行:

def egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = egcd(b % a, a)
        return (g, x - (b // a) * y, y)

def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
        raise Exception('modular inverse does not exist')
    else:
        return x % m

def factor(n):
    for i in range(3, n):
        if n%i == 0:
            return i

e = 5
n = 203

p = factor(n)
q = n//p
phi_n = (p-1) * (q-1)

# Only for python >= 3.8
# From https://docs.python.org/3/library/functions.html#pow
# If mod is present and exp is negative, base must be relatively prime to mod.
# In that case, pow(inv_base, -exp, mod) is returned, where inv_base is an inverse to base modulo mod.
# d_crack = pow(e, -1, phi_n)

# python < 3.8
d_crack = modinv(e, phi_n)

print('cracked d:', d_crack) # prints "cracked d: 101"
def egcd(a,b):
如果a==0:
返回(b,0,1)
其他:
g、 y,x=egcd(b%a,a)
返回(g,x-(b//a)*y,y)
def modinv(a,m):
g、 x,y=egcd(a,m)
如果g!=1:
引发异常('模逆不存在')
其他:
返回x%m
def系数(n):
对于范围(3,n)内的i:
如果n%i==0:
返回i
e=5
n=203
p=系数(n)
q=n//p
phi_n=(p-1)*(q-1)
#仅适用于python>=3.8
#从https://docs.python.org/3/library/functions.html#pow
#若mod存在且exp为负,则base必须相对mod为素数。
#在这种情况下,返回pow(inv_base,-exp,mod),其中inv_base与基模mod相反。
#d_裂纹=功率(e,-1,φn)
#python<3.8
d_裂纹=modinv(e,φn)
打印('cracked d:',d#u crack)#打印“cracked d:101”

非常感谢您的建议,但我不想用最普通的方式来做。我得继续努力直到拿到d。这就是我想检查我使用的公式是否正确的原因。对于范围(1,10)内的I,你的10从哪里来?这只是一个要检查的初始范围。后面没有什么东西。d不等于162。