openssl - 将 ECC 公钥的 Bignum 转换为 JWK X, Y 坐标

标签 openssl elliptic-curve bignum jose4j jwk

我已经使用 EC_Key 在 OpenSSL 中创建了公钥和私钥,并且具有 BigNum 格式的 x、y 和 d 组件。

现在我想根据 JWK 标准将这些 Bignum 值转换为 Base64URLEncoded 值。

例如

{
 "kty":"EC",
 "crv":"P-256",
 "x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4",
 "y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM",
 "use":"enc",
 "kid":"1"
}

目前x坐标76638B4D8040018F834AE6D6540B20E1CA95F6A8C61BE6118062918904B5C5A7

在 ObjC 中使用 OpenSSL 和 JSONKit 作为

if (!bigNum) return nil;

/* converting from BIGNUM to binary */
int len = BN_num_bytes(bigNum);
unsigned char *buf = NULL;
buf = (unsigned char *) OPENSSL_malloc (len);
len = BN_bn2bin(bigNum, buf);
NSData *pubData =  [NSData dataWithBytesNoCopy:buf length:len freeWhenDone:YES];


NSString *base64EncodedString = [pubData base64EncodedString];
return [base64EncodedString stringWithBase64URLEncoding];

在转换它时,它给出 Base64URL 编码字符串 作为

x:dmOLTYBAAY-DSubWVAsg4cqV9qjGG-YRgGKRiQS1xac

但是当使用 Jose4J 在服务器上解码相同的 x 坐标时,它返回为:

53548795424402895049922051400723229099982122334687022963594437126482323424679

类似于网站上提供的: http://www.mobilefish.com/services/big_number/big_number.php

由此可知,它是BigInt的十进制表示

  1. 将 BigInt 转换为 Decimal

  2. 十进制转ASCII字符串

  3. 然后进行Base64 url​​编码。

但是在应用这个过程时,服务器不接受 JOSE4J 库中的 JWK 参数。

最佳答案

我自己没有这样做,但我认为它只是 x 和 y 值的 BN_bn2bin(),然后将结果数据转换为 base64url。 RFC 7517 附录 A 说 JWK 需要 x 和 y 的大端值(如果是私钥,则为 d),这是 BN_bn2bin 记录给您的内容。

请注意,base64url 与常规 base64 略有不同;查看 RFC 7515 附录 C,了解如何使用常规 base64 例程,然后将结果转换为 base64URL。

关于openssl - 将 ECC 公钥的 Bignum 转换为 JWK X, Y 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36639606/

相关文章:

iphone - iOS 上的 AES-256 加密不会产生与 openssl 相同的结果

ruby - 将 ssh 公钥转换为 pem 格式

Ruby/openssl:将椭圆曲线点八位字节字符串转换为 OpenSSL::PKey::EC::Point

javascript - Node 中的椭圆曲线阈值密码学

c++ - 计算一个数的大幂

c - 在 alpine 图像上构建 lua-openssl 时对 `strerror_s' 的 undefined reference

apache - 具有自签名证书链的无效 CA 证书

python - 尝试在 ECC 上添加两个点,但第三个点始终不在曲线上

javascript - Decimal.js tan 的精度问题

c++ - 是否有相当于Python的fractions.Fraction(bignum/任意精度分数/有理数类)?