我正在使用Bouncy Castle API创建密钥对,但我遇到了两个错误,可能是:
DER length more than 4 bytes: XXX或者类似这样的东西:
DEF length __ object truncated by __以下是我的代码,我正在尝试使用Google Pay的token中的临时公钥创建一个AsymmetricKeyParameter
// Decode and convert to Byte Array
byte[] ephemeralPublicKeyBytes = Base64.Decode(signedMessage["ephemeralPublicKey"]);
// Drop first byte for formatting (0x04)
ephemeralPublicKeyBytes = ephemeralPublicKeyBytes.Skip(1).ToArray();
//Create AsymmetricKeyParamter (ERROR)
AsymmetricKeyParameter pubAKP = PublicKeyFactory.CreateKey(ephemeralPublicKeyBytes);我不太确定出了什么问题。我使用的是iTextsharper,它包含Bouncy Castle的5.5.11.0API
发布于 2018-08-07 22:13:01
您正在调用的方法从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的Java /实现通常遵循C#实现,因此移植应该主要是将函数调用的第一个字母大写。
https://stackoverflow.com/questions/51714081
复制相似问题