密码学中的 RSA 非对称加密

LinuxBeginner
立即练习

介绍

在这个实验中,你将探索非对称加密(asymmetric encryption)的原理,这是现代密码学(cryptography)的基石。与使用单一密钥进行加密和解密的对称加密(symmetric encryption)不同,非对称加密使用一对密钥:公钥(public key)和私钥(private key)。

公钥用于加密,可以与任何人共享。私钥需要保密,用于解密。这种机制允许在无需事先共享密钥的情况下进行安全通信。

我们将使用广泛采用的 RSA 算法和强大的 openssl 命令行工具来演示此过程。你将学习如何生成密钥对、使用公钥加密消息,以及使用私钥解密消息。所有操作都将在 ~/project 目录下的终端中进行。

非对称加密基础

在这一步中,你将学习非对称加密(asymmetric encryption),也称为公钥密码学(public-key cryptography)的核心概念。这是一个概念性的步骤,无需执行任何命令,但理解这些原理对于后续的实践任务至关重要。

非对称加密依赖于两个不同但数学上相关联的密钥:

  • **公钥 (Public Key)**:此密钥可供所有人使用。它的主要功能是加密数据。任何拥有公钥的人都可以加密消息,但他们不能用它来解密同一条消息。可以将其视为一个开放的邮箱投递口:任何人都可以将信件投入其中。

  • **私钥 (Private Key)**:此密钥必须由其所有者保密和安全保管。它的功能是解密使用其对应公钥加密的数据。只有持有私钥的人才能解密消息。在我们的邮箱比喻中,私钥是唯一可以打开邮箱并取出信件的钥匙。

这种单向关系是安全网络上传输安全通信的基础。在接下来的步骤中,你将生成自己的公钥/私钥对,并使用它们来加密和解密消息。

生成 RSA 密钥对

在这一步中,你将使用 openssl 命令行工具生成一个 RSA 密钥对。此命令将创建一个包含私钥和公钥组件的单个文件。

在你的终端中执行以下命令。本实验中的所有命令都应从默认的 ~/project 目录运行。

openssl genrsa -out private.pem 2048

我们来分解一下这个命令:

  • openssl: 调用 OpenSSL 工具包的命令。
  • genrsa: 用于生成 RSA 私钥的特定命令。
  • -out private.pem: 此标志指定密钥的输出文件名。我们将其命名为 private.pem
  • 2048: 这是密钥的长度(以位为单位)。2048 位是 RSA 密钥的标准安全长度。

现在,使用 ls 命令验证文件 private.pem 是否已在你的当前目录中创建。

ls

你应该在输出中看到 private.pem 被列出。

private.pem

提取公钥

在这一步中,你将从创建的 private.pem 文件中提取公钥。虽然私钥文件包含了所有必需的组件,但你需要一个单独的公钥文件,可以安全地与他人共享,用于加密消息。

使用以下命令提取公钥:

openssl rsa -in private.pem -pubout -out public.pem

以下是该命令的分解说明:

  • openssl rsa: 此命令用于处理 RSA 密钥。
  • -in private.pem: 指定输入文件,即我们的私钥。
  • -pubout: 此标志指示 openssl 提取并输出密钥的公有部分。
  • -out public.pem: 指定公钥的输出文件名。

该命令将产生简短的输出,确认操作。

writing RSA key

现在,再次列出目录中的文件,查看私钥和公钥。

ls

你现在应该看到 private.pempublic.pem

private.pem  public.pem

你可以查看公钥文件的内容。它是一个 PEM 格式的文本文件。

cat public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
...
-----END PUBLIC KEY-----

使用公钥加密消息

在这一步中,你将创建一个秘密消息,然后使用刚刚提取的公钥对其进行加密。只有拥有相应私钥的人才能解密它。

首先,我们创建一个包含秘密消息的简单文本文件。

echo "This is a secret message." > message.txt

此命令创建一个名为 message.txt 的文件,其中包含指定的内容。现在,我们使用公钥加密此文件。

openssl pkeyutl -encrypt -pubin -inkey public.pem -in message.txt -out encrypted.bin

我们来检查一下这个命令:

  • openssl pkeyutl: 用于执行加密和解密等公钥操作的工具。
  • -encrypt: 指定我们想要执行加密操作。
  • -pubin: 表示输入密钥 (-inkey) 是一个公钥。
  • -inkey public.pem: 指定用于加密的公钥。
  • -in message.txt: 包含明文消息的输入文件。
  • -out encrypted.bin: 存储加密数据(密文)的输出文件。

运行命令后,将创建一个新文件 encrypted.bin。如果你尝试查看其内容,你会看到不可读的二进制数据,这是消息的加密形式。

cat encrypted.bin

输出将是一串乱码字符,确认消息已加密。

使用私钥解密消息

在最后一步中,你将使用私钥解密加密的消息,以恢复原始明文。这证明只有私钥的持有者才能访问秘密信息。

使用以下命令解密 encrypted.bin

openssl pkeyutl -decrypt -inkey private.pem -in encrypted.bin -out decrypted.txt

我们来回顾一下命令选项:

  • openssl pkeyutl: 与之前相同的工具。
  • -decrypt: 这次,我们指定解密操作。
  • -inkey private.pem: 指定用于解密的私钥。
  • -in encrypted.bin: 包含加密密文的输入文件。
  • -out decrypted.txt: 用于保存恢复的明文的输出文件。

此命令将创建一个名为 decrypted.txt 的新文件。为验证解密是否成功,显示此新文件的内容。

cat decrypted.txt

你应该能看到你的原始消息被完美恢复。

This is a secret message.

恭喜!你已成功使用 RSA 和 OpenSSL 完成了一次完整的不对称加密和解密循环。

总结

在这个实验中,你获得了使用 RSA 算法和 OpenSSL 工具包进行非对称加密的实践经验。

你了解了公钥和私钥之间的基本区别,以及它们在保护通信中的各自作用。

具体来说,你练习了以下关键技能:

  • 使用 openssl genrsa 生成一个 2048 位的 RSA 密钥对。
  • 使用 openssl rsa 从私钥文件中提取公钥。
  • 使用 openssl pkeyutl 使用公钥加密明文消息。
  • 使用 openssl pkeyutl 使用相应的私钥解密生成的密文。

这些技能对于理解和实现各种应用中的安全系统至关重要,从安全网页浏览 (HTTPS) 到加密电子邮件和数字签名。