gpt4 book ai didi

c# - 如何在 C# 中使用 BouncyCaSTLe 的 Diffie-Hellman?

转载 作者:太空狗 更新时间:2023-10-30 00:40:18 24 4
gpt4 key购买 nike

我正在编写一个将在手机和 Windows PC 之间交换数据的应用程序,我想保护使用 Diffie-Hellman 交换生成的 key 发送的数据。

我正在尝试为此使用 BouncyCaSTLe,但几乎不存在的 C# 实现文档让我感到困惑。

我想知道的是:当收到对方 key 时,生成DH key 并计算共享 key 的工作流程是怎样的? (我假设我可以将我的 key 作为字符串发送,并且我可以将另一方的 key 作为字符串处理。)我在 C# 中为此使用哪些对象/方法?

最佳答案

好吧,经过大量的尝试,我成功了。发布答案以防其他人需要。

我假设读者 (1) 知道 Diffie-Hellman 是什么以及它的用途(阅读 here 了解详细信息)和 (2) 已经通过 NuGet 将 BouncycaSTLe 导入到 .NET 项目中。

您需要的导入:

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;

如何生成g和p:

public DHParameters GenerateParameters()
{
var generator = new DHParametersGenerator();
generator.Init(BitSize, DefaultPrimeProbability, new SecureRandom());
return generator.GenerateParameters();
}

想要将 g 和 p 作为字符串获取吗?

public string GetG(DHParameters parameters)
{
return parameters.G.ToString();
}

public string GetP(DHParameters parameters)
{
return parameters.P.ToString();
}

如何生成a和A:

public AsymmetricCipherKeyPair GenerateKeys(DHParameters parameters)
{
var keyGen = GeneratorUtilities.GetKeyPairGenerator("DH");
var kgp = new DHKeyGenerationParameters(new SecureRandom(), parameters);
keyGen.Init(kgp);
return keyGen.GenerateKeyPair();
}

想将 a 和 A 作为字符串读取吗?

// This returns A
public string GetPublicKey(AsymmetricCipherKeyPair keyPair)
{
var dhPublicKeyParameters = _generatedKey.Public as DHPublicKeyParameters;
if (dhPublicKeyParameters != null)
{
return dhPublicKeyParameters.Y.ToString();
}
throw new NullReferenceException("The key pair provided is not a valid DH keypair.");
}

// This returns a
public string GetPrivateKey(AsymmetricCipherKeyPair keyPair)
{
var dhPrivateKeyParameters = _generatedKey.Private as DHPrivateKeyParameters;
if (dhPrivateKeyParameters != null)
{
return dhPrivateKeyParameters.X.ToString();
}
throw new NullReferenceException("The key pair provided is not a valid DH keypair.");
}

要从字符串中导入参数,只需执行以下操作:

var importedParameters = new DHParameters(p, g);

要生成 b 和 B,只需使用 GenerateKeys()importedParameters 而不是生成的 parameters

假设您生成了 b 和 B,并且已经得到了 p、g 和 A。要计算共享 secret :

public BigInteger ComputeSharedSecret(string A, AsymmetricKeyParameter bPrivateKey, DHParameters internalParameters)
{
var importedKey = new DHPublicKeyParameters(new BigInteger(A), internalParameters);
var internalKeyAgree = AgreementUtilities.GetBasicAgreement("DH");
internalKeyAgree.Init(bPrivateKey);
return internalKeyAgree.CalculateAgreement(importedKey);
}

对 A 重复,现在您拥有 2 个客户端之间的共享 secret ,准备用于加密通信。

希望这是有用的。

关于c# - 如何在 C# 中使用 BouncyCaSTLe 的 Diffie-Hellman?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29089311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com