Python - RSA解密不返回原始消息(非常简单,短程序)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - RSA解密不返回原始消息(非常简单,短程序)相关的知识,希望对你有一定的参考价值。

所以我试图创建一个非常简单的RSA加密/解密程序,我只加密/解密int数字。除一个问题外,一切正常。有时我的解密号码(消息)与我的原始号码(我需要加密和解密的消息)不匹配。只要我输入的数字(消息)接近我的'n'变量中的数字(n = p * q,其中p和q是素数),这似乎就会发生。我现在浏览了一下Stackoverflow并发现RSA算法无法正确解密大于'n'的消息。但在我的情况下,它无法解密接近'n'的消息。如果n = 35并且我的输入数字(要加密/解密的数字)是32,则程序不能正确地将其解密回32,尽管32低于35(适用于31,30但是......)。为什么?

码:

import math

def isPrime(n):
    if n>=2:
        for m in range(2, int(math.sqrt(n)+1)):
            if n%m == 0:
                return False
        return True
    else:
        return False   

def gcd(x, y):
    while y != 0:
        (x, y) = (y, x % y)
    return x


def phi(n):
    amount = 0
    for k in range(1, n + 1):
        if gcd(n, k) == 1:
            amount += 1
    return amount

def findPubE(n, phiN):
    for e in range(3, n, 2):
        if gcd(e,phiN)==1:
            return e
    else:
        raise AssertionError("cannot find 'e'")


def multiplicative_inverse(a, b):
    """Returns a tuple (r, i, j) such that r = gcd(a, b) = ia + jb
    """
    # r = gcd(a,b) i = multiplicitive inverse of a mod b
    #      or      j = multiplicitive inverse of b mod a
    # Neg return values for i or j are made positive mod b or a respectively
    # Iterateive Version is faster and uses much less stack space
    x = 0
    y = 1
    lx = 1
    ly = 0
    oa = a  # Remember original a/b to remove
    ob = b  # negative values from return results
    while b != 0:
        q = a // b
        (a, b) = (b, a % b)
        (x, lx) = ((lx - (q * x)), x)
        (y, ly) = ((ly - (q * y)), y)
    if lx < 0:
        lx += ob  # If neg wrap modulo orignal b
    if ly < 0:
        ly += oa  # If neg wrap modulo orignal a
    # return a , lx, ly  # Return only positive values
    return lx

def encrypt(m,e,n):
    return (m^(e)) % n

def decrypt(M, d):
    return M^(d)




def main():
    p=int(input("Input first prime number (p): "))
    q=int(input("Input second prime number (q): "))
    n=p*q
    print("n = ",n)
    msg= int(input("Input message: "))
    assert msg < n
    phiN=(p-1)*(q-1)
    e = findPubE(n,phiN)
    d = multiplicative_inverse(e,phiN)
    encryptedMsg = encrypt(msg,e,n)
    decryptedMsg = decrypt(encryptedMsg,d)



    assert isPrime(p) and isPrime(q)

    print("phi(n) = ",phiN)
    print("e = ",e)
    print("d = ",d)
    print("Encrypted message: ",encryptedMsg)
    print("Decrypted message: ",decryptedMsg)


main()
答案

解决了!我在代码中犯了两个小错误。第一个是我认为“^”符号在Python中意味着“强大的力量”(正确的符号是“**”),第二个是忘记在我的行中添加“mod n” decrypt()函数(所以return M**(d) % n而不是return M^(d))。

以上是关于Python - RSA解密不返回原始消息(非常简单,短程序)的主要内容,如果未能解决你的问题,请参考以下文章

Python中的RSA加密和解密

使用 RSA 在 JS 中加密消息并在 Python 中解密

Python 和 Golang 之间的 RSA 加密/解密不起作用? [关闭]

Python接口自动化之通过RSA加解密

Python接口自动化之通过RSA加解密

RSA加密和解密与大消息不一致