【发布时间】:2019-03-12 13:38:42
【问题描述】:
我正在使用 HSM 使用 PKCS11 命令生成一对公钥/私钥,但我需要在 BouncyCastle 中使用公钥。
我可以读取 DER 格式的属性 EC_POINT,但我不知道如何在 BouncyCastle 中导入它。
这是我的 EC_POINT 属性: CKA_EC_POINT:04-39-04-ED-48-AE-D9-F8-02-CA-80-E1-1C-F2-3D-C9-C4-7D-B4-C5-9E-D2-53-A6- FE-27-D7-12-EF-C3-7F-2D-FC-D2-D0-31-62-8F-AF-60-19-E4-33-0F-63-A7-E4-95-33- 0C-0D-D5-94-6C-92-B9-44-D8-2B
这是我的工作解决方案(感谢 Dave)
public ECPublicKeyParameters GetPubKeyFromParms(string curve, string pub) {
var pc = ToByteArray(pub);
var x9ecpar = ECNamedCurveTable.GetByName(curve);
var ecdp = new ECDomainParameters(x9ecpar.Curve, x9ecpar.G, x9ecpar.N);
var basePoint = lsEccUtilities.ValidateECPublicKey(TlsEccUtilities.DeserializeECPublicKey(null, ecdp, pc));
var subinfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(basePoint);
var publicKey = (ECPublicKeyParameters)PublicKeyFactory.CreateKey(subinfo);
return publicKey;
}
签名从PKCS11格式到BouncyCastle格式的转换:
var r = signature.Take(signature.Length / 2).ToArray();
var s = signature.Skip(signature.Length / 2).ToArray();
var dersignature = new Org.BouncyCastle.Asn1.DerSequence(
new Org.BouncyCastle.Asn1.DerInteger(new Org.BouncyCastle.Math.BigInteger(1, r)),
new Org.BouncyCastle.Asn1.DerInteger(new Org.BouncyCastle.Math.BigInteger(1, s))
).GetDerEncoded();
【问题讨论】:
-
我从未听说过任何 DER 格式的 EC 点;你能以十六进制或其他可读形式展示一个例子吗? (使用编辑按钮添加到您的 Q 中,而不是在评论中,因为可以根据 StackExchange 政策删除 cmets 中的讨论。)
-
谢谢戴夫,我编辑了我的评论。
标签: pkcs#11