gpt4 book ai didi

c# - 使用 BouncyCaSTLe 在 C# 中重新创建 key (ECPublicKeyParameters)

转载 作者:太空狗 更新时间:2023-10-29 23:32:04 25 4
gpt4 key购买 nike

我生成一个 AsymmetricCipherKeyPair 如下:

string curveName = "P-521";
X9ECParameters ecP = NistNamedCurves.GetByName(curveName);
ECDomainParameters ecSpec = new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, ecP.GetSeed());
IAsymmetricCipherKeyPairGenerator g = GeneratorUtilities.GetKeyPairGenerator("ECDH");
g.Init(new ECKeyGenerationParameters(ecSpec, new SecureRandom()));
AsymmetricCipherKeyPair aKeyPair = g.GenerateKeyPair();

我的目的是提取公钥和私钥,然后再重建 key 。我首先提取 key 如下:

byte[] privateKey = ((ECPrivateKeyParameters)aKeyPair.Private).D.ToByteArray();
byte[] publicKey = ((ECPublicKeyParameters)aKeyPair.Public).Q.GetEncoded();

如何重新创建公钥和私钥参数以便我可以使用它们?在此示例中,我确实重新创建了私钥,然后对数据字节数组进行了签名。

public static byte[] SignData(byte[] data, byte[] privateKey)
{
string curveName = "P-521";
X9ECParameters ecP = NistNamedCurves.GetByName(curveName);
ECDomainParameters ecSpec = new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, ecP.GetSeed());
ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
BigInteger biPrivateKey = new BigInteger(privateKey);
ECPrivateKeyParameters keyParameters = new ECPrivateKeyParameters(biPrivateKey, ecSpec);
signer.Init(true, keyParameters);
signer.BlockUpdate(data, 0, data.Length);
return signer.GenerateSignature();
}

虽然它感觉像是一个真正的 hack,但它工作得很好。我怎样才能用公钥做到这一点?我将变量 xxx 设置为 (ECPublicKeyParameters)aKeyPair.Public 并且我可以使用下面的代码来验证签名。请注意,我可以直接使用 xxx,但重点是将 xxx 序列化,然后再序列化,因此,这段代码实际上确实转换了 xxx 变量并创建了一个新变量,该变量存储在 xx 中。然后我使用 xx 来验证(这表明我可以往返 key )。

var xx = PublicKeyFactory.CreateKey(Org.BouncyCastle.X509.SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(xxx).GetDerEncoded());
ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
signer.Init(false, xx);
signer.BlockUpdate(data, 0, data.Length);
return signer.VerifySignature(signature);

我曾希望我可以从 Q.GetEncoded() 创建 key (xx),类似于我为私钥所做的那样。

有没有更好的方法重建私钥?还使用 ASN.1 编码?如果是这样,也许我应该改用它。

最佳答案

我可以这样做:

string curveName = "P-521";
X9ECParameters ecP = NistNamedCurves.GetByName(curveName);
FpCurve c = (FpCurve)ecP.Curve;
ECFieldElement x = new FpFieldElement(c.Q, xxx.Q.X.ToBigInteger());
ECFieldElement y = new FpFieldElement(c.Q, xxx.Q.Y.ToBigInteger());
ECPoint q = new FpPoint(c, x, y);
ECPublicKeyParameters xxpk = new ECPublicKeyParameters("ECDH", q, SecObjectIdentifiers.SecP521r1);

然后,我可以使用xxpk 来验证签名。

免责声明:我并不是说这是最好的方法,只是说它有效!

关于c# - 使用 BouncyCaSTLe 在 C# 中重新创建 key (ECPublicKeyParameters),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17439732/

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