RSA密码学显示大质数的错误结果

发布于 2025-01-26 09:40:08 字数 2028 浏览 2 评论 0原文

我使用python实施了一个RSA加密程序,它使用具有10位数字的质数完美地工作。但是,例如,当我使用具有25位或更多数字的数字时,它不起作用。

它与以下键一起工作:

p = 2324731
q = 186647
e = 433899328297
n = 433904066957

它不使用:

p = 3673864730662357928718503
q = 2127738717256957618781057
e = 7817024229395103552360986476332293342120062315901
n = 7817024229395103552360993847944520620136941797671

这是代码:

倒数(d键):

@classmethod
def __linearOperation(cls, a, b, mdc, i):

    t = -int(a / b)
    r = a % b

    mdc.append([1, a, t, b])

    if r == 1:
        return mdc

    inverseLine = cls.__linearOperation(b, r, mdc, i + 1)

    s = inverseLine[i][0]
    t = inverseLine[i][2]
    inverseLine[i - 1][0] *= t
    inverseLine[i - 1][2] *= t
    inverseLine[i - 1][2] += s

    inverseLine.remove(inverseLine[i])
    return inverseLine 

def __inverse(self, e, φ):
    
    inverseLine = self.__linearOperation(e, φ, [], 1)
    inverse = inverseLine[0][0]

    if inverse < 0:
        return inverse + φ
    if inverse > φ:
        return inverse % φ
    else:
        return inverse

模块化指数:

@staticmethod
def __QuickMod(base, exp, n):

    result = 1
    while exp > 0:
        if exp & 1:
            result = (result * base) % n
        
        base = (base ** 2) % n
        exp = exp >> 1

    return result

加密/解密:

def encryptChar(self, n: int, e: int, M: int) -> int:
    C = self.__QuickMod(M, e, n)  # C = M^e mod n
    return C

def decryptChar(self, p: int, q: int, e: int, C: int) -> int:
    d = self.__inverse(e, (p - 1) * (q - 1))
    M = self.__QuickMod(C, d, p * q)  # M = C^d mod n
    return M

通过尝试加密号码109(ASCII中的“ m” char中的“ m” char ),Encryptchar函数返回6825028446539883496812231478444444444444444444444444444444444405196296664279。 通过试图解密decryrychar函数上方的数字应返回数字109返回。但这不是发生的事情。

在我的概念中,通过使用Python,我们没有数字大小限制。 我没有看到什么吗?感谢您的帮助。

I implemented a RSA Cryptography program, using python, and it works perfectly using prime numbers with aproximally 10 digits. But when I use numbers with 25 digits or more, for example, it does not work.

It worked with the following keys:

p = 2324731
q = 186647
e = 433899328297
n = 433904066957

It not worked with:

p = 3673864730662357928718503
q = 2127738717256957618781057
e = 7817024229395103552360986476332293342120062315901
n = 7817024229395103552360993847944520620136941797671

here's the code:

inverse (d key):

@classmethod
def __linearOperation(cls, a, b, mdc, i):

    t = -int(a / b)
    r = a % b

    mdc.append([1, a, t, b])

    if r == 1:
        return mdc

    inverseLine = cls.__linearOperation(b, r, mdc, i + 1)

    s = inverseLine[i][0]
    t = inverseLine[i][2]
    inverseLine[i - 1][0] *= t
    inverseLine[i - 1][2] *= t
    inverseLine[i - 1][2] += s

    inverseLine.remove(inverseLine[i])
    return inverseLine 

def __inverse(self, e, φ):
    
    inverseLine = self.__linearOperation(e, φ, [], 1)
    inverse = inverseLine[0][0]

    if inverse < 0:
        return inverse + φ
    if inverse > φ:
        return inverse % φ
    else:
        return inverse

Modular Exponentiation:

@staticmethod
def __QuickMod(base, exp, n):

    result = 1
    while exp > 0:
        if exp & 1:
            result = (result * base) % n
        
        base = (base ** 2) % n
        exp = exp >> 1

    return result

encrypt/decrypt:

def encryptChar(self, n: int, e: int, M: int) -> int:
    C = self.__QuickMod(M, e, n)  # C = M^e mod n
    return C

def decryptChar(self, p: int, q: int, e: int, C: int) -> int:
    d = self.__inverse(e, (p - 1) * (q - 1))
    M = self.__QuickMod(C, d, p * q)  # M = C^d mod n
    return M

By trying to encrypt the number 109 ("m" char in ascII), the encryptChar function returns 6825028446539883496812231478440519650519629664279.
By trying to decrypt the number above the decryptChar function should returns the number 109 back. But that's not what happens.

In my conception, by using python we do not have number size restriction.
Is there something i'm not seeing? Thank you for your help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

匿名的好友 2025-02-02 09:40:08

问题在于我的反算法中。我将尝试重新实现它。但是将POW()函数与-1用作展示作品。

The problem is in my inverse algorithm. I'll try to re-implement it. But using pow() function with -1 as expoent works.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文