0

所以我决定学习 Sage 编程,因为它可以处理非常大的数字,这对于 RSA 加密/解密很有用。

(1) 我在关注一个例子,但我不太确定他们是如何在 ZZ() 函数中得到 100 的。

(2) 还有一个问题是有没有办法使用 sage 函数从整数到纯文本?

sage: m = "HELLOWORLD"
sage: m = map(ord, m); m
[72, 69, 76, 76, 79, 87, 79, 82, 76, 68]
sage: m = ZZ(list(reversed(m)), 100) ; m           <------ this line
72697676798779827668


sage: m = 72697676798779827668
sage: c = 630913632577520058415521090
sage: d = 4460824882019967172592779313
sage: n = 4951760154835678088235319297
sage: power_mod(c, d, n)
72697676798779827668                <--- how do i convert this number back to plain text
sage: power_mod(c, d, n) == m
True
4

1 回答 1

2

100 告诉您将列表中的每个元素乘以多少,以幂为单位。将其视为“基数 100”。

sage: ZZ([1,2,3],100)
30201
sage: ZZ([1,2,3],2)
17
sage: ZZ([1,2,3],10) # 1*10^0+2*10^1+3*10^2
321

这个问题有无数种方法可以从ord. 然后我们使用chr.

sage: a = 72697676798779827668
sage: ''.join([chr(int(str(a)[i:i+2])) for i in range(0, len(str(a)), 2)])
'HELLOWORLD'

我同意这在可读性方面并不理想。实际上,Sage 在其加密模块中还有一些其他内置方法可以在教学基础上进行加密。这也有一些内置的字母表。(我认为这不是您当前正在创建的工业级 RSA 版本。)

于 2012-10-03T12:46:21.227 回答