我正在使用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
答案 0 :(得分:0)
您正在调用的方法从SubjectPublicKeyInfo
结构创建密钥。这是在X.509证书(如浏览器中用于HTTPS的证书)中找到的结构。不幸的是,那不是您所拥有的。
第一个04
很可能是未压缩点格式的指示符字节,此后x
和y
紧随其后,是两个串联的大小,无符号的,大公钥的大端序坐标。因此,在这种情况下,您需要检索特定曲线的参数,然后使用这些参数来解析点。
原则上,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实现,因此移植此代码应该主要是将函数调用的首字母大写的情况。