我正在做一个我必须实现NTRUEncrypt公钥密码系统的项目。这是根据他们加密指南的第一步 - “爱丽丝,想要向Bob发送一个秘密消息,将她的消息以多项式m的形式放入系数{-1,0,1}”。我想知道如何将我的信息变成多项式。谢谢。
答案 0 :(得分:6)
你可以随心所欲地去做。也许最直接的方法是将您的消息转换为三元表示
"Hello" -> 72, 101, 108, 108, 111 -> 02200, 10202, 11000, 11000, 11010
所以我将字符转换为ASCII表示,然后将这些表示转换为三元表示(假设我只限于7位ASCII空间,我只需要五个三进制数字)。
然后通过将三进制数字{-1, 0, 1}
映射到0
,将三进制数字0
映射到1
,将三元表示转换为1
上的多项式三元数2
到-1
并假设对应于3 ^ k的数字是x ^ k 1 的系数:
02200 -> p1(x) = 0 + 0 * x + (-1) * x^2 + (-1) * x^3 + 0 * x^4
10202 -> p2(x) = (-1) + 0 * x + (-1) * x^2 + 0 * x^3 + 1 * x^4
11000 -> p3(x) = 0 + 0 * x + 0 * x^2 + 1 * x^3 + 1 * x^4
11000 -> p4(x) = 0 + 0 * x + 0 * x^2 + 1 * x^3 + 1 * x^4
11010 -> p5(x) = 0 + 1 * x + 0 * x^2 + 1 * x^3 + 1 * x^4
然后我的消息是
p1(x) + x^5 * p2(x) + (x^5)^2 * p3(x) + (x^5)^3 * p4(x) + (x^5)^4 * p5(x)
这样我的多项式系数
(0, 0, -1, -1, 0, -1, 0, -1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1).
无论你如何做,重点是你可以将你的信息表示为多项式,无论你喜欢什么。您最好找到从消息空间到{-1, 0, 1}
上的多项式空间的双射,该空间很容易计算并且具有容易计算的逆。
1 这是转型的关键。五位三位数a
4
a
3
a
{{ 1}} 2
a
1
a
完全对应于评估多项式{{1 }} 0
a
4
* x^4 + a
3
{{ 1}} {sub> * x^3 + a
2
* x^2 +a
1
* x + a
。因此0
上的多项式与三元数之间存在明显的一对一关系。
答案 1 :(得分:3)
我为NTRU工作,所以我很高兴看到这种兴趣。
IEEE标准1363.1-2008规定了如何使用最新的参数集实现NTRUEncrypt。它为二元 - >三元转换指定的方法是:
将每个三位数转换为两位 三元系数如下,和 连接产生的三元组 数量来获得[输出]。
{0, 0, 0} -> {0, 0}
{0, 0, 1} -> {0, 1}
{0, 1, 0} -> {0, -1}
{0, 1, 1} -> {1, 0}
{1, 0, 0} -> {1, 1}
{1, 0, 1} -> {1, -1}
{1, 1, 0} -> {-1, 0}
{1, 1, 1} -> {-1, 1}
转换回来:
转换每组两个三元组 系数为三位如下, 并连接结果位 获得[输出]的数量:
{0, 0} -> {0, 0, 0}
{0, 1} -> {0, 0, 1}
{0, -1} -> {0, 1, 0}
{1, 0} -> {0, 1, 1}
{1, 1} -> {1, 0, 0}
{1, -1} -> {1, 0, 1}
{-1, 0} -> {1, 1, 0}
{-1, 1} -> {1, 1, 1}
{-1, -1} -> set "fail" to 1 and set bit string to {1, 1, 1}
请注意,要安全地加密邮件,您不能简单地将邮件转换为trinary并应用原始NTRU加密。消息需要在加密前进行预处理,并在加密后进行后处理,以防止可能修改传输中的消息的主动攻击者。必要的处理在IEEE Std 1363.1-2008中规定,并在2003年的论文“NAEP:存在解密失败时的可证明安全性”中讨论(可从http://www.ntru.com/cryptolab/articles.htm#2003_3获得,但请注意,此描述针对的是二进制多项式而不是三元组。)
希望这有帮助。
@Bert:我们在不同时间推荐过二进制或三元多项式。三元多项式允许使用较短的密钥具有相同的安全性。然而,在过去我们认为二进制多项式允许q(大模数)为256.这对8位处理器很有吸引力。我们已经确定采用q = 256会降低安全性(特别是,它使得解密失败的可能性太大)。由于我们不再将小q作为目标,我们可以利用三元多项式来提供更小的密钥。