用于创建非对称密钥对的Bouncy Castle API

时间:2018-08-06 19:02:26

标签: c# asp.net cryptography bouncycastle

我正在使用Bouncy Castle API创建密钥对,但遇到两个错误,可能是:

def foo(var, new_value):
    var = new_value

x = 1
multiprocessing.Process(target=foo, args=(x,2))
p.start()
p.join()
print(x)

或类似的东西

print(x)

这是我的代码,我正在尝试使用Google Pay令牌中的临时公钥创建一个AsymmetricKeyParameter

DER length more than 4 bytes: XXX

我不太确定怎么了。我正在使用包含Bouncy Castle的5.5.11.0 API的iTextsharper

1 个答案:

答案 0 :(得分:0)

您正在调用的方法从SubjectPublicKeyInfo结构创建密钥。这是在X.509证书(如浏览器中用于HTTPS的证书)中找到的结构。不幸的是,那不是您所拥有的。

第一个04很可能是未压缩点格式的指示符字节,此后xy紧随其后,是两个串联的大小,无符号的,大公钥的大端序坐标。因此,在这种情况下,您需要检索特定曲线的参数,然后使用这些参数来解析点。

原则上,04也可以是八位字节字符串指示符。在这种情况下,您还需要跳过紧随其后的字节长度。或者,您也可以将其解析为ASN.1八位字节字符串并请求该值。


关于如何在Java / BC中执行此操作的一些想法-移植愉快,我没有时间。

public static ECPublicKeyParameters parseECPublicKeyPoint(String curveName, byte[] point) throws Exception {

    X9ECParameters curveParams = ECNamedCurveTable.getByName(curveName);

    ECCurve curve = curveParams.getCurve();

    // the point will be validated so it should be on the curve... if the right curve was chosen anyway
    ECPoint decodePoint = curve.decodePoint(point);

    // stupid conversion still needed for some inexplicable reason
    ECDomainParameters domainParams = new ECDomainParameters(curve, curveParams.getG(), curveParams.getN(), curveParams.getH());
    ECPublicKeyParameters ecPublicKeyParameters = new ECPublicKeyParameters(decodePoint, domainParams);

    return ecPublicKeyParameters;
}

请注意,Bouncy Castle的C#API /实现通常遵循Java实现,因此移植此代码应该主要是将函数调用的首字母大写的情况。