例如,在RSA中,我们将其用于加密:$ ciphertext =(m ^ e \ mod n)$并用于解密。

如果我们的消息是"hello world",那么我们必须输入什么数字在RSA公式中是$ m $?

#1 楼

假设您要使用RSA加密“ Hello World”。

这里的第一件事是该文本的编码。这样的“ Hello World”无法加密,因为字符是非数字概念。
因此使用编码将文本的字符转换为数字值(例如ASCII / Unicode表,但还有很多其他方法,特别是对于非拉丁字符)。使用Unicode-8,“ Hello World”将转换为以下字节序列(十六进制符号):

48 65 6C 6C 6F 20 57 6F 72 6C 64


这样的字节序列可以被解释为数字通过分配最高有效字节和最低有效字节(例如,越左面,则越有效)。这样,该序列将等于数字

,但是由于这么小的数字将不会产生安全的密文(如@SEJPM已经说过),因此将使用填充。然后,字节序列可能看起来像这样:

0x48656C6C6F20576F726C64 or 87521618088882538408046480


然后将该序列解释为数字并推过算法。

评论


$ \ begingroup $
请注意,较旧的PKCS#1v1.5填充已损坏。确保使用较新的OAEP填充(如PKCS#1v2.0中所述)。
$ \ endgroup $
– CodesInChaos
16年7月20日在12:52

$ \ begingroup $
而且它不安全的原因是,即使e大,n大和c大,对m进行因式分解也相对容易/更快,对吗?
$ \ endgroup $
–stdout
19年7月7日在13:16

$ \ begingroup $
请注意,您所说的是“ Hello World!”一开始,然后转换“ Hello World”(不带!),这在检查数字时会引起混淆
$ \ endgroup $
–加布里埃尔·弗斯滕海姆(Gabriel Furstenheim)
20-04-29在18:27

$ \ begingroup $
@GabrielFurstenheim不错,我删除了!
$ \ endgroup $
– marstato
20年4月30日在6:27

#2 楼


…在RSA公式中,我们必须把$ m $作为什么数字?


$ m $可能有三种可能性。


完整大小的随机位序列,例如随机排序的密钥,大约与模数一样大,将用于派生用于消息加密的对称密钥。
一些填充消息。这意味着您首先要对邮件应用一些填充,例如OAEP,然后将RSA原语应用到它。在这种情况下,消息实际上是您要发送的任何长字符串。可以是一些二进制计算数据,也可以是ASCII编码的q4312079q终止的字符串,无论您需要什么。
(不建议)一些未填充的消息。这将跳过填充阶段,并将RSA原语直接应用于您的消息。这是非常危险的操作,不应在生产环境中进行,因为真正的基本攻击可以恢复纯文本。



#3 楼

ASCII是将字母编码为整数的一种方法,而整数则以二进制或十六进制表示。但是,当然还有许多其他方法可以将字母编码为数字,而确切的操作完全取决于您自己。

例如,您只有从A到Z的字母并得到了字符串$ s = s_0s_1s_2s_3 .... s_n $。然后,根据它们的无序顺序,将所有$ s_i $视为$ \ {0,1,2,3,...,25 \} $中的数值。然后,您对一条消息进行编码,如下所示:

$$ x = s_0 + 26 \ cdot s_1 + 26 ^ 2 \ cdot s_2 + ... + 26 ^ {n} \ cdot s_n $$

基本上,您只是将一条消息视为以26为底的数字,该数字可以用任何其他数字系统表示,而与字母中符号的数量无关。二进制数无非是基数2中表示的数字,所以我们写$ 01011 $,$ ABABB $甚至$ \ oplus \ otimes \ oplus \ otimes \ otimes $都没关系。

类似地,如果您将实际消息嵌入某些特殊格式,例如通过将固定的首尾连接到消息,不会改变任何内容。只要为每个消息分配了唯一的编号,任何类型的编码都可以使用。

如果考虑任意长度的字符串,则还需要使用任意的大整数进行编码。但是,RSA仅允许小于$ N $的消息,这限制了返回字符串的长度。在这种情况下,通常使用混合加密:您不对消息本身进行加密,而是对对称密码的随机密钥进行加密,然后对对称密码和RSA密文中的随机密钥使用一种操作模式。

评论


$ \ begingroup $
您对$ x $的编码是little-endian,在以26为基数的情况下我从未见过。
$ \ endgroup $
–fgrieu♦
16年7月21日在5:32

$ \ begingroup $
@fgrieu我承认,该示例不是标准示例,因为我是即时编写的。但是,只要清楚如何完成索引,倒数索引的变化就不会很大。
$ \ endgroup $
– tylo
16年7月21日在8:30

#4 楼

每条信息都可以编码为数字。对于消息,首先对每个字符进行编码,例如ord("h") = 104ord("e") = 101ord("l") = 108等。通常,有大量可用编码,例如latin-1。现在您有了一个字节序列,这是计算机无论如何存储字符串的方式。

计算结果数,例如使用以下重复发生x = 256*x + nextByte。从0开始并获取


256 * 104 + 101 = 26725

这行得通,但是对于RSA来说,数字很快就变得不可用了。实际上,您会为对称密码(例如AES)生成一个密钥,并使用RSA对该密钥进行加密。

评论


$ \ begingroup $
在https中使用AES吗?还是整个SSL的RSA?
$ \ endgroup $
–特德
2012年8月24日5:27

$ \ begingroup $
HTTPS使用一种对称密码,该密码要经过各方之间的协商。一切都很复杂,但是可以肯定的是,在整个通信过程中都不会使用RSA,因为这样做效率极低。
$ \ endgroup $
– maaartinus
2012年8月24日在12:01

$ \ begingroup $
对于大多数SSL传输模式(包括HTTPS),颁发给服务器的安全证书具有公共RSA密钥。该密钥用于加密并向证书持有者发送您自己的RSA公钥,从而建立双向通信通道,通过该通道可以在客户端和服务器之间协商要使用的实际加密方案(通常是对称密钥)。一旦达成协议,一方就通过RSA将密钥,IV和其他机密传输给另一方,并且所有进一步的通信都通过对称密钥加密通道进行。
$ \ endgroup $
– KeithS
2012年9月5日在3:53



$ \ begingroup $
不,所描述的直接方法对于短明文来说并不安全。特别是,任何人都可以验证对纯文本的猜测;并向多个收件人发送相同的明文是不安全的。参见例如对RSA密码系统的二十年攻击。
$ \ endgroup $
–fgrieu♦
2012年9月13日在16:51



$ \ begingroup $
@maaartinus:我所知道的任何安全密码应用程序都不会使用文本到您描述的数字的数学映射(这是不安全的,并且会限制RSA中的容量,并且在混合加密中是不需要的);并且您描述的用于实现该映射的算法(对于$ n $个字符的消息,执行x = 256 * x + nextByte $ n $次)的成本为$ O(n ^ 2)$, ,在Little-endian机器上反转字节顺序)的成本为$ O(n)$(或在使用重键入时在Big-endian机器上为O(1))。这使答案中的建议倍加误导。
$ \ endgroup $
–fgrieu♦
2012-10-28 12:42



#5 楼

介绍性演讲经常掩盖这一点,因为没有必要了解基本原理。但是实际标准对此进行了精确定义。
对于RSA,定义文档为PKCS#1,其多个版本已发布为RFC。在PKCS#1 v2.2中,§4使用函数I2OSP和OS2IP在§4中指定了八位字节字符串¹和整数之间的转换。

如果文本用表示,则"hello"中的字符具有ASCII值。 ASCII编码。像大多数密码标准一样,RSA并不关心文本编码,它可以处理(8位)字节。因此,它没有看到"hello",而是(假设您以ASCII编码存储了字符串)由5个字节的序列组成,该序列由值分别为104、101、108、108和111的字节组成。字符串和整数中的数字是串联的,但以256为基数的数字。这有两种“明显”的方法,具体取决于数字的放置顺序。 RSA以big-endian格式组装数字,即字符串的第一个字节对应于最高有效数字,依此类推。

请注意,$ m \ mapsto m ^ e \ bmod n $是$ m RSA加密原语(在PKCS#1 v2中称为RSAEP)。此原语对于实际的加密并不安全,因为它暴露了许多数学关系(例如$(m_1m_2)^ e = m_1 ^ e m_2 ^ e $)。实际的RSA加密算法是PKCS#1称为RSAES-OAEP-Encrypt,而由一对相应的加密和解密功能组成的方案称为OAEP。 OAEP旨在确保RSA-OAEP方案中使用的数字之间永远不会发生那些数学关系。

¹“八位字节”表示8位字节,而不是某些罕见平台上的不同字节大小。这个词主要用于网络和密码标准。

#6 楼

我不是这方面的专家,据我了解,有多种使用RSA的方法。但我知道可以回答您问题的一种方式。

爱丽丝想向鲍勃发送消息。她要做的第一件事是选择一个“好的”密码,比如说分组密码AES。她为此一条消息生成一个任意密钥。该密钥的长度可能为256位。因此,密钥是256个1和0的字符串。如果将每个8位转换为一个字节,则将获得长度为32个字节的密钥。现在,该密钥可以再次写为一长串的一和零。

(作为一个具体示例。如果密钥为16位长,例如1001011010001101,则与38541相同)。

将此数字(密钥)作为问题中的$ m $,并使用RSA使用Bob的公共密钥对密钥进行加密。

然后爱丽丝发送已使用AES加密的消息和已加密的消息。鲍勃的钥匙。因此,发送的密文实际上是由一个加密的(使用AES)消息和一个加密的(使用RSA)密钥组成的。使用AES的消息。

评论


$ \ begingroup $
实际上,您不将对称密钥用作m。您添加专门的填充。
$ \ endgroup $
– CodesInChaos
2012年8月24日17:27



$ \ begingroup $
@CodesInChaos:谢谢!我不知道我将对此进行研究并更新答案或删除答案。
$ \ endgroup $
–托马斯
2012年8月24日在20:31

$ \ begingroup $
描述的方法有缺陷。参见例如二十年来对RSA密码系统的攻击
$ \ endgroup $
–fgrieu♦
2012年9月13日下午16:46