基于ASP.NET与Bouncy Castle实现CRYSTALS-DILITHIUM数字签名方案
使用Bouncy Castle .NET v2.2.0实现CRYSTALS-DILITHIUM签名方案
针对你在ASP.NET P2P文件共享系统中使用CRYSTALS-DILITHIUM算法的需求,以下是修正后的完整实现代码,解决密钥对生成、签名、验证的核心问题:
1. 生成密钥对并序列化
生成密钥对后,可通过GetEncoded()方法直接获取密钥的字节数组,用于存储或传输:
using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using System.Text; public static (byte[] publicKeyBytes, byte[] privateKeyBytes) GenerateKeyPair() { DilithiumKeyPairGenerator generator = new DilithiumKeyPairGenerator(); generator.Init(new DilithiumKeyGenerationParameters( new SecureRandom(), DilithiumParameters.Dilithium5Aes )); AsymmetricCipherKeyPair keyPair = generator.GenerateKeyPair(); // 将密钥转换为字节数组,用于后续存储或传输 byte[] publicKeyBytes = ((DilithiumPublicKeyParameters)keyPair.Public).GetEncoded(); byte[] privateKeyBytes = ((DilithiumPrivateKeyParameters)keyPair.Private).GetEncoded(); return (publicKeyBytes, privateKeyBytes); }
2. 使用私钥对消息签名
无需手动构造DilithiumPrivateKeyParameters的参数,直接使用生成的私钥字节数组还原私钥后进行签名:
public static byte[] SignMessage(byte[] privateKeyBytes, string messageText) { // 从字节数组还原私钥 DilithiumPrivateKeyParameters privateKey = new DilithiumPrivateKeyParameters(privateKeyBytes); DilithiumSigner signer = new DilithiumSigner(); // 初始化签名器:true表示签名模式,传入私钥参数 signer.Init(true, privateKey); byte[] message = Encoding.UTF8.GetBytes(messageText); // 生成签名 return signer.GenerateSignature(message); }
3. 使用公钥验证签名
公钥字节数组直接来自密钥生成阶段的publicKeyBytes,传入DilithiumPublicKeyParameters构造函数即可完成验证:
public static bool VerifySignature(byte[] publicKeyBytes, byte[] message, byte[] signature) { // 从字节数组还原公钥 DilithiumPublicKeyParameters publicKey = new DilithiumPublicKeyParameters(publicKeyBytes); DilithiumSigner verifier = new DilithiumSigner(); // 初始化验证器:false表示验证模式,传入公钥参数 verifier.Init(false, publicKey); // 验证签名是否有效 return verifier.VerifySignature(message, signature); }
完整调用示例
// 生成密钥对 var (pubKey, privKey) = GenerateKeyPair(); // 签名消息(建议对文件哈希值签名,而非大文件本身) string fileHash = "计算得到的共享文件SHA-256哈希值"; byte[] signature = SignMessage(privKey, fileHash); // 客户端验证签名(持有预先分发的pubKey) byte[] hashBytes = Encoding.UTF8.GetBytes(fileHash); bool isSignatureValid = VerifySignature(pubKey, hashBytes, signature);
关键说明
- 密钥序列化:
GetEncoded()方法返回符合CRYSTALS-DILITHIUM标准的密钥编码,可直接存储或网络传输。 - 性能优化:大文件场景下,优先对文件哈希值签名,避免处理超大字节数组影响效率。
- 模式区分:
DilithiumSigner.Init()第一个参数forSigning为true时是签名模式,传入私钥;为false时是验证模式,传入公钥。
内容的提问来源于stack exchange,提问作者Atom
相关产品推荐
相关产品推荐

