You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:25:33