cngsha3:较新算法的加密下一代实现






4.68/5 (7投票s)
在 Win32 项目中使用 SHA-3 和 CRYSTALS Kyber、Dilithium 和 Sphincs
引言
虽然 SHA-3 已经发布很久了,但 Windows CNG API 尚未支持它。这里提供了一个 DLL,您可以将其安装到系统中,以便任何使用 CNG 的应用程序(包括 CMS)都可以完全支持 SHA-3 系列。
此外,据称能够抵抗量子计算机破解尝试的新 CRYSTAL 算法已经发布。它们是:
- CRYSTALS-Kyber,一种公钥/私钥加密/解密算法。实现在这里。512、768、1024 位实现。
- CRYSTALS-Dilithium,一种公钥/私钥签名/验证算法。实现在这里。有三个版本(2、3 和 5)。
- CRYSTALS-Sphincs,一种公钥/私钥签名/验证算法。实现在这里。
背景
Microsoft 发布了一个 CNG SDK 在这里。该 SDK 允许开发人员为 CNG 创建用户模式 DLL 扩展,包括自定义哈希提供程序。
此 DLL 的注册包括调用此 SDK 中的函数,并将 DLL 放入 system32 目录(否则它将无法工作)。该 DLL 为从用户调用 BCryptCreateHash()
、BCryptHashData()
等路由的函数提供占位符。
我使用了 librhash 来实现 SHA-3。
构建库
- 按照上述说明安装 CNG SDK。
- 使用 Visual Studio 打开解决方案。
- 在 DLL 和测试项目属性中,将 C++
include
路径设置为上述 CNG SDK(我的设置为 c:\Windows Kits\10\Cryptographic Provider Development Kit\include)。 - 构建项目。
准备好了!
安装库
该库包含一个 DllRegisterServer/DllUnregisterServer
集,因此您可以使用 regsvr32
在其上注册。它注册以下名称:
inline const wchar_t* ProviderB = L"Michael Chourdakis CNG Implementations";
#define SHA3_224_ALGORITHM L"SHA3-224"
#define SHA3_256_ALGORITHM L"SHA3-256"
#define SHA3_384_ALGORITHM L"SHA3-384"
#define SHA3_512_ALGORITHM L"SHA3-512"
#define KYBER_512_ALGORITHM L"KYBER-512"
#define KYBER_768_ALGORITHM L"KYBER-768"
#define KYBER_1024_ALGORITHM L"KYBER-1024"
#define DILITHIUM_2_ALGORITHM L"DILITHIUM-2"
#define DILITHIUM_3_ALGORITHM L"DILITHIUM-3"
#define DILITHIUM_5_ALGORITHM L"DILITHIUM-5"
#define SPHINCS_ALGORITHM L"SPHINCS"
使用库
就像任何其他 CNG 哈希函数一样
- 使用
BCryptOpenAlgorithmProvider
使用上述算法之一打开提供程序。 - 使用
BCryptCreateHash
创建哈希。 - 使用
BCryptHashData
反复哈希数据。 - 使用
BCryptGetProperty
获取哈希长度。它将分别返回 24、32、48 或 64。 - 通过调用
BCryptFinishHash
获取哈希。 - 您可以使用
BCryptHashData
重复使用句柄。
要使用公钥/私钥加密/解密,请调用 BCryptEncrypt
和 BCryptDecrypt
。请注意,Kyber 算法需要 32 字节的数据进行加密/解密,所以我使用哈希。
要使用公钥/私钥签名/验证,请调用 BCryptSignHash
和 BCryptVerifyHash
。
Test.cpp 包含此功能的简单演示。
历史
- 2023 年 8 月 14 日:添加了新的算法
- 2023 年 1 月 11 日:首次发布