加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用BouncyCastle在C#中重新创建密钥(ECPublicKeyParameters)

发布时间:2020-12-15 05:40:19 所属栏目:百科 来源:网络整理
导读:我生成一个AsymmetricCipherKeyPair,如下所示: string curveName = "P-521";X9ECParameters ecP = NistNamedCurves.GetByName(curveName);ECDomainParameters ecSpec = new ECDomainParameters(ecP.Curve,ecP.G,ecP.N,ecP.H,ecP.GetSeed());IAsymmetricCiph
我生成一个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();

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

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.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,data.Length);
    return signer.GenerateSignature();
}

虽然它感觉像一个真正的黑客,但它的工作正常.如何使用公钥执行此操作?我将变量xxx设置为(ECPublicKeyParameters)aKeyPair.Public,我可以使用下面的代码来验证签名.请注意,我可以直接使用xxx,但重点是将xxx序列化然后再输入,因此,此代码实际上会转换xxx变量并创建一个新变量,该变量存储在xx中.然后我使用xx进行验证(这表明我可以将密钥往返).

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

我原本希望能从Q.GetEncoded()创建密钥(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来验证签名.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读