RFC 中有一个 RSA 密钥:
https://www.rfc-editor.org/rfc/rfc7516#appendix-A.1
{"kty":"RSA",
"n":"oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUW
cJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3S
psk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2a
sbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMS
tPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2dj
YgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw",
"e":"AQAB",
"d":"kLdtIj6GbDks_ApCSTYQtelcNttlKiOyPzMrXHeI-yk1F7-kpDxY4-WY5N
WV5KntaEeXS1j82E375xxhWMHXyvjYecPT9fpwR_M9gV8n9Hrh2anTpTD9
3Dt62ypW3yDsJzBnTnrYu1iwWRgBKrEYY46qAZIrA2xAwnm2X7uGR1hghk
qDp0Vqj3kbSCz1XyfCs6_LehBwtxHIyh8Ripy40p24moOAbgxVw3rxT_vl
t3UVe4WO3JkJOzlpUf-KTVI2Ptgm-dARxTEtE-id-4OJr0h-K-VFs3VSnd
VTIznSxfyrj8ILL6MG_Uv8YAu7VILSB3lOW085-4qE3DzgrTjgyQ",
"p":"1r52Xk46c-LsfB5P442p7atdPUrxQSy4mti_tZI3Mgf2EuFVbUoDBvaRQ-
SWxkbkmoEzL7JXroSBjSrK3YIQgYdMgyAEPTPjXv_hI2_1eTSPVZfzL0lf
fNn03IXqWF5MDFuoUYE0hzb2vhrlN_rKrbfDIwUbTrjjgieRbwC6Cl0",
"q":"wLb35x7hmQWZsWJmB_vle87ihgZ19S8lBEROLIsZG4ayZVe9Hi9gDVCOBm
UDdaDYVTSNx_8Fyw1YYa9XGrGnDew00J28cRUoeBB_jKI1oma0Orv1T9aX
IWxKwd4gvxFImOWr3QRL9KEBRzk2RatUBnmDZJTIAfwTs0g68UZHvtc",
"dp":"ZK-YwE7diUh0qR1tR7w8WHtolDx3MZ_OTowiFvgfeQ3SiresXjm9gZ5KL
hMXvo-uz-KUJWDxS5pFQ_M0evdo1dKiRTjVw_x4NyqyXPM5nULPkcpU827
rnpZzAJKpdhWAgqrXGKAECQH0Xt4taznjnd_zVpAmZZq60WPMBMfKcuE",
"dq":"Dq0gfgJ1DdFGXiLvQEZnuKEN0UUmsJBxkjydc3j4ZYdBiMRAy86x0vHCj
ywcMlYYg4yoC4YZa9hNVcsjqA3FeiL19rk8g6Qn29Tt0cj8qqyFpz9vNDB
UfCAiJVeESOjJDZPYHdHY8v1b-o-Z2X5tvLx-TCekf7oxyeKDUqKWjis",
"qi":"VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8-ZW1FxU7
AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E3
eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY"
}
我已经尝试过
jwk-to-pem
:
https://stackoverflow.com/a/35995690/4742108
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAoahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E+BVvxkeDNjbC4
he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3S
psk/ZkoFnilakGygTwpZ3uesH+PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenS
ZeyaxziK72UwxrrKoExv6kc5twXTq4h+QChLOln0/mtUZwfsRaMStPs6mS6Xrgxn
xbWhojf663tuEQueGC+FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR/MB/4NUJW/T
qOQtwHYbxevoJArm+L5StowjzGy+/bq6GwIDAQAB
-----END RSA PUBLIC KEY-----
还必须将“RSA PUBLIC KEY”替换为“PUBLIC KEY”。
命令
openssl rsa -inform PEM -pubin
给出:
unable to load Public Key
139911798556312:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1197:
139911798556312:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:374:Type=X509_ALGOR
139911798556312:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:697:Field=algor, Type=X509_PUBKEY
139911798556312:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:83:
如何获得可用的密钥?
我开发了一个 PHP 类,能够将公钥/私钥从 JWK 转换为 PEM(反之亦然)。
基本上,您必须将每个组件从 Base64UrlSafe 解码为二进制字符串,并根据 RFC3447 中描述的 ASN.1 结构组装所有组件。
尽管如此,我建议您使用专用的库/工具来简化您的工作。 使用我的 PHP 库,您的代码将如下所示:
use Jose\KeyConverter\RSAKey;
$key = new RSAKey([
"kty" => "RSA",
"n" => "oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw",
"e" => "AQAB",
"d" => "kLdtIj6GbDks_ApCSTYQtelcNttlKiOyPzMrXHeI-yk1F7-kpDxY4-WY5NWV5KntaEeXS1j82E375xxhWMHXyvjYecPT9fpwR_M9gV8n9Hrh2anTpTD93Dt62ypW3yDsJzBnTnrYu1iwWRgBKrEYY46qAZIrA2xAwnm2X7uGR1hghkqDp0Vqj3kbSCz1XyfCs6_LehBwtxHIyh8Ripy40p24moOAbgxVw3rxT_vlt3UVe4WO3JkJOzlpUf-KTVI2Ptgm-dARxTEtE-id-4OJr0h-K-VFs3VSndVTIznSxfyrj8ILL6MG_Uv8YAu7VILSB3lOW085-4qE3DzgrTjgyQ",
"p" => "1r52Xk46c-LsfB5P442p7atdPUrxQSy4mti_tZI3Mgf2EuFVbUoDBvaRQ-SWxkbkmoEzL7JXroSBjSrK3YIQgYdMgyAEPTPjXv_hI2_1eTSPVZfzL0lffNn03IXqWF5MDFuoUYE0hzb2vhrlN_rKrbfDIwUbTrjjgieRbwC6Cl0",
"q" => "wLb35x7hmQWZsWJmB_vle87ihgZ19S8lBEROLIsZG4ayZVe9Hi9gDVCOBmUDdaDYVTSNx_8Fyw1YYa9XGrGnDew00J28cRUoeBB_jKI1oma0Orv1T9aXIWxKwd4gvxFImOWr3QRL9KEBRzk2RatUBnmDZJTIAfwTs0g68UZHvtc",
"dp" => "ZK-YwE7diUh0qR1tR7w8WHtolDx3MZ_OTowiFvgfeQ3SiresXjm9gZ5KLhMXvo-uz-KUJWDxS5pFQ_M0evdo1dKiRTjVw_x4NyqyXPM5nULPkcpU827rnpZzAJKpdhWAgqrXGKAECQH0Xt4taznjnd_zVpAmZZq60WPMBMfKcuE",
"dq" => "Dq0gfgJ1DdFGXiLvQEZnuKEN0UUmsJBxkjydc3j4ZYdBiMRAy86x0vHCjywcMlYYg4yoC4YZa9hNVcsjqA3FeiL19rk8g6Qn29Tt0cj8qqyFpz9vNDBUfCAiJVeESOjJDZPYHdHY8v1b-o-Z2X5tvLx-TCekf7oxyeKDUqKWjis",
"qi" => "VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8-ZW1FxU7AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E3eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY",
]);
$pem = $key->toPEM();
因此,您发布的密钥是公钥和公共指数的简单 asn 序列。它看起来像这样:
SEQUENCE ::= {
n Integer,
e Integer
}
OpenSSL 不喜欢这样,因为它缺少一些其他东西,比如 ObjectIdenifier,以便 openssl 知道密钥用于什么算法。
解决此问题的快速方法是同时添加
-RSAPublicKey_in
选项,因此完整命令将如下所示:
openssl rsa -inform pem -in FILEPATH.pem -pubin -pubout -RSAPublicKey_in
并将文件头更改回包含“RSA”:
-----BEGIN RSA PUBLIC KEY-----
以及页脚:
-----END RSA PUBLIC KEY-----
这还将其输出为“正常”公钥格式,其中包括缺少的对象标识符。
注意:我不确定
-RSAPublicKey_in
的版本要求是什么,但我使用的是 OpenSSL 1.1.0。
我编写了一个名为 lokey 的命令行工具来帮助进行像这样的密钥转换。
使用
curl
、grep
和tr
从问题中获取密钥,我们可以使用以下命令将JWK格式的私钥转换为PEM格式的私钥:
$ curl -s https://tools.ietf.org/rfc/rfc7516.txt | grep '"n":"oahUI' -B1 -A28 | tr -d '[:space:]' | lokey to pem
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAoahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E+BVvxkeDN
jbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2K
rf3Spsk/ZkoFnilakGygTwpZ3uesH+PFABNIUYpOiN15dsQRkgr0vEhxN92i2asb
OenSZeyaxziK72UwxrrKoExv6kc5twXTq4h+QChLOln0/mtUZwfsRaMStPs6mS6X
rgxnxbWhojf663tuEQueGC+FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR/MB/4NU
JW/TqOQtwHYbxevoJArm+L5StowjzGy+/bq6GwIDAQABAoIBAQCQt20iPoZsOSz8
CkJJNhC16Vw222UqI7I/Mytcd4j7KTUXv6SkPFjj5Zjk1ZXkqe1oR5dLWPzYTfvn
HGFYwdfK+Nh5w9P1+nBH8z2BXyf0euHZqdOlMP3cO3rbKlbfIOwnMGdOeti7WLBZ
GAEqsRhjjqoBkisDbEDCebZfu4ZHWGCGSoOnRWqPeRtILPVfJ8Kzr8t6EHC3EcjK
HxGKnLjSnbiag4BuDFXDevFP++W3dRV7hY7cmQk7OWlR/4pNUjY+2Cb50BHFMS0T
6J37g4mvSH4r5UWzdVKd1VMjOdLF/KuPwgsvowb9S/xgC7tUgtIHeU5bTzn7ioTc
POCtOODJAoGBANa+dl5OOnPi7HweT+ONqe2rXT1K8UEsuJrYv7WSNzIH9hLhVW1K
Awb2kUPklsZG5JqBMy+yV66EgY0qyt2CEIGHTIMgBD0z417/4SNv9Xk0j1WX8y9J
X3zZ9NyF6lheTAxbqFGBNIc29r4a5Tf6yq23wyMFG06444InkW8AugpdAoGBAMC2
9+ce4ZkFmbFiZgf75XvO4oYGdfUvJQRETiyLGRuGsmVXvR4vYA1QjgZlA3Wg2FU0
jcf/BcsNWGGvVxqxpw3sNNCdvHEVKHgQf4yiNaJmtDq79U/WlyFsSsHeIL8RSJjl
q90ES/ShAUc5NkWrVAZ5g2SUyAH8E7NIOvFGR77XAoGAZK+YwE7diUh0qR1tR7w8
WHtolDx3MZ/OTowiFvgfeQ3SiresXjm9gZ5KLhMXvo+uz+KUJWDxS5pFQ/M0evdo
1dKiRTjVw/x4NyqyXPM5nULPkcpU827rnpZzAJKpdhWAgqrXGKAECQH0Xt4taznj
nd/zVpAmZZq60WPMBMfKcuECgYAOrSB+AnUN0UZeIu9ARme4oQ3RRSawkHGSPJ1z
ePhlh0GIxEDLzrHS8cKPLBwyVhiDjKgLhhlr2E1VyyOoDcV6IvX2uTyDpCfb1O3R
yPyqrIWnP280MFR8ICIlV4RI6MkNk9gd0djy/Vv6j5nZfm28vH5MJ6R/ujHJ4oNS
opaOKwKBgFSDKTGGz3+O3U9cP8w1F3z4prEnoJzDgNc02l+2hpP/Lq2OkfPmVtRc
VOwJVgMi1sm6qurdelRXe4UHdMun5VCuEpTsnQetYMGpzrFxjgDr/NnB6tBN3i+B
67WZFLir5z6zJ7FFBZX1Hcm1c8co8/SRf18mmNeGq3S0o3+C/xTW
-----END RSA PRIVATE KEY-----
lokey 还有一个
fetch
命令,可用于从 OpenID 端点获取 JWK 密钥:
$ lokey fetch jwk example.okta.com
$ lokey fetch jwk login.salesforce.com
$ lokey fetch jwk accounts.google.com
然后您可以再次将此输出通过管道传输到
lokey
以获得 PEM:
$ lokey fetch jwk example.okta.com | lokey to pem
一些将 JWK 转换为 PEM 的 Python 代码
import jwt
from cryptography.hazmat.primitives import serialization
def GetClaim(webtoken):
webkey = 'insert jwk here'
public_key = jwt.algorithms.RSAAlgorithm.from_jwk(webkey)
pubk_bytes = public_key.public_bytes(encoding=serialization.Encoding.PEM,format=serialization.PublicFormat.SubjectPublicKeyInfo)
claim = jwt.decode(webtoken, pubk_bytes, algorithms=['RS256'])
return claim
我编写了一个 Swift 库,它能够将公钥/私钥从 JWK 转换为 PEM PKCS#8 编码。
您可以通过以下方式使用它:
import JWKTransform
let key = try RSAKey(jwk: token)
let publicPem = try key.getPublicKey()
let privatePem = try key.getPrivateKey()
关于实际的 JWK,您包含的 RSA 字段的含义如下:
n
:Base64 URL编码字符串,代表RSA密钥的modulus
。e
:Base64 URL编码字符串,代表RSA密钥的public exponent
。d
:Base64 URL编码字符串,代表RSA密钥的private exponent
。p
:Base64 URL编码字符串,代表RSA密钥的secret prime factor
。q
:Base64 URL编码字符串,代表RSA密钥的secret prime factor
。dp
:Base64 URL编码字符串,代表RSA密钥的first factor CRT exponent
。 d mod (p-1)
dq
:Base64 URL编码字符串,代表RSA密钥的second factor CRT exponent
。 d mod (q-1)
qi
:Base64 URL编码字符串,代表RSA密钥的first CRT coefficient
。 q^-1 mod p
我在每个参数旁边都包含了 OpenSSL RSA 结构中的相应字段。这仅适用于您想直接处理 OpenSSL 的情况:-)
另请注意,如果将使用引用的库生成的密钥与 OpenSSL 生成的 RSA 密钥进行比较:
public key:
该库应该生成 OpenSSL 生成的公钥。private key:
RSA 私钥仅需要 q
,但当提供上述其余值时,RSA 操作通常要快得多。 OpenSSL 生成的 RSA 私钥文件包含这些值。因此,如果未提供所有私有参数,则生成的私钥可能与生成的原始 OpenSSL 不完全匹配。使用该库,您需要在 JS 中指定它的私钥
const private_pem = jwkToPem(jwk, {private: true})
privkey.asn1
asn1=SEQUENCE:privkeyinfo
[privkeyinfo]
version=INTEGER:0
algorithm=SEQUENCE:rsa_alg
key=OCTWRAP,SEQUENCE:rsaprivkey
[rsa_alg]
algorithm=OID:rsaEncryption
parameter=NULL
[rsaprivkey]
version=INTEGER:0
# modulus
n=INTEGER:0xa1a8542285b0d0ad2eb0a36e391e87e3091fe280545c74f146f81be3c13e055bf191e0cd8db0b885ef2b516709a1999db3687b33bd22984561454e5d8c8357b6a9655c8e0316a708d438234fd2dec0d0fc316d8aadfdd2a6c93f664a059e295a906ca04f0a59dee7ac1fe3c5001348518a4e88dd7976c411920af4bc487137dda2d9ab1b39e9d265ec9ac7388aef6530c6bacaa04c6fea4739b705d3ab887e40284b3a59f4fe6b546707ec45a312b4fb3a992e97ae0c67c5b5a1a237faeb7b6e110b9e182f8508c7eb6b7e82f649c3146ccab0d6bb2d92b6763620c83dc947f301ff8354256fd3a8e42dc0761bc5ebe8240ae6f8be52b68c23cc6cbefdbaba1b
# publicExponent
e=INTEGER:0x010001
# privateExponent
d=INTEGER:0xa1a8542285b0d0ad2eb0a36e391e87e3091fe280545c74f146f81be3c13e055bf191e0cd8db0b885ef2b516709a1999db3687b33bd22984561454e5d8c8357b6a9655c8e0316a708d438234fd2dec0d0fc316d8aadfdd2a6c93f664a059e295a906ca04f0a59dee7ac1fe3c5001348518a4e88dd7976c411920af4bc487137dda2d9ab1b39e9d265ec9ac7388aef6530c6bacaa04c6fea4739b705d3ab887e40284b3a59f4fe6b546707ec45a312b4fb3a992e97ae0c67c5b5a1a237faeb7b6e110b9e182f8508c7eb6b7e82f649c3146ccab0d6bb2d92b6763620c83dc947f301ff8354256fd3a8e42dc0761bc5ebe8240ae6f8be52b68c23cc6cbefdbaba1b
# prime1
p=INTEGER:0xd6be765e4e3a73e2ec7c1e4fe38da9edab5d3d4af1412cb89ad8bfb592373207f612e1556d4a0306f69143e496c646e49a81332fb257ae84818d2acadd821081874c8320043d33e35effe1236ff579348f5597f32f495f7cd9f4dc85ea585e4c0c5ba85181348736f6be1ae537facaadb7c323051b4eb8e38227916f00ba0a5d
# prime2
q=INTEGER:0xc0b6f7e71ee1990599b1626607fbe57bcee2860675f52f2504444e2c8b191b86b26557bd1e2f600d508e06650375a0d855348dc7ff05cb0d5861af571ab1a70dec34d09dbc71152878107f8ca235a266b43abbf54fd697216c4ac1de20bf114898e5abdd044bf4a10147393645ab540679836494c801fc13b3483af14647bed7
# exponent1
dp=INTEGER:0x64af98c04edd894874a91d6d47bc3c587b68943c77319fce4e8c2216f81f790dd28ab7ac5e39bd819e4a2e1317be8faecfe2942560f14b9a4543f3347af768d5d2a24538d5c3fc78372ab25cf3399d42cf91ca54f36eeb9e96730092a976158082aad718a0040901f45ede2d6b39e39ddff3569026659abad163cc04c7ca72e1
# exponent2
dq=INTEGER:0x0ead207e02750dd1465e22ef404667b8a10dd14526b09071923c9d7378f865874188c440cbceb1d2f1c28f2c1c325618838ca80b86196bd84d55cb23a80dc57a22f5f6b93c83a427dbd4edd1c8fcaaac85a73f6f3430547c202225578448e8c90d93d81dd1d8f2fd5bfa8f99d97e6dbcbc7e4c27a47fba31c9e28352a2968e2b
# coefficient
qi=INTEGER:0x5483293186cf7f8edd4f5c3fcc35177cf8a6b127a09cc380d734da5fb68693ff2ead8e91f3e656d45c54ec09560322d6c9baaaeadd7a54577b850774cba7e550ae1294ec9d07ad60c1a9ceb1718e00ebfcd9c1ead04dde2f81ebb59914b8abe73eb327b1450595f51dc9b573c728f3f4917f5f2698d786ab74b4a37f82ff14d6
openssl asn1parse -genconf privkey.asn1 -out privkey.der -noout -inform der
privkey.der
内容openssl rsa -in privkey.der -inform der -text -noout
RSA Private-Key: (2048 bit, 2 primes)
modulus:
00:a1:a8:54:22:85:b0:d0:ad:2e:b0:a3:6e:39:1e:
87:e3:09:1f:e2:80:54:5c:74:f1:46:f8:1b:e3:c1:
3e:05:5b:f1:91:e0:cd:8d:b0:b8:85:ef:2b:51:67:
09:a1:99:9d:b3:68:7b:33:bd:22:98:45:61:45:4e:
5d:8c:83:57:b6:a9:65:5c:8e:03:16:a7:08:d4:38:
23:4f:d2:de:c0:d0:fc:31:6d:8a:ad:fd:d2:a6:c9:
3f:66:4a:05:9e:29:5a:90:6c:a0:4f:0a:59:de:e7:
ac:1f:e3:c5:00:13:48:51:8a:4e:88:dd:79:76:c4:
11:92:0a:f4:bc:48:71:37:dd:a2:d9:ab:1b:39:e9:
d2:65:ec:9a:c7:38:8a:ef:65:30:c6:ba:ca:a0:4c:
6f:ea:47:39:b7:05:d3:ab:88:7e:40:28:4b:3a:59:
f4:fe:6b:54:67:07:ec:45:a3:12:b4:fb:3a:99:2e:
97:ae:0c:67:c5:b5:a1:a2:37:fa:eb:7b:6e:11:0b:
9e:18:2f:85:08:c7:eb:6b:7e:82:f6:49:c3:14:6c:
ca:b0:d6:bb:2d:92:b6:76:36:20:c8:3d:c9:47:f3:
01:ff:83:54:25:6f:d3:a8:e4:2d:c0:76:1b:c5:eb:
e8:24:0a:e6:f8:be:52:b6:8c:23:cc:6c:be:fd:ba:
ba:1b
publicExponent: 65537 (0x10001)
privateExponent:
00:a1:a8:54:22:85:b0:d0:ad:2e:b0:a3:6e:39:1e:
87:e3:09:1f:e2:80:54:5c:74:f1:46:f8:1b:e3:c1:
3e:05:5b:f1:91:e0:cd:8d:b0:b8:85:ef:2b:51:67:
09:a1:99:9d:b3:68:7b:33:bd:22:98:45:61:45:4e:
5d:8c:83:57:b6:a9:65:5c:8e:03:16:a7:08:d4:38:
23:4f:d2:de:c0:d0:fc:31:6d:8a:ad:fd:d2:a6:c9:
3f:66:4a:05:9e:29:5a:90:6c:a0:4f:0a:59:de:e7:
ac:1f:e3:c5:00:13:48:51:8a:4e:88:dd:79:76:c4:
11:92:0a:f4:bc:48:71:37:dd:a2:d9:ab:1b:39:e9:
d2:65:ec:9a:c7:38:8a:ef:65:30:c6:ba:ca:a0:4c:
6f:ea:47:39:b7:05:d3:ab:88:7e:40:28:4b:3a:59:
f4:fe:6b:54:67:07:ec:45:a3:12:b4:fb:3a:99:2e:
97:ae:0c:67:c5:b5:a1:a2:37:fa:eb:7b:6e:11:0b:
9e:18:2f:85:08:c7:eb:6b:7e:82:f6:49:c3:14:6c:
ca:b0:d6:bb:2d:92:b6:76:36:20:c8:3d:c9:47:f3:
01:ff:83:54:25:6f:d3:a8:e4:2d:c0:76:1b:c5:eb:
e8:24:0a:e6:f8:be:52:b6:8c:23:cc:6c:be:fd:ba:
ba:1b
prime1:
00:d6:be:76:5e:4e:3a:73:e2:ec:7c:1e:4f:e3:8d:
a9:ed:ab:5d:3d:4a:f1:41:2c:b8:9a:d8:bf:b5:92:
37:32:07:f6:12:e1:55:6d:4a:03:06:f6:91:43:e4:
96:c6:46:e4:9a:81:33:2f:b2:57:ae:84:81:8d:2a:
ca:dd:82:10:81:87:4c:83:20:04:3d:33:e3:5e:ff:
e1:23:6f:f5:79:34:8f:55:97:f3:2f:49:5f:7c:d9:
f4:dc:85:ea:58:5e:4c:0c:5b:a8:51:81:34:87:36:
f6:be:1a:e5:37:fa:ca:ad:b7:c3:23:05:1b:4e:b8:
e3:82:27:91:6f:00:ba:0a:5d
prime2:
00:c0:b6:f7:e7:1e:e1:99:05:99:b1:62:66:07:fb:
e5:7b:ce:e2:86:06:75:f5:2f:25:04:44:4e:2c:8b:
19:1b:86:b2:65:57:bd:1e:2f:60:0d:50:8e:06:65:
03:75:a0:d8:55:34:8d:c7:ff:05:cb:0d:58:61:af:
57:1a:b1:a7:0d:ec:34:d0:9d:bc:71:15:28:78:10:
7f:8c:a2:35:a2:66:b4:3a:bb:f5:4f:d6:97:21:6c:
4a:c1:de:20:bf:11:48:98:e5:ab:dd:04:4b:f4:a1:
01:47:39:36:45:ab:54:06:79:83:64:94:c8:01:fc:
13:b3:48:3a:f1:46:47:be:d7
exponent1:
64:af:98:c0:4e:dd:89:48:74:a9:1d:6d:47:bc:3c:
58:7b:68:94:3c:77:31:9f:ce:4e:8c:22:16:f8:1f:
79:0d:d2:8a:b7:ac:5e:39:bd:81:9e:4a:2e:13:17:
be:8f:ae:cf:e2:94:25:60:f1:4b:9a:45:43:f3:34:
7a:f7:68:d5:d2:a2:45:38:d5:c3:fc:78:37:2a:b2:
5c:f3:39:9d:42:cf:91:ca:54:f3:6e:eb:9e:96:73:
00:92:a9:76:15:80:82:aa:d7:18:a0:04:09:01:f4:
5e:de:2d:6b:39:e3:9d:df:f3:56:90:26:65:9a:ba:
d1:63:cc:04:c7:ca:72:e1
exponent2:
0e:ad:20:7e:02:75:0d:d1:46:5e:22:ef:40:46:67:
b8:a1:0d:d1:45:26:b0:90:71:92:3c:9d:73:78:f8:
65:87:41:88:c4:40:cb:ce:b1:d2:f1:c2:8f:2c:1c:
32:56:18:83:8c:a8:0b:86:19:6b:d8:4d:55:cb:23:
a8:0d:c5:7a:22:f5:f6:b9:3c:83:a4:27:db:d4:ed:
d1:c8:fc:aa:ac:85:a7:3f:6f:34:30:54:7c:20:22:
25:57:84:48:e8:c9:0d:93:d8:1d:d1:d8:f2:fd:5b:
fa:8f:99:d9:7e:6d:bc:bc:7e:4c:27:a4:7f:ba:31:
c9:e2:83:52:a2:96:8e:2b
coefficient:
54:83:29:31:86:cf:7f:8e:dd:4f:5c:3f:cc:35:17:
7c:f8:a6:b1:27:a0:9c:c3:80:d7:34:da:5f:b6:86:
93:ff:2e:ad:8e:91:f3:e6:56:d4:5c:54:ec:09:56:
03:22:d6:c9:ba:aa:ea:dd:7a:54:57:7b:85:07:74:
cb:a7:e5:50:ae:12:94:ec:9d:07:ad:60:c1:a9:ce:
b1:71:8e:00:eb:fc:d9:c1:ea:d0:4d:de:2f:81:eb:
b5:99:14:b8:ab:e7:3e:b3:27:b1:45:05:95:f5:1d:
c9:b5:73:c7:28:f3:f4:91:7f:5f:26:98:d7:86:ab:
74:b4:a3:7f:82:ff:14:d6