我使用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 coordinate
为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 encoded string
作为
x:dmOLTYBAAY-DSubWVAsg4cqV9qjGG-YRgGKRiQS1xac
但是使用Jose4J在服务器上解码相同的x坐标时,将其返回为:
53548795424402895049922051400723229099982122334687022963594437126482323424679
与网站上提供的类似: http://www.mobilefish.com/services/big_number/big_number.php
从中可以看出它是BigInt的十进制表示
即
将BigInt转换为十进制
十进制到ASCII字符串
然后转到Base64网址编码。
但是在应用此过程时,服务器不接受JOSE4J库中的JWK参数。
答案 0 :(得分:1)
我自己没有这样做,但我认为对于x和y值只是BN_bn2bin()
,然后将结果数据转换为base64url。 RFC 7517附录A说JWK需要x和y的大端值(如果是私钥则需要d),这是BN_bn2bin记录给你的。
请注意,base64url与常规base64略有不同;请参阅RFC 7515附录C,了解如何使用常规base64例程,然后将结果转换为base64URL。