Python RSA暴力检查

时间:2015-01-31 18:15:36

标签: python encryption cryptography rsa brute-force

我正在练习用一把非常小的密钥加密一段文本。我拥有的公钥是(e = 5,n = 203)。文本已转换为ASCII,移位固定数字,然后使用RSA公钥加密。我必须使用强力解密此文本。解密我使用简单的公式:

decrypt = (value**d)%n

值是我要解密的东西,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密钥的正确方法。

2 个答案:

答案 0 :(得分:3)

你应该尝试用蛮力来计算n:

for i in range(n):
    if n%i == 0:
        print i

,从中可以找到p = 7和q = 29。

d = e^-1 mod phi(n) = e^-1 mod (p-1)*(q-1)

因此d = e^-1 mod 168,ergo d=162

答案 1 :(得分:0)

我冒昧地改进了 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"