介绍
在这个实验中,你将探索非对称加密(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.pem 和 public.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) 到加密电子邮件和数字签名。



