我了解 RSA 密码系统的工作原理,但我不明白的是,在http://en.wikipedia.org/wiki/RSA_%28algorithm%29算法中,我们将加密消息发送给另一个人。通常我们将字符串写为消息。我想知道这个字符串是如何转换为数字的。我在互联网上到处都看到人们在所有示例中都将这条消息作为数字提到。但是我们通常不发送数字,我们发送字符串作为消息。我想知道这个字符串是如何转换成数字的。我的意思是我知道如何将字符串转换为数字,但在密码学视图中如何将此消息转换为数字?
3 回答
好的,所以这基本上是关于编码/解码的问题。
首先,正如您所写,消息通常在编程语言中表示为字符串。字符串由可以表示为文本的“代码点”组成。要创建以字节为单位的二进制表示,您需要对字符串进行字符编码,例如使用 UTF-8 编码。在某些语言中,“代码点”已经使用默认的内部编码(例如 C 中的 ASCII)。
您现在可以将字符串的二进制编码解释为整数。第一个字节是整数的最高(最重要)部分,最后一个是最不重要的部分。所以现在你得到了一些用于 RSA 操作的数字输入。不幸的是,这是不安全的,它无法处理大于密钥大小的消息。
因此,不是直接使用编码文本,而是使用安全加密哈希(例如 SHA-256)对文本进行哈希处理。SHA-256 输出一个 32 字节的散列。然后使用 PKCS#1 v1.5 中定义的安全填充方案填充此散列。其结果现在被转换为一个数字(见上文)并使用私有 RSA 密钥进行加密。
RSA 加密的输出又是一个数字。该数字再次转换为字节(与填充散列上使用的早期函数相反)。现在您已经获得了称为签名的二进制数据。最后,如果您想将其作为文本发送,则必须再次对其进行编码;通常使用 base 64 编码或十六进制。
要验证您是否执行相同操作,但顺序相反,并使用公钥而不是私钥。您需要比较哈希以检查验证是成功还是失败。
秘密消息不必总是字符串。但如果是这样,则可以将字符串的二进制编码分成块,其十进制表示可以使用 RSA 加密。
通常,非对称密钥密码术基于将数学函数应用于数字,因此不如基于排列和替换的对称密钥密码术快。
因此,它主要用于身份验证和数字签名,其中秘密消息不是字符串而是某个数字。
请参阅 Forouzan 的“密码学和网络安全”章节 - 非对称密钥密码学。
公钥密码学很慢,但允许我们在公共场合安全地交换少量信息。
密钥密码学很快,但必须首先私下共享密钥。
通常,人们会使用 RSA 加密密钥(如 AES 或 RC4 密钥)以允许我们公开发送该密钥,然后使用该密钥加密实际消息以利用密钥的速度加密。
RSA 也可用于对消息进行签名,但实际使用 RSA 签名的是实际数据的哈希(如 MD5、SHA-1、SHA-256)。
通常使用 Diffie-Hellman 代替 RSA 来交换密钥。
这个答案是否足够,或者您是否还需要知道密钥加密和散列如何查看数据?