DCIT/perl-CryptX
GitHub: DCIT/perl-CryptX
基于 LibTomCrypt 库的 Perl 加密工具包,提供涵盖对称加密、非对称加密、哈希、消息认证、密钥派生等全面的密码学功能接口。
Stars: 41 | Forks: 26
# 名称
CryptX - 密码学工具包
# 大纲
CryptX 是发行版的入口。在常规代码中,请加载下方列出的某个具体模块。
```
## one-shot hashing
use Crypt::Digest qw(digest_data_hex);
my $sha256 = digest_data_hex('SHA256', 'hello world');
## 带 padding 的经典 AES-CBC 加密
use Crypt::Mode::CBC;
my $cbc = Crypt::Mode::CBC->new('AES');
my $iv = random_bytes(16); # 16-byte AES block-size IV
my $cbc_ciphertext = $cbc->encrypt('hello world', $key, $iv);
## 使用 AES 的 authenticated encryption (AEAD)
use Crypt::AuthEnc::GCM qw(gcm_encrypt_authenticate);
my $key = random_bytes(32); # 32-byte AES-256 key
my $nonce = random_bytes(12); # 12-byte unique nonce
my ($ciphertext, $tag) = gcm_encrypt_authenticate('AES', $key, $nonce, 'header', 'hello world');
## message authentication
use Crypt::Mac::HMAC qw(hmac_hex);
my $mac = hmac_hex('SHA256', $key, 'hello world');
## secure random data + UUID 辅助工具
use Crypt::PRNG qw(random_bytes random_string);
use Crypt::Misc qw(random_v4uuid random_v7uuid);
my $salt = random_bytes(16);
my $token = random_string(24);
my $uuid4 = random_v4uuid();
my $uuid7 = random_v7uuid();
## 经典的基于密码的 key derivation
use Crypt::KeyDerivation qw(pbkdf2);
my $dk = pbkdf2('password', $salt, 100_000, 'SHA256', 32);
## bare stream cipher(单独认证)
use Crypt::Stream::ChaCha;
my $stream = Crypt::Stream::ChaCha->new($key, $nonce);
my $stream_ciphertext = $stream->crypt('hello world');
## modern signatures
use Crypt::PK::Ed25519;
my $signer = Crypt::PK::Ed25519->new->generate_key;
my $sig = $signer->sign_message('hello world');
my $ok = $signer->verify_message($sig, 'hello world');
## key agreement
use Crypt::PK::X25519;
my $alice = Crypt::PK::X25519->new->generate_key;
my $bob = Crypt::PK::X25519->new->generate_key;
my $shared_secret = $alice->shared_secret($bob);
```
# 描述
基于内置 [LibTomCrypt](https://github.com/libtom/libtomcrypt) 库构建的 Perl 密码学模块。
该发行版还包含 [Math::BigInt::LTM](https://metacpan.org/pod/Math%3A%3ABigInt%3A%3ALTM),这是一个基于内置 [LibTomMath](https://www.libtom.net/LibTomMath/) 库构建的 [Math::BigInt](https://metacpan.org/pod/Math%3A%3ABigInt) 后端
,供 LibTomCrypt 在内部使用。
该模块主要用作顶层的发行版/文档页面。对于实际工作,
请使用下方列出的某个具体模块。
## 算法选择指南
### 认证加密 (AEAD)
对于新的设计,优先选择认证加密 (AEAD) 而不是纯密码模式:
- **ChaCha20-Poly1305** ([Crypt::AuthEnc::ChaCha20Poly1305](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AChaCha20Poly1305)) - 快速,常数时间,
广泛部署(TLS 1.3, WireGuard, SSH)。建议将其作为默认的 AEAD 选择。
- **XChaCha20-Poly1305** ([Crypt::AuthEnc::XChaCha20Poly1305](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AXChaCha20Poly1305)) - 扩展 24 字节 nonce 的
变体。当 nonce 随机生成时,优先选择此项而不是 ChaCha20-Poly1305。
- **AES-GCM** ([Crypt::AuthEnc::GCM](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AGCM)) - AES 的标准 AEAD 模式。在现代 CPU 上具有硬件加速
。需要唯一的 nonce;nonce 重用会完全破坏其安全性。
- **AES-SIV** ([Crypt::AuthEnc::SIV](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3ASIV)) - 确定性 AEAD,抗 nonce 误用。
速度稍慢,但在无法保证 nonce 唯一性时更安全。
- **AES-GCM-SIV** ([Crypt::AuthEnc::GCMSIV](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AGCMSIV)) - 抗 nonce 误用的 AEAD (RFC 8452)。
比 AES-SIV 快;当你需要类似 GCM 的性能同时又要防止 nonce 重用时,请选择此项。
- **AES-OCB** ([Crypt::AuthEnc::OCB](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AOCB)) - 非常快速的单遍 AEAD。请检查
你所在司法管辖区的专利状态。
- **AES-EAX** ([Crypt::AuthEnc::EAX](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AEAX)) - 基于 CTR+OMAC 的双遍 AEAD。无专利,
没有 nonce 长度限制。
- **AES-CCM** ([Crypt::AuthEnc::CCM](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3ACCM)) - 用于 WiFi (WPA2) 和蓝牙。需要
提前知道明文长度。
### 密码学安全的随机数和 UUID
- **随机字节/字符串** ([Crypt::PRNG](https://metacpan.org/pod/Crypt%3A%3APRNG)) - 用于 salt、密钥、nonce、token,
以及任何其他机密随机值。函数式辅助函数
`random_bytes`, `random_bytes_hex`, `random_bytes_b64`, `random_bytes_b64u`,
`random_string`, 和 `random_string_from` 涵盖了大多数使用场景。OO API
和特定于算法的包装器([Crypt::PRNG::ChaCha20](https://metacpan.org/pod/Crypt%3A%3APRNG%3A%3AChaCha20), [Crypt::PRNG::Fortuna](https://metacpan.org/pod/Crypt%3A%3APRNG%3A%3AFortuna), 等)
主要用于确定性流或与特定 PRNG 的互操作性。
- **UUID** (["random\_v4uuid" in Crypt::Misc](https://metacpan.org/pod/Crypt%3A%3AMisc#random_v4uuid), ["random\_v7uuid" in Crypt::Misc](https://metacpan.org/pod/Crypt%3A%3AMisc#random_v7uuid)) - 使用 `random_v4uuid`
作为不透明的随机标识符。当你希望标识符大致按时间排序,并支持以毫秒粒度按创建时间排序时,请使用 `random_v7uuid`。UUID 是标识符,不能替代
机密的随机字节。
### 流密码
流密码逐字节加密数据,无需块填充。对于大多数
应用,请优先选择 AEAD 模式(见上文),它将加密与
身份验证捆绑在一起。仅当你单独处理身份验证时,
才使用纯流密码。
- **ChaCha** ([Crypt::Stream::ChaCha](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3AChaCha)) - 默认的流密码选择。
与 ChaCha20-Poly1305 核心相同,但没有内置 MAC。
- **XChaCha** ([Crypt::Stream::XChaCha](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3AXChaCha)) - ChaCha 的扩展 24 字节 nonce 变体。
当 nonce 随机生成时优先选择此项。
- **Salsa20** / **XSalsa20** ([Crypt::Stream::Salsa20](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3ASalsa20), [Crypt::Stream::XSalsa20](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3AXSalsa20)) -
ChaCha 的前身。新设计优先选择 ChaCha;Salsa20 仅用于
互操作性(例如 NaCl/libsodium)。
- **RC4** ([Crypt::Stream::RC4](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3ARC4)) - **已损坏;不要用于新设计。** 仅为
遗留互操作性而提供。
- **Rabbit**, **Sober128**, **Sosemanuk** ([Crypt::Stream::Rabbit](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3ARabbit), [Crypt::Stream::Sober128](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3ASober128), [Crypt::Stream::Sosemanuk](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3ASosemanuk)) -
来自 eSTREAM 组合的小众密码。除非特定协议要求,否则请使用 ChaCha。
### 分组密码模式(不带身份验证)
仅当身份验证被单独处理或不需要时才使用这些模式:
- **CTR** ([Crypt::Mode::CTR](https://metacpan.org/pod/Crypt%3A%3AMode%3A%3ACTR)) - 将分组密码转换为流密码。可并行化。
- **CBC** ([Crypt::Mode::CBC](https://metacpan.org/pod/Crypt%3A%3AMode%3A%3ACBC)) - 经典模式,需要填充。优先选择 CTR 或 AEAD 模式。
- **ECB** ([Crypt::Mode::ECB](https://metacpan.org/pod/Crypt%3A%3AMode%3A%3AECB)) - **对大多数用途而言是不安全的。** 每个块独立加密。
单独的 [Crypt::Cipher::AES](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3AAES), [Crypt::Cipher::Twofish](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ATwofish), 等模块实现了
原始的单块加密,极少被直接使用。在几乎所有情况下,你应该
通过 AEAD 模式([Crypt::AuthEnc::GCM](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AGCM), [Crypt::AuthEnc::CCM](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3ACCM)) 或分组
密码模式([Crypt::Mode::CBC](https://metacpan.org/pod/Crypt%3A%3AMode%3A%3ACBC), [Crypt::Mode::CTR](https://metacpan.org/pod/Crypt%3A%3AMode%3A%3ACTR)) 来使用它们。选择密码时,
**AES** 是默认选择;它在大多数现代 CPU 上具有硬件加速。
### 哈希函数
- **SHA-256** / **SHA-384** / **SHA-512** ([Crypt::Digest::SHA256](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA256), 等) - 通用哈希的
默认选择。受到广泛支持且经过了充分分析。
- **SHA3-256** / **SHA3-512** ([Crypt::Digest::SHA3\_256](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA3_256), 等) - SHA-2 的替代方案,
具有完全不同的结构(Keccak sponge)。
- **BLAKE2b** / **BLAKE2s** ([Crypt::Digest::BLAKE2b\_256](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ABLAKE2b_256), 等) - 非常快,尤其是
在软件中。BLAKE2b 用于 64 位平台,BLAKE2s 用于 32 位平台。
- **SHAKE** / **TurboSHAKE** / **KangarooTwelve** - 可扩展输出函数 (XOFs)。
当你需要可变长度的输出时使用。
### 校验和
使用 [Crypt::Checksum::CRC32](https://metacpan.org/pod/Crypt%3A%3AChecksum%3A%3ACRC32) 和 [Crypt::Checksum::Adler32](https://metacpan.org/pod/Crypt%3A%3AChecksum%3A%3AAdler32) 仅用于
非对抗性的完整性检查,例如意外损坏检测。
它们不是密码学的完整性或真实性机制。对于
密码学用途,请优先选择 [Crypt::Digest](https://metacpan.org/pod/Crypt%3A%3ADigest), [Crypt::Mac](https://metacpan.org/pod/Crypt%3A%3AMac),或来自
[Crypt::AuthEnc](https://metacpan.org/pod/Crypt%3A%3AAuthEnc) 的 AEAD 模式。
### 消息认证码
- **HMAC** ([Crypt::Mac::HMAC](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3AHMAC)) - 标准的 MAC 构造。可与任何哈希一起使用。
使用 HMAC-SHA256 作为默认值。
- **Poly1305** ([Crypt::Mac::Poly1305](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3APoly1305)) - 一次性 MAC,速度极快。用作
ChaCha20-Poly1305 的一部分。要求每条消息使用唯一的密钥。
- **BLAKE2b-MAC** ([Crypt::Mac::BLAKE2b](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3ABLAKE2b)) - 带密钥的 BLAKE2。在
软件中比 HMAC-SHA256 快。
- **CMAC/OMAC** ([Crypt::Mac::OMAC](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3AOMAC)) - 基于分组密码的 MAC。当你已经
拥有 AES 但没有哈希函数时使用。
### 公钥密码学
- **Ed25519** ([Crypt::PK::Ed25519](https://metacpan.org/pod/Crypt%3A%3APK%3A%3AEd25519)) - 现代数字签名。快速,常数时间,
密钥/签名体积小。新签名方案的默认选择。
- **Ed448** ([Crypt::PK::Ed448](https://metacpan.org/pod/Crypt%3A%3APK%3A%3AEd448)) - 安全边际高于 Ed25519(约 224 位对比约 128 位)。
- **X25519** ([Crypt::PK::X25519](https://metacpan.org/pod/Crypt%3A%3APK%3A%3AX25519)) - 椭圆曲线 Diffie-Hellman 密钥协商。密钥
交换的默认选择。
- **X448** ([Crypt::PK::X448](https://metacpan.org/pod/Crypt%3A%3APK%3A%3AX448)) - 安全边际高于 X25519。
- **ECDSA** ([Crypt::PK::ECC](https://metacpan.org/pod/Crypt%3A%3APK%3A%3AECC)) - 广泛使用(TLS,Bitcoin)。新
设计优先选择 Ed25519,除非出于互操作性需要 ECDSA。
- **RSA** ([Crypt::PK::RSA](https://metacpan.org/pod/Crypt%3A%3APK%3A%3ARSA)) - 遗留技术但使用非常广泛。至少使用 2048 位密钥,推荐
4096 位。加密优先使用 OAEP,签名优先使用 PSS。
- **DSA** ([Crypt::PK::DSA](https://metacpan.org/pod/Crypt%3A%3APK%3A%3ADSA)) - 遗留技术。优先选择 Ed25519 或 ECDSA。
- **DH** ([Crypt::PK::DH](https://metacpan.org/pod/Crypt%3A%3APK%3A%3ADH)) - 经典 Diffie-Hellman。新设计优先选择 X25519。
### 密钥派生 / 密码哈希
- **HKDF** (["hkdf" in Crypt::KeyDerivation](https://metacpan.org/pod/Crypt%3A%3AKeyDerivation#hkdf)) - Extract-then-expand KDF。用于
从共享密钥(例如在 ECDH 之后)派生密钥。
- **Argon2** (["argon2\_pbkdf" in Crypt::KeyDerivation](https://metacpan.org/pod/Crypt%3A%3AKeyDerivation#argon2_pbkdf)) - 内存密集型密码哈希。
推荐的密码存储选择。
- **Bcrypt** (["bcrypt\_pbkdf" in Crypt::KeyDerivation](https://metacpan.org/pod/Crypt%3A%3AKeyDerivation#bcrypt_pbkdf)) - 主要用于
兼容明确要求基于 bcrypt 的密钥派生的格式和协议(例如
某些 OpenSSH 工作流)。新的密码存储设计请优先选择 Argon2。
- **Scrypt** (["scrypt\_pbkdf" in Crypt::KeyDerivation](https://metacpan.org/pod/Crypt%3A%3AKeyDerivation#scrypt_pbkdf)) - 内存密集型 KDF。如果可用,请使用 Argon2。
- **PBKDF2** (["pbkdf2" in Crypt::KeyDerivation](https://metacpan.org/pod/Crypt%3A%3AKeyDerivation#pbkdf2)) - 支持广泛,但仅有 CPU 硬性限制。
尽可能使用 Argon2 或 Scrypt。
- **PBKDF1** (["pbkdf1" in Crypt::KeyDerivation](https://metacpan.org/pod/Crypt%3A%3AKeyDerivation#pbkdf1), ["pbkdf1\_openssl" in Crypt::KeyDerivation](https://metacpan.org/pod/Crypt%3A%3AKeyDerivation#pbkdf1_openssl)) - 仅限遗留
派生。保留此项用于与旧格式的互操作性;不要用于新设计。
## 错误处理
大多数 CryptX 模块通过调用 `croak`(来自 [Carp](https://metacpan.org/pod/Carp))来报告错误。
无效的参数、不支持的算法、错误的密钥长度、格式不正确的
输入以及内部库故障通常会 croak 并附带描述性
消息。使用 `eval` 或 [Try::Tiny](https://metacpan.org/pod/Try%3A%3ATiny) 捕获异常。
一些验证式的辅助函数使用返回值而不是 croak。最
重要的示例是认证加密模块 `Crypt::AuthEnc::*` 中的
`*_decrypt_verify` 函数。
当身份验证失败时,这些函数会返回 `undef`,表明密文已被篡改,
或者使用了错误的密钥/nonce。其他模块中的某些解析器/解码器辅助函数
对于格式错误的输入也会返回 `undef` 或 false,因此当你需要
了解确切的失败语义时,请查阅具体
模块的 POD。
## 模块映射
- 顶级家族模块
[Crypt::Cipher](https://metacpan.org/pod/Crypt%3A%3ACipher), [Crypt::Mode](https://metacpan.org/pod/Crypt%3A%3AMode),Crypt::AuthEnc](https://metacpan.org/pod/Crypt%3A%3AAuthEnc),
[Crypt::Digest](https://metacpan.org/pod/Crypt%3A%3ADigest), [Crypt::Mac](https://metacpan.org/pod/Crypt%3A%3AMac), [Crypt::Checksum](https://metacpan.org/pod/Crypt%3A%3AChecksum), [Crypt::PRNG](https://metacpan.org/pod/Crypt%3A%3APRNG),
[Crypt::PK](https://metacpan.org/pod/Crypt%3A%3APK), [Crypt::KeyDerivation](https://metacpan.org/pod/Crypt%3A%3AKeyDerivation), [Crypt::Misc](https://metacpan.org/pod/Crypt%3A%3AMisc), [Crypt::ASN1](https://metacpan.org/pod/Crypt%3A%3AASN1)
- 对称密码
[Crypt::Cipher::AES](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3AAES), [Crypt::Cipher::Anubis](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3AAnubis), [Crypt::Cipher::ARIA](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3AARIA), [Crypt::Cipher::Blowfish](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ABlowfish), [Crypt::Cipher::Camellia](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ACamellia), [Crypt::Cipher::CAST5](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ACAST5), [Crypt::Cipher::DES](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ADES),
[Crypt::Cipher::DES\_EDE](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ADES_EDE), [Crypt::Cipher::IDEA](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3AIDEA), [Crypt::Cipher::KASUMI](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3AKASUMI), [Crypt::Cipher::Khazad](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3AKhazad), [Crypt::Cipher::MULTI2](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3AMULTI2), [Crypt::Cipher::Noekeon](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ANoekeon),
[Crypt::Cipher::RC2](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ARC2), [Crypt::Cipher::RC5](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ARC5), [Crypt::Cipher::RC6](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ARC6), [Crypt::Cipher::SAFERP](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ASAFERP), [Crypt::Cipher::SAFER\_K128](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ASAFER_K128), [Crypt::Cipher::SAFER\_K64](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ASAFER_K64),
[Crypt::Cipher::SAFER\_SK128](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ASAFER_SK128), [Crypt::Cipher::SAFER\_SK64](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ASAFER_SK64), [Crypt::Cipher::SEED](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ASEED), [Crypt::Cipher::SM4](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ASM4), [Crypt::Cipher::Serpent](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ASerpent), [Crypt::Cipher::Skipjack](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ASkipjack),
[Crypt::Cipher::Twofish](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3ATwofish), [Crypt::Cipher::XTEA](https://metacpan.org/pod/Crypt%3A%3ACipher%3A%3AXTEA)
- 分组密码模式
[Crypt::Mode::CBC](https://metacpan.org/pod/Crypt%3A%3AMode%3A%3ACBC), [Crypt::Mode::CFB](https://metacpan.org/pod/Crypt%3A%3AMode%3A%3ACFB), [Crypt::Mode::CTR](https://metacpan.org/pod/Crypt%3A%3AMode%3A%3ACTR), [Crypt::Mode::ECB](https://metacpan.org/pod/Crypt%3A%3AMode%3A%3AECB), [Crypt::Mode::OFB](https://metacpan.org/pod/Crypt%3A%3AMode%3A%3AOFB)
- 流密码
[Crypt::Stream::RC4](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3ARC4), [Crypt::Stream::ChaCha](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3AChaCha), [Crypt::Stream::XChaCha](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3AXChaCha), [Crypt::Stream::Salsa20](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3ASalsa20), [Crypt::Stream::XSalsa20](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3AXSalsa20),
[Crypt::Stream::Sober128](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3ASober128), [Crypt::Stream::Sosemanuk](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3ASosemanuk), [Crypt::Stream::Rabbit](https://metacpan.org/pod/Crypt%3A%3AStream%3A%3ARabbit)
- 认证加密模式
[Crypt::AuthEnc::CCM](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3ACCM), [Crypt::AuthEnc::EAX](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AEAX), [Crypt::AuthEnc::GCM](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AGCM), [Crypt::AuthEnc::GCMSIV](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AGCMSIV), [Crypt::AuthEnc::OCB](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AOCB), [Crypt::AuthEnc::ChaCha20Poly1305](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AChaCha20Poly1305), [Crypt::AuthEnc::XChaCha20Poly1305](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3AXChaCha20Poly1305), [Crypt::AuthEnc::SIV](https://metacpan.org/pod/Crypt%3A%3AAuthEnc%3A%3ASIV)
- 哈希函数
[Crypt::Digest::BLAKE2b\_160](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ABLAKE2b_160), [Crypt::Digest::BLAKE2b\_256](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ABLAKE2b_256), [Crypt::Digest::BLAKE2b\_384](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ABLAKE2b_384), [Crypt::Digest::BLAKE2b\_512](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ABLAKE2b_512),
[Crypt::Digest::BLAKE2s\_128](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ABLAKE2s_128), [Crypt::Digest::BLAKE2s\_160](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ABLAKE2s_160), [Crypt::Digest::BLAKE2s\_224](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ABLAKE2s_224), [Crypt::Digest::BLAKE2s\_256](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ABLAKE2s_256),
[Crypt::Digest::CHAES](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ACHAES), [Crypt::Digest::MD2](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3AMD2), [Crypt::Digest::MD4](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3AMD4), [Crypt::Digest::MD5](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3AMD5), [Crypt::Digest::RIPEMD128](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ARIPEMD128), [Crypt::Digest::RIPEMD160](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ARIPEMD160),
[Crypt::Digest::RIPEMD256](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ARIPEMD256), [Crypt::Digest::RIPEMD320](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ARIPEMD320), [Crypt::Digest::SHA1](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA1), [Crypt::Digest::SHA224](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA224), [Crypt::Digest::SHA256](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA256), [Crypt::Digest::SHA384](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA384),
[Crypt::Digest::SHA512](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA512), [Crypt::Digest::SHA512\_224](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA512_224), [Crypt::Digest::SHA512\_256](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA512_256), [Crypt::Digest::Tiger192](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ATiger192), [Crypt::Digest::Whirlpool](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3AWhirlpool),
[Crypt::Digest::Keccak224](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3AKeccak224), [Crypt::Digest::Keccak256](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3AKeccak256), [Crypt::Digest::Keccak384](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3AKeccak384), [Crypt::Digest::Keccak512](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3AKeccak512),
[Crypt::Digest::SHA3\_224](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA3_224), [Crypt::Digest::SHA3\_256](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA3_256), [Crypt::Digest::SHA3\_384](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA3_384), [Crypt::Digest::SHA3\_512](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHA3_512), [Crypt::Digest::SHAKE](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASHAKE),
[Crypt::Digest::TurboSHAKE](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ATurboSHAKE), [Crypt::Digest::KangarooTwelve](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3AKangarooTwelve), [Crypt::Digest::SM3](https://metacpan.org/pod/Crypt%3A%3ADigest%3A%3ASM3)
- 校验和
[Crypt::Checksum::Adler32](https://metacpan.org/pod/Crypt%3A%3AChecksum%3A%3AAdler32), [Crypt::Checksum::CRC32](https://metacpan.org/pod/Crypt%3A%3AChecksum%3A%3ACRC32)
- 消息认证码
[Crypt::Mac::BLAKE2b](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3ABLAKE2b), [Crypt::Mac::BLAKE2s](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3ABLAKE2s), [Crypt::Mac::F9](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3AF9), [Crypt::Mac::HMAC](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3AHMAC), [Crypt::Mac::KMAC](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3AKMAC),
[Crypt::Mac::OMAC](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3AOMAC), [Crypt::Mac::Pelican](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3APelican), [Crypt::Mac::PMAC](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3APMAC), [Crypt::Mac::XCBC](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3AXCBC), [Crypt::Mac::Poly1305](https://metacpan.org/pod/Crypt%3A%3AMac%3A%3APoly1305)
- 公钥密码学
[Crypt::PK::RSA](https://metacpan.org/pod/Crypt%3A%3APK%3A%3ARSA), [Crypt::PK::DSA](https://metacpan.org/pod/Crypt%3A%3APK%3A%3ADSA), [Crypt::PK::ECC](https://metacpan.org/pod/Crypt%3A%3APK%3A%3AECC), [Crypt::PK::DH](https://metacpan.org/pod/Crypt%3A%3APK%3A%3ADH), [Crypt::PK::Ed25519](https://metacpan.org/pod/Crypt%3A%3APK%3A%3AEd25519), [Crypt::PK::X25519](https://metacpan.org/pod/Crypt%3A%3APK%3A%3AX25519), [Crypt::PK::Ed448](https://metacpan.org/pod/Crypt%3A%3APK%3A%3AEd448), [Crypt::PK::X448](https://metacpan.org/pod/Crypt%3A%3APK%3A%3AX448)
- 密码学安全的随机数生成器
[Crypt::PRNG::Fortuna](https://metacpan.org/pod/Crypt%3A%3APRNG%3A%3AFortuna), [Crypt::PRNG::Yarrow](https://metacpan.org/pod/Crypt%3A%3APRNG%3A%3AYarrow), [Crypt::PRNG::RC4](https://metacpan.org/pod/Crypt%3A%3APRNG%3A%3ARC4), [Crypt::PRNG::Sober128](https://metacpan.org/pod/Crypt%3A%3APRNG%3A%3ASober128), [Crypt::PRNG::ChaCha20](https://metacpan.org/pod/Crypt%3A%3APRNG%3A%3AChaCha20)
- 密钥派生函数
[Crypt::KeyDerivation](https://metacpan.org/pod/Crypt%3A%3AKeyDerivation)
- ASN.1 解析器
[Crypt::ASN1](https://metacpan.org/pod/Crypt%3A%3AASN1)
仅当你需要自定义 ASN.1 / DER 解析或编码时才使用 `Crypt::ASN1`。
大多数常见的密钥和证书格式已经由 PK 模块处理。
- 杂项辅助函数
[Crypt::Misc](https://metacpan.org/pod/Crypt%3A%3AMisc) (base64/base32/base58 编解码器、PEM 辅助函数、常数时间比较、UUID 生成、八位字节递增辅助函数及相关实用函数)
## 诊断函数
这些底层函数暴露了内置 LibTomCrypt 构建的详细信息。
它们旨在用于故障排除和错误报告,而不是常规使用。
### ltc\_build\_settings
```
my $str = CryptX::ltc_build_settings();
```
返回一个多行字符串,描述构建内置 LibTomCrypt 库时启用的
每个编译时选项(密码、哈希、
MAC、PK 算法、编译器标志等)。
### ltc\_mp\_name
```
my $name = CryptX::ltc_mp_name();
# 例如 "LTM" (LibTomMath)
```
返回正在使用的数学提供者后端的名称。
### ltc\_mp\_bits\_per\_digit
```
my $bits = CryptX::ltc_mp_bits_per_digit();
# 例如 60
```
返回数学提供者使用的每个数字的位数。
## Math::BigInt 后端
CryptX 的一部分是 [Math::BigInt::LTM](https://metacpan.org/pod/Math%3A%3ABigInt%3A%3ALTM),这是一个基于
内置 LibTomMath 库构建的 [Math::BigInt](https://metacpan.org/pod/Math%3A%3ABigInt) 后端。它与上述的
密码学 API 是分开的,但它随同一个发行版发布,并使用了
LibTomCrypt 所依赖的同一个大整数引擎。
# 许可证
本程序是自由软件;你可以根据与 Perl 本身相同的条款重新分发和/或修改它。
# 版权
版权所有 (c) 2013-2026 DCIT, a.s. [https://www.dcit.cz](https://www.dcit.cz) / Karel Miko
标签:CVE, Perl, 加密解密, 哈希算法, 安全随机数, 密码学库, 数字签名