Java JWT ES256 base64编码EC密钥

Java JWT ES256 base64编码EC密钥,java,base64,elliptic-curve,jwk,acme,Java,Base64,Elliptic Curve,Jwk,Acme,当我尝试base64urlencode我的公钥x和y(ES256)与JSON Web令牌一起使用时,我遇到了填充问题 我将x和y作为字符串,键都是64个字符长(64十六进制字符=32字节=256位),这是ES256的正确长度。当我尝试转换JSON Web令牌中使用的密钥时,一定有一些填充错误(?),因为base64urlencoded版本应该是32个八位字节。然而,y是33个八位字节长 我假设问题在于biginger转换,但我不确定如何验证这个猜测或如何解决它 public void test(

当我尝试
base64urlencode
我的公钥
x
y
(ES256)与JSON Web令牌一起使用时,我遇到了填充问题

我将
x
y
作为字符串,键都是64个字符长(
64十六进制字符=32字节=256位
),这是ES256的正确长度。当我尝试转换JSON Web令牌中使用的密钥时,一定有一些填充错误(?),因为base64urlencoded版本应该是32个八位字节。然而,y是33个八位字节长

我假设问题在于
biginger
转换,但我不确定如何验证这个猜测或如何解决它

public void test() {
    String pubX = "588ba2025dc9d8ce31f3dd55aa38f2635947cda89f97864405bfa1dbe0fae57c";
    String pubY = "a2ea7858b8276917f18b043486d7f55d18241b1bd34c66a4ab507fa259c9798a";

    System.out.println("pubX.length=" + pubX.length());
    System.out.println("pubY.length=" + pubY.length());

    String x = encodeBase64(new BigInteger(pubX, 16).toByteArray());
    String y = encodeBase64(new BigInteger(pubY, 16).toByteArray());

    System.out.println("x="+x);
    System.out.println("x.length (octets)=" + java.util.Base64.getUrlDecoder().decode(x).length);
    System.out.println("y="+y);
    System.out.println("y.length (octets)=" + java.util.Base64.getUrlDecoder().decode(y).length);
}

public String encodeBase64(byte[] input) {
    // RFC7515 specifies that we must not use padding for base64urlencode
    return java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(input);
}
输出:

pubX.length=64
pubY.length=64
x=WIuiAl3J2M4x891VqjjyY1lHzaifl4ZEBb-h2-D65Xw
x.length (octets)=32
y=AKLqeFi4J2kX8YsENIbX9V0YJBsb00xmpKtQf6JZyXmK
y.length (octets)=33
上下文:我正在开发一个ACME客户端,我的消息被拒绝,错误是键的填充不正确。

未签名的值0xa2。。。在两个补码中表示为0x00a2…,由
toByteArray()
返回(您可以使用调试器轻松检查)。对于无符号表示,只需省略前导的0x00字节。在此之后,必须进行Base64url编码。或者十六进制编码字符串a2。。。可直接进行十六进制解码(例如使用)。然后必须执行Base64url编码。