使用 C = M^e mod n 使用 RSA 加密一串字母

Encrypt a string of letters with RSA using C = M^e mod n

你好 :) 我用谷歌搜索了解这个问题的含义:用参数 p = 13,q = 19,e = 5 加密单词“SECURITY”。十六进制形式的相应密文是什么?

我在每个字母对应的 ASCII 值上使用了 cipher = M^e mod (pq)。所以对于S,我写:85^5 mod 247 = 239。然后我继续将239转换为十六进制形式:“EF”。

这是正确的做法吗?一个字母一个字母地做,然后最后把所有的十六进制加在一起得到字符串“EFB388CE3E639121”?

或者我应该将每个字母的密码加在一起,然后将其转换为十六进制形式?

C(S) = 239, C(E) = 179, C(C) = 136 C(U) = 206 
C(R) = 62,  C(I) = 99,  C(T) = 145, C(Y) = 33



Add them together: 239+179+136 .. = 1099.
Convert 1099 to hexadecimal = 44B. 

在我看来,将它们加在一起似乎没有意义,因为几个字母可以构成总值 1099,这会使解密变得困难,但我只是想确定一下:)

RSA 假定您的整个消息是一个整数 M,那么,就像您说的那样:

C = M^e mod N
M = C^d mod N

其中 N = pq。这假设 M < N.

如果您将消息 SECURITY 编码为十六进制并将该十六进制字符串视为数字,您将得到:

'SECURITY' -> 5345435552495459 -> 6000276112272872537

不幸的是,这个数字太大,无法用 N=247 加密。 我的意思是,当然,您可以通过公式传递它来“加密”它,但是您将无法恢复原始消息。

作业的作者可能意味着您单独加密每个字母,然后连接十六进制输出(就像您所做的那样),但这对 RSA 的使用真的很奇怪,使作业非常具有误导性。

是的,您实际上可以通过这种方式使用 RSA 进行加密,但请注意生成的密文是可延展的(可以通过 数字签名 明文或密文消息来修复)。它类似于执行例如ECB 模式下的 AES。通常 RSA 加密——如 PKCS#1 标准中指定的那样——是随机的,但你的不是,所以 ECB 模式的相同问题仍然存在:相同的字母将被加密为相同的值,这将使其不安全并且容易受到频率分析.这当然是 除了 RSA 密钥大小的明显问题; RSA 需要 输入消息的特定填充是安全的。

请注意,您需要区分字母的密文。这意味着您应该始终使用相同数量的字节/十六进制来编码表示密文的数字。 这意味着前导零 应该保留 。同样,这也发生在 PKCS#1 标准中(查找 I2OSP,它将整数转换为字节)。

请注意,在现实生活中,我们使用 混合密码系统,我们在其中加密随机对称密钥而不是消息本身,然后使用该随机密钥继续加密消息。然后将包装好的密钥和密文一起发送给收件人。

您必须先将每个字母转换为 ASCII 形式,这意味着:

M(S) = 83, M(E) = 69, M(C) = 67, M(U) = 85, M(R) = 82, M(I) = 73, M(T) = 84, M(Y) = 89.

然后您可以将各个数字放在一起以获取消息:

M = 8369678582738489.

THEN你可以找到你的密文,然后你才能找到相应的十六进制形式的数字。