本文介绍了AEGIS加密算法,它是AES的替代方案,具有身份验证标签和唯一标识符。文章还提供了libsodium.js中使用AEGIS-128l, AEGIS-256 或 XChaCha20的示例。此外,展示了在Zig语言中使用AEGIS进行消息认证码(CMAC)的实现,并对比了AEGIS与XChaCha20的性能。

AES 自 2001 年以来一直存在,并且仍然非常强大。但是,还有其他的替代方案,包括 ChaCha20 和 AEGIS,而且强大的 Bart Preneel 合作撰写了一篇关于 AEGIS 的论文[ here][1]:
这篇论文是 [ here][1]:

总的来说,AEGIS-128L 和 AEGIS-256 是基于 AES 的密码,它们集成了一个身份验证标签,每个消息都可以有一个唯一的标识符。nonce 值也相对较大,AEGIS-128L 的 nonce 值为 128 位,AEGIS-256 的 nonce 值为 256 位,并且具有比 AES-GCM 更好的安全裕度。总的来说,我们可以泄漏密码过程的状态,但这不会泄漏密钥,并且已经证明在使用 AES 增强型处理器时具有快速操作,并且比 AES-GCM 具有更低的内存要求。
libsodium.js 是一个被编译为 WASM (WebAssembly) 的 sodium 加密库,它使用与 Python 端口相同的 sodium 方法。总的来说,libsodium 使用 AEGIS-128l、AEGIS-256 或 XChaCha20。这样,对于 AEGIS-128l,我们有一个 128 位的密钥,对于 AEGIS-256 和 XChaCha20,我们有一个 256 位的密钥。对于 AEGIS-128l,我们有一个 128 位的 nonce 值,对于 256 位的 AEGIS-256,我们有一个 256 位的 nonce 值。对于 XChaCha20,我们有一个 192 位的 nonce 值。在下面,我们将选择加密类型,并为附加数据 (AD) 生成一个随机的 nonce 值和 128 个字节。这种类型的密码被称为 AEAD(带有附加数据的认证加密)。
在下面,我们创建一个随机的 128 位加密密钥,并使用 AEGIS-128l 加密和解密一条消息 [ here]:
const message = document.getElementById("message").value;
var msg = window.sodium.from_string(message);
var ciphertext;
var decrypted;
var key;
var nonce;
key = window.sodium.crypto_aead_aegis128l_keygen();
document.getElementById('key').innerText = toHex(key) + "\n";
nonce = window.sodium.randombytes_buf(window.sodium.crypto_aead_aegis128l_NPUBBYTES);
document.getElementById('nonce').innerText = toHex(nonce) + "\n";
onst ad = window.sodium.randombytes_buf(64);
document.getElementById('ad').innerText = toHex(ad) + "\n";
ciphertext = window.sodium.crypto_aead_aegis128l_encrypt(msg, ad, null, nonce, key);
ecrypted = window.sodium.crypto_aead_aegis128l_decrypt(null, ciphertext, ad, nonce, key);
document.getElementById('Ciphertext').innerText = toHex(ciphertext);
document.getElementById('Decrypted').innerText = new TextDecoder().decode(decrypted);
一个例子是 here。
Zig 中支持的两种主要方法是 AEGIS-128L(使用 128 位密钥)和 AEGIS-256(使用 256 位密钥)。在这种情况下,我们将把该密码用于 CMAC(密码 MAC),并集成 AEGIS-128LMac、Aegis128X2Mac、Aegis128X4Mac、Aegis256Mac、Aegis256X2Mac 和 Aegis256X4Mac。X2 和 X4 版本是集成的更快版本。这些方法中的每一种都会生成一个 256 位的标签,并且速度非常快。AEGIS-128LMac 使用 128 位密钥并提供 128 位安全性(并且比 Ghash 和 Poly1305 具有更好的安全性)。Aegis256Mac 使用 256 位密钥并提供 256 位安全性。通过 AES 加速,CMAC(基于密码的 MAC)方法通常比 HMAC(基于哈希的 MAC)方法更快。
CMAC(基于密码的消息认证码)使用分组密码和密钥来创建消息认证码 (MAC)。它们与 HMAC 的不同之处在于它们使用对称密钥方法来生成 MAC,而不是使用哈希方法。当接收方收到 CMAC 字段时,他们还将使用消息和密钥计算相同的 CMAC。如果它们相同,则接收方知道消息没有被更改,并且已使用密钥签名。

主要方法有:
以下代码是用 Zig Version 0.15.1 编译的 [ here]。有了 ZIg,我们可以使用 Aegis MAC:
const std = @import("std");
const crypto = std.crypto.auth;
pub fn main() !void {
var stdout_buffer: [4096]u8 = undefined;
var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
const stdout = &stdout_writer.interface;
// Create keys for KMac
// 为 KMac 创建密钥
var key256: [32]u8 = undefined;
var key128: [crypto.aegis.Aegis128LMac.key_length]u8 = undefined;
// Fill 'key' with a secure random key
// 用安全的随机密钥填充“key”
std.crypto.random.bytes(&key256);
std.crypto.random.bytes(&key128);
// Get the command-line arguments
// 获取命令行参数
var data: []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) {
data = args[1];
}
var Aegis128LMac: [crypto.aegis.Aegis128LMac.mac_length]u8 = undefined;
var Aegis128X2Mac: [crypto.aegis.Aegis128LMac.mac_length]u8 = undefined;
var Aegis128X4Mac: [crypto.aegis.Aegis128LMac.mac_length]u8 = undefined;
var Aegis256Mac: [crypto.aegis.Aegis256Mac.mac_length]u8 = undefined;
var Aegis256X2Mac: [crypto.aegis.Aegis128LMac.mac_length]u8 = undefined;
var Aegis256X4Mac: [crypto.aegis.Aegis128LMac.mac_length]u8 = undefined;
std.crypto.auth.aegis.Aegis128LMac.create(&Aegis128LMac, data, &key128);
std.crypto.auth.aegis.Aegis128X2Mac.create(&Aegis128X2Mac, data, &key128);
std.crypto.auth.aegis.Aegis128X4Mac.create(&Aegis128X4Mac, data, &key128);
std.crypto.auth.aegis.Aegis256Mac.create(&Aegis256Mac, data, &key256);
std.crypto.auth.aegis.Aegis256X2Mac.create(&Aegis256X2Mac, data, &key256);
std.crypto.auth.aegis.Aegis256X4Mac.create(&Aegis256X4Mac, data, &key256);
try stdout.print("Aegis:\t\t{s}\n", .{data});
try stdout.print(" Key (128-bit):\t{x}\n", .{key128});
try stdout.print(" Key (256-bit):\t{x}\n", .{key256});
try stdout.print("\nAegis128LMac:\t{x}\n", .{Aegis128LMac});
try stdout.print("\nAegis128X2Mac:\t{x}\n", .{Aegis128X2Mac});
try stdout.print("\nAegis128X4Mac:\t{x}\n", .{Aegis128X4Mac});
try stdout.print("\nAegis256Mac:\t{x}\n", .{Aegis256Mac});
try stdout.print("\nAegis256X2Mac:\t{x}\n", .{Aegis256X2Mac});
try stdout.print("\nAegis256X4Mac:\t{x}\n", .{Aegis256X4Mac});
try stdout.flush();
}
数据为“Hello”的示例运行:
Aegis: Hello
Key (128-bit): c0b1c29befd5c8af88e1debe38705ad1
Key (256-bit): 23df84d82fbb82c9bac9b563fa000601a4787f7638a3d5a868158b9fd090f1e3
Aegis128LMac: 2b3896e6ddb0f4e08cbbd2658dd1c4cc0ab83c9bee9fefcb3a4c46c383b2cef4
Aegis128X2Mac: 562c86f9e8589ffabbd43e0b6c125a598878d6bf615cba715a1227ed917b5584
Aegis128X4Mac: 10a9ff12b9d35dec1488bf9c97c76e34abadae2a792e5ab89b84e30ae57d1510
Aegis256Mac: 72aeb275d840199e3de72f0ef32e8b880a2e9a135e2ce9cb7eb6be964b57b460
Aegis256X2Mac: 35b9bd00a6c17854864ecb355569186b4207f9585fa08c52b721456178904f35
Aegis256X4Mac: 8132d4368a18443e904c60b5e5c0cc0483ff272f97cf8fef6d56098dcb1a3ce7
对于具有 AES 硬件支持的设备,AEGIS 是一个相当不错的解决方案;否则,XChaCha20 可能更适合性能。
[1] Wu, H., & Preneel, B. (2013, August). AEGIS: A fast authenticated encryption algorithm. In International Conference on Selected Areas in Cryptography (pp. 185–201). Berlin, Heidelberg: Springer Berlin Heidelberg.
- 原文链接: medium.com/asecuritysite...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!