在 C# 中导入 ECC 密钥

本文关键字:ECC 密钥 导入 | 更新日期: 2023-09-27 18:33:17

我正在尝试在 C# 中导入私有和公共签名密钥。它们都是椭圆曲线secp521。公钥如下所示:

-----BEGIN PUBLIC KEY-----
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA7WeRuZKFy1T3i4kmoNY2xAaWwAu7YI6aZUvWg/Hm
7Tf+0n7StfGtHlf0jkMLLtjF1Yv1FCKOGlJ+vIt0K1hI9wkA2BjmrjpMUqplBkmRklDOp5TEF9ss
laaPkr0wWf3WdmwvGTNIP1R3uvbSTEgvI02VS4Bz/f8Z4qzf3ZbAsBcLzBc=
-----END PUBLIC KEY-----

已尝试使用以下命令导入:

pubkey = pubkey.Substring(27, pubkey.Length-27-25); // remove wrapping
byte[] pkcs8Blob = Base64.Decode(pubkey);
CngKey k = CngKey.Import(pkcs8Blob, CngKeyBlobFormat.EccPublicBlob);

但这给了我错误"参数不正确",仅此而已。任何人都有一个想法,如何解决这个问题?

更新:意识到只有私钥是 pkcs8,所以现在尝试这样做:

X509Certificate cert = new X509Certificate(pkcs8Blob);

在Java中,它是这样完成的:

X509EncodedKeySpec spec = new X509EncodedKeySpec(pkcs8Blob);
KeyFactory fact = KeyFactory.getInstance(algorithm, "SC");
ECPublicKey pubKey = (ECPublicKey) fact.generatePublic(spec);

在 C# 中导入 ECC 密钥

如果开头没有'n,则更改:

pubkey = pubkey.Substring(27, pubkey.Length-27-25);

对此:

pubkey = pubkey.Substring(26, pubkey.Length-26-25);

有了27,第一个字符就会被切断。