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

时间:2016-04-15 06:20:49

标签: openssl elliptic-curve bignum jose4j jwk

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

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

e.g。

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

目前x coordinate76638B4D8040018F834AE6D6540B20E1CA95F6A8C61BE6118062918904B5C5A7

在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 encoded string作为

x:dmOLTYBAAY-DSubWVAsg4cqV9qjGG-YRgGKRiQS1xac

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

53548795424402895049922051400723229099982122334687022963594437126482323424679

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

从中可以看出它是BigInt的十进制表示

  1. 将BigInt转换为十进制

  2. 十进制到ASCII字符串

  3. 然后转到Base64网址编码。

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

1 个答案:

答案 0 :(得分:1)

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

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