python - 使用扩展欧几里德算法创建 RSA 私钥

标签 python algorithm encryption rsa modular-arithmetic

这是我在学校做的作业。我在生成私钥时遇到问题。我的主要问题是理解我的方程式之间的关系。为了设置一切,我们有:

p = 61
q = 53
n = p * q (which equals 3233)

从这里我们得到 n (phi(n)) 等于 3120 的总和,现在我们可以选择素数 e;其中 1 < e < 3120

e = 17

好吧,很简单。

对于我的作业,我们已经知道 d = 2753,但是我仍然需要能够任意生成这个值。

现在这是我遇到麻烦的地方。我一直在仔细阅读维基百科以了解某些地方没有连接。我知道我需要找到 modular multiplicative inverse e (mod phi(n))d,我们的私有(private)指数。

虽然维基百科告诉我们要找到我们需要使用 Extended Euclidian Algorithm 的 mmi .我在 python 中实现了如下算法:

def egcd(a, b):
    x, lastX = 0, 1
    y, lastY = 1, 0
    while (b != 0):
        q = a // b
        a, b = b, a % b
        x, lastX = lastX - q * x, x
        y, lastY = lastY - q * y, y
    return (lastX, lastY)

这就是我迷路的地方。据我现在的理解,方程 ax + bx = gcd(a, b) = 1 是相同的 e*x + phi(n)*y = gcd(e, phi(n )) = 1。 所以我们调用 egcd(e, phi(n)),现在我的 x 和 y 得到了 [-367, 2]

老实说,从这里我不知道该去哪里。我读过 this similar question我看到发生了一些替换,但我不明白这些数字与我得到的答案或我开始时的值(value)观有何关系。有人可以务实地向我解释我需要从这里做什么吗? (当我实用地说时,我的意思是没有实际代码。伪代码很好,但如果我得到实际代码,我将无法在没有抄袭的情况下学习我的作业,这是一个很大的禁忌)。

一如既往,我们真诚地感谢您的帮助。谢谢大家!

(是的,我看过这些:RSA: Private key calculation with Extended Euclidean AlgorithmIn RSA encryption, how do I find d, given p, q, e and c?)

最佳答案

您拥有的扩展欧几里得算法的实现并不完整,因为它为私钥生成负数。请改用此代码:

https://en.wikibooks.org/wiki/Algorithm_Implementation/Mathematics/Extended_Euclidean_algorithm

对于您的示例,私钥 d 是 2753。

p=61
q=53
n = 3233
phi(n)=3120
e=17
d=modinv(17,3120)=2753

尝试一下:

message m m=65


encryption: m^e mod n = c    (65**17) % 3120 =  65
decryption: c^d mod n = m      (65**2753) % 3120 =   65

一切都在这里解释:

http://southernpacificreview.com/2014/01/06/rsa-key-generation-example/

关于python - 使用扩展欧几里德算法创建 RSA 私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18940194/

相关文章:

algorithm - 树 : Performance comparison between stack implementation and recursive call of Traversal in BST

java - 使用 JASYPT + Hibernate + Spring 进行字符串加密

java - 在 Ruby 中加密并在 Java 中解密 - 为什么它不起作用?

ssl - 如何使用 Lets Encrypt 为子域添加证书

python - 这段代码如何交换两个数字?

c++ - 查找数字是否为2的幂的时间复杂度

python - 在浏览器中将 PUT 上传到 S3 时忽略内容类型?

邻接矩阵中的 Java DFS 回溯

python - 在 Matplotlib 中使用 '%' 作为绘图标签的问题

python - 我怎样才能使用 SQLAlchemy 做 "mysql explain"