Javascript 的 RSA 简单示例?

RSA Simple example with Javascript?

我知道这可能有点基础,但我下周要考试,我想测试我对 RSA 的了解。

我有一个非常简单的问题,我正在研究 RSA 的机制,我想测试我是否可以在我的浏览器控制台中加密和解密消息。

RSA 变量是:

var p = 11 //the first prime number
var q = 5 //the second prime number
var m=72 // the message
var n=55 // the RSA modulus, n = p*q
var e=7 // so (e,n) are the public key
var d=23 //so (d,n) are the private key
var fi_of_n=40 //the totient, fi_of_n = (p-1)*(q-1) = 40

要加密,我在做:

var c = Math.pow(m,e)%n // m^e mod(n); c=8

我得到 c 等于 8

那我要解密,使用d如下:

var m2 = Math.pow(c,d)%n // c^d mod(n)

但是结果是17!不是我预期的 72。我不知道我做错了什么,我认为这是一个非常简单的例子。

我的public和私钥的值就是这个视频中得到的:https://www.youtube.com/watch?v=kYasb426Yjk

RSA 有一个限制,即只能加密严格小于 modulus 的消息。你的72的消息对于你的modulus 55来说太大了。你可以看到加密和解密基本有效,因为17 = 72(mod 55)。

在JavaScript中所有数字都是浮点数。有一个可以安全地表示为整数的最大数目:Number.MAX_SAFE_INTEGER = 9007199254740991。如果幂运算的结果超过这个值,浮点运算的性质不能保证你得到正确的值。在加密和解密过程中,这种中断可能会发生两次。

我们以m = 5为例。 pow(5, 7) = 78125 小于 9007199254740991。这里没有截止点。现在,使用 c = 25 我们得到 Math.pow(25, 23) = 1.4210854715202004e+32,它远大于安全整数。当我们现在应用 modulo 运算符时,它不会给出正确的结果,因为浮点分辨率不再是 1。

消息 8 例如产生一个足够小的 pow(m,e) 值,该值小于此最大安全整数值 并且 结果密文也产生一个pow(c,d) 值足够小,不会被截断。

您应该使用大数(多精度)库来执行这些操作,或者使用 Python,只要您有足够的内存,它就可以表示任何整数。如果你想在 JavaScript 中继续这样做,还有 jsbn 除了一个大数字库之外还实现了 RSA。

由于@Artjom B. 和@rakeb.void.

的评论,我找到了解决方案来回答我自己的问题

由于 Javascript 和 Number.MAX_SAFE_INTEGER 的局限性,无法使用提供的变量进行测试。

一种解决方案是使用多精度库,另一种是与Python一起进行相同的测试。

我选择了 Python,因为我不想学习如何使用多精度库来进行测试。我制作的程序如下:

import math
p = 11
q = 5
m = 39
n = 55
e = 7
d = 23
fi_of_n = 40

print ("original: "+str(m))

cipher= pow(m,e)%n
print("cipher: "+str(cipher))

m2 = pow (cipher,d)%n
print("decrypted: "+str(m2))


print("----")
print("Are they equal? " + str(m == m2))

只要消息小于模运算符 n,它就有效。