本文介绍了混合加密的概念,重点讲解了使用公钥密码术和对称密钥的Box加密方法。同时,文章还提到了PGP(Pretty Good Privacy)加密软件,回顾了其历史和基本工作原理,并展示了如何在实践中使用PGP加密和解密邮件信息。最后,通过Zig语言实现的Box包示例,进一步阐释了混合加密在实际应用中的过程。

Box 加密方法非常漂亮,它利用了公钥密码学和对称密钥的力量。有了它,Bob 使用 Alice 的公钥向她发送一条加密消息,然后她使用她的私钥解密它。然后,Bob 可以使用他的私钥对消息进行签名,并且 Alice 可以使用他的公钥证明这是 Bob 发送的。 基本上,它使用混合加密,对称密钥对消息进行加密,然后使用 Alice 的公钥对其进行加密。 然后她用她的私钥解密这个,并且可以解密密文:

在实践中,例如使用 Nacl Box [ 这里],我们可以使用 X25519 进行密钥交换,Ed25519 进行数字签名,XSalsa20/Poly1305 进行对称密钥加密。
1991 年 6 月,Philip Zimmermann 创建了 PGP 的第一个版本 (v1.0) [ 这里]:

在 GDPR 时代,Phil 能够清楚地看到未来:
PGP 使人们能够将他们的隐私掌握在自己手中。人们对它的社会需求日益增长。这就是我编写它的原因。
Phil Zimmerman 是第一批用他的 PGP 软件对抗国防机构的人之一,该软件于 1991 年发布,允许用户发送加密和经过身份验证的电子邮件。因此,美国海关总署对违反《武器出口管制法》的行为提起了刑事调查,其中加密软件被视为军需品。 最终,指控被撤销。
为什么社区不推动更好的标准呢? 难道是因为现状对于许多公司来说是一个舒适的地方,他们可以窥探员工的电子邮件吗?
Hal Finney(可悲的是已经去世)也是 Phil Zimmerman 之后 PGP 公司的第二位受聘开发人员,他曾说过他喜欢这项技术,因为它保护了个人隐私权。 他一直待在那里直到 2011 年退休。

Hal 完全被密码学的魔力所吸引,他的网页宣布:
这些天,我的大部分空闲时间和精力都投入到我的密码学活动中。 过去,我曾积极参与 Cypherpunks 邮件列表。 Cypherpunks Archives 似乎经常以可疑的速度倒闭; 我想那里有太多“先烧后读”的东西。
对于 PGP:
我是 PGP 2.0 版本的原始程序员之一,直接与该程序的作者 Philip Zimmermann 合作。 今天,我在 Network Associates 工作,为 PGP 的商业版本开发加密库。
2007 年,它朝着 RFC 4880 成为标准迈出了一步 [这里]——请注意 Hal Finney 的名字在作者列表中:
按回车键或单击以全尺寸查看图像

使用 PGP,我们不使用公钥加密来加密数据; 为此,对称密钥效率更高。 为此,Bob 获取消息的哈希值,然后使用他的私钥对其进行签名。 接下来,他获取消息和签名,然后创建一个新的对称密钥 (K)。 然后使用它来加密数据和签名。 接下来,他获取 Alice 的公钥并加密 K。然后,可以将此加密密钥添加到加密消息中:
按回车键或单击以全尺寸查看图像

要解密,Alice 获取加密密钥并使用她的私钥对其进行解密。 然后她可以解密消息并显示签名。 她现在可以阅读信息了。 为了检查是否是 Bob 发送的消息,她使用 Bob 的公钥检查消息的签名,如果签名检查通过,她就知道是 Bob 发送的消息,并且该消息没有被更改:

因此,让我们发送一条 “So did NSA put a backdoor?” 的消息,我们将使用密码 “qwerty” 和 256 位 AES。 使用 PGP,我们可以编码为 armor 文件格式,并且可以轻松地集成到电子邮件消息中:

要生成密钥对,我们使用:
> gpg --keygen
然后我们可以使用 GPG 为电子邮件生成密码消息。 首先,我们创建消息:
> type 1.txt
So did NSA put a backdoor?
接下来,我们创建一个包含加密消息的 amour 文件:
> gpg -c -a 1.txt
然后我们可以列出加密文件:
> type 1.txt.asc
-----BEGIN PGP MESSAGE-----
Version: GnuPG v2jA0EBwMCz1yj3ME13Nae0lQBp7yb3F1PpsC6J0Qe/3UXsh0P4HIxKzslPdXROGrh
VtpKmtVUiLhEFFpHzdgEaFwCLBM/EP86dN7YVJBztoP/trM+Ib5j4buNv+EdGCra
X5YPeJc=
=BAb2
-----END PGP MESSAGE-----
这是粘贴到电子邮件中的消息。 最后,我们使用给定的密码解密:
> pgp -d 1.txt.asc
So did NSA put a backdoor?
Box 包的工作方式与 PGP 电子邮件类似,Bob 生成一个对称密钥并使用 XSala20 加密方法来加密消息。 然后 Bob 获取此消息的哈希值,并使用他的私钥对其进行加密,并将其包含在加密消息中。 然后 Bob 使用 Alice 的公钥加密 XSala20 密钥。 然后他将加密的消息发送给她,她将使用她的私钥解密用于加密消息的密钥。 然后她可以阅读消息。 现在查看检查签名。 为此,她获取 Bob 的公钥,然后解密哈希值。 如果她可以解密它,她会将哈希值与她获得的哈希值进行比较,如果它们相同,她就知道是 Bob 发送的消息,并且该消息没有更改:

Zig Box 包支持使用 Curve25519、XSalsa20 和 Poly1305 加密和验证短消息。 在这种情况下,我们为 Bob 和 Alice 生成一个公钥和私钥。 公钥显示为公钥点的 x 坐标。
以下代码是使用 Zig Version 0.15.1 编译的 [ 这里]。 使用 ZIg,我们可以使用 Box [ 这里]:
const std = @import("std");
const nacl = @import("std").crypto.nacl;
const crypto = @import("std").crypto;
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
var stdout_buffer: [4096]u8 = undefined;
var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
const stdout = &stdout_writer.interface;
// Get the command-line arguments // 获取命令行参数
var message: []const u8 = undefined;
const args = try std.process.argsAlloc(std.heap.page_allocator);
defer std.process.argsFree(std.heap.page_allocator, args);
// Check if there are any arguments // 检查是否有任何参数
if (args.len > 1) {
message = args[1];
}\
const BobKeyPair = nacl.Box.KeyPair.generate();
const AliceKeyPair = nacl.Box.KeyPair.generate();
var salt: [24]u8 = undefined;
crypto.random.bytes(&salt);
const ciphertext_size = message.len + @as(usize, nacl.Box.tag_length);
const ciphertext = try allocator.alloc(u8, ciphertext_size);
defer allocator.free(ciphertext);
const plaintext = try allocator.alloc(u8, message.len);
defer allocator.free(plaintext);
try nacl.Box.seal(ciphertext, message, salt, BobKeyPair.public_key, AliceKeyPair.secret_key);
try nacl.Box.open(plaintext, ciphertext, salt, AliceKeyPair.public_key, BobKeyPair.secret_key);
try stdout.print("== Box encryption Message: {s} \n", .{message});
try stdout.print("== Box encryption Salt: {x} \n", .{salt});
try stdout.print("\nBob Secret Key: {x} \n", .{BobKeyPair.secret_key});
try stdout.print("Bob Public Key: {x}\n", .{BobKeyPair.public_key});
try stdout.print("\nAlice Secret Key: {x} \n", .{AliceKeyPair.secret_key});
try stdout.print("Alice Public Key: {x}\n", .{AliceKeyPair.public_key});
try stdout.print("\nCiphertext passed to Alice (using Alice's public key): {x}\n", .{ciphertext});
try stdout.print("\nPlaintext recovered by Alice (with her private key): {s}\n", .{plaintext});
try stdout.flush();
}
运行一个示例,消息为 “Hello” [ 这里]:
== Box encryption Message: Hello
== Box encryption Salt: 727fd19d5dc52fde91455dd04548248203662b96ce74d448
Bob Secret Key: 8250dc0253528e54cba3165a30ab97179a0015eb7f9666dba8fe502ba59f6df4
Bob Public Key: 7c05bc279978aefcd790b732da1732fd50ffc57271ada9b9d46cc8b628796d72
Alice Secret Key: fc91050aadbf5c06161c1e1f7e19f82baab020e4fd39831fed800f4166f40297
Alice Public Key: 1691366d7096e294c1ce07f79f1ff427bad81651d2890c64c1fab3bc69e96d59
Ciphertext passed to Alice (using Alice's public key): 5c3130fc4b00dc1f2284f8d7400abb07ec0a884955
Plaintext recovered by Alice (with her private key): Hello
电子邮件已经存在了几十年,它仍然是网络安全的第一大威胁。 我们收到的大部分内容都是不受信任和未签名的,并且无法判断电子邮件是否已被阅读或是否已被更改。
如果你想了解有关 Zig 的更多信息,请尝试这里:
https://asecuritysite.com/ zig
- 原文链接: medium.com/asecuritysite...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!