[英]Recreate X and Y of Elliptic curve from public key byte array
I am really new to cryptography but - what I am trying to do is get the X and Y coordinates from byte array representation of public key.我对密码学真的很陌生,但是 - 我想要做的是从公钥的字节数组表示中获取 X 和 Y 坐标。 Iam using secp256r1 curve.
我正在使用 secp256r1 曲线。
// get curve
X9ECParameters x9 = ECNamedCurveTable.GetByName("secp256r1");
ECCurve curve = x9.Curve;
// get coordinates from ASN.1 encoded public key point
var asn1 = (Asn1Sequence)Asn1Object.FromByteArray(publicKeyBytes);
var at1 = (DerBitString)asn1[1];
var bytes = at1.GetBytes();
var x = bytes.Skip(1).Take(32).Reverse().ToArray();
var y = bytes.Skip(33).Take(32).Reverse().ToArray();
// get affine X and Y using point on curve from X and Y
var ecPoint = curve.CreatePoint(new Org.BouncyCastle.Math.BigInteger(1, x), new Org.BouncyCastle.Math.BigInteger(1, y));
ECDomainParameters dParams = new ECDomainParameters(curve, ecPoint, x9.N);
ECPublicKeyParameters pubKey = new ECPublicKeyParameters(ecPoint, dParams);
var affineX = pubKey.Q.AffineXCoord.ToBigInteger().ToByteArrayUnsigned();
var affineY = pubKey.Q.AffineYCoord.ToBigInteger().ToByteArrayUnsigned();
// return a tuple of the coordinates
return (affineX, affineY);
I receive X and Y coordinates but these are probably not right.我收到 X 和 Y 坐标,但这些可能不对。 What am I doing wrong?
我究竟做错了什么? Thanks
谢谢
Ok, so, there were few issues with the code.好的,代码几乎没有问题。 Here is the version that works, maybe it will help someone
这是有效的版本,也许它会帮助某人
internal static (string x, string y) GetCertificateCoordinates(byte[] publicKeyBytes)
{
// parse based on asn1 format the content of the certificate
var asn1 = (Asn1Sequence)Asn1Object.FromByteArray(publicKeyBytes);
var at1 = (DerBitString)asn1[1];
var xyBytes = at1.GetBytes();
//retrieve preddefined parameters for P256 curve
X9ECParameters x9 = ECNamedCurveTable.GetByName("P-256");
//establish domain we will be looking for the x and y
ECDomainParameters domainParams = new ECDomainParameters(x9.Curve, x9.G, x9.N, x9.H, x9.GetSeed());
ECPublicKeyParameters publicKeyParams = new ECPublicKeyParameters(x9.Curve.DecodePoint(xyBytes), domainParams);
//get the affine x and y coordinates
var affineX = EncodeCordinate(publicKeyParams.Q.AffineXCoord.ToBigInteger());
var affineY = EncodeCordinate(publicKeyParams.Q.AffineYCoord.ToBigInteger());
return (affineX, affineY);
}
public static string EncodeCordinate(Org.BouncyCastle.Math.BigInteger integer)
{
var notPadded = integer.ToByteArray();
int bytesToOutput = (256 + 7) / 8;
if (notPadded.Length >= bytesToOutput)
return Jose.Base64Url.Encode(notPadded);
var padded = new byte[bytesToOutput];
Array.Copy(notPadded, 0, padded, bytesToOutput - notPadded.Length, notPadded.Length);
return Jose.Base64Url.Encode(padded);
}
I am using this code in android for the JWT providing X and Y to server side as jwk in header我在 android 中使用此代码作为 JWT 向服务器端提供 X 和 Y 作为标头中的 jwk
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.