我正在用ASP.NET
写一个点对点文件共享系统。客户端需要能够验证他们的文件来自一个值得信任的作者。客户端拥有他们信任的作者的公钥,作者应该对他们共享的文件进行数字签名。
我想使用CRYSTALS-DILITHIUM来生成和验证这些签名,并使用Bouncy Castle's .NET library v2.2.0来实现算法。
我如何:
1.生成新密钥对
1.使用私钥对消息签名
1.使用公钥验证消息
以下是我目前为止的示例代码:
请注意,有些项目(如new DilithiumPrivateKeyParameters(...)
的参数)丢失了,因为我不知道应该在那里放什么。
public static void Generate ()
{
DilithiumKeyPairGenerator generator = new DilithiumKeyPairGenerator();
generator.Init(new DilithiumKeyGenerationParameters(
new SecureRandom(),
DilithiumParameters.Dilithium5Aes
));
AsymmetricCipherKeyPair keyPair = generator.GenerateKeyPair();
// All the later methods need bytes of these key - how do I get them?
AsymmetricKeyParameter publicKey = keyPair.Public;
AsymmetricKeyParameter privateKey = keyPair.Private;
}
public static void Sign ()
{
DilithiumSigner signer = new DilithiumSigner();
// What do I put in all these parameters?
signer.Init(true, new DilithiumPrivateKeyParameters(
DilithiumParameters.Dilithium5Aes,
// byte[] rho,
// byte[] K,
// byte[] tr,
// byte[] s1,
// byte[] s2,
// byte[] t1,
// byte[] t2,
));
string messageText = "Important Message!";
// Send the message and signature
byte[] message = Encoding.UTF8.GetBytes(messageText);
byte[] signature = signer.GenerateSignature(message);
}
public void Verify (byte[] publicKey, byte[] message, byte[] signature)
{
DilithiumSigner verifier = new DilithiumSigner();
// The constructor asks for "pkEncoded" - how should the bytes be encoded?
verifier.Init(false, new DilithiumPublicKeyParameters(publicKey));
bool good = verifier.VerifySignature(message, signature);
}
1条答案
按热度按时间2admgd591#
下面是一个签名和验证的工作示例--没有什么是一点类型转换不能解决的!
我发现有用的链接:
我需要将键维护为
Dilithium...KeyParameters
,而不是byte[]
s或ICypherKeyParameters
。这使我可以访问正确的Rho, K, etc.
属性和GetEncoded()
方法。