使用 openssl 从 PEM 格式的 ecc public 密钥获取 x 和 y 组件
get x and y components from ecc public key in PEM format using openssl
我正在使用 openssl
从曲线 'secp128r1' 为 ECC 生成密钥对
我遵循的步骤:
首先我使用命令
生成了私钥
openssl ecparam -genkey -name secp128r1 -noout -out private.pem
然后我使用命令
查看了对应的public键
openssl ec -in private.pem -text -noout
显示输出为:
read EC key
Private-Key: (128 bit)
priv:
00:9f:bf:2b:bd:06:86:3a:a1:bc:7c:3e:90:57:40:
f4:bc
pub:
04:04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:
3f:ed:5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:
30:a8:a5
ASN1 OID: secp128r1
我想从这里生成的 public 密钥中明确地得到 x 和 y 分量,请问有人可以建议正确的方法吗?
上面的 public 密钥是 264 位长,因此不能按原样使用(/拆分)它
谢谢
Pub:
04:04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:
3f:ed:5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:
30:a8:a5
0x04
表示uncompressed form
- 从剩下的:
- X 是上半场
04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:3f:ed
- Y 是下半场
5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:30:a8:a5
UPD.
发现 this website 包含更多详细信息。
如果有人想在 nodejs 中这样做,就像我在需要共享 public 密钥 (jwk) 给其他人 people/apps 以验证我的签名时所做的那样...这是一个快速的方法从 secp256k1 public 密钥导出 X 和 Y 坐标:
import base64url from 'base64url';
function getCoordinatesFromSecp256k1PublicKey(uncompressedHexPubKey: string) {
const publicKeyBuff = Buffer.from(uncompressedHexPubKey, 'hex');
const pubKeyCoordsBuff = publicKeyBuff.slice(1); // First byte just signals that it is uncompressed. TRASH!
const halfLen = Buffer.byteLength(pubKeyCoordsBuff) / 2; // should be 32;
const x = pubKeyCoordsBuff.slice(0, halfLen);
const y = pubKeyCoordsBuff.slice(halfLen, Buffer.byteLength(pubKeyCoordsBuff) + 1);
return {
x: base64url.fromBase64(x.toString('base64')),
y: base64url.fromBase64(y.toString('base64'))
};
}
这样您就可以 return 您的 JWK 数据:
const { x, y } = getCoordinatesFromSecp256k1PublicKey(pubKey);
JSON.stringify(
{
use: 'sig',
kid: 'my-keyid',
alg: 'ECDSA',
kty: 'EC',
crv: 'P-256',
x,
y,
},
null,
2
)
我正在使用 openssl
从曲线 'secp128r1' 为 ECC 生成密钥对我遵循的步骤:
首先我使用命令
生成了私钥openssl ecparam -genkey -name secp128r1 -noout -out private.pem
然后我使用命令
查看了对应的public键openssl ec -in private.pem -text -noout
显示输出为:
read EC key
Private-Key: (128 bit)
priv:
00:9f:bf:2b:bd:06:86:3a:a1:bc:7c:3e:90:57:40:
f4:bc
pub:
04:04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:
3f:ed:5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:
30:a8:a5
ASN1 OID: secp128r1
我想从这里生成的 public 密钥中明确地得到 x 和 y 分量,请问有人可以建议正确的方法吗?
上面的 public 密钥是 264 位长,因此不能按原样使用(/拆分)它
谢谢
Pub:
04:04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:
3f:ed:5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:
30:a8:a5
0x04
表示uncompressed form- 从剩下的:
- X 是上半场
04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:3f:ed
- Y 是下半场
5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:30:a8:a5
- X 是上半场
UPD. 发现 this website 包含更多详细信息。
如果有人想在 nodejs 中这样做,就像我在需要共享 public 密钥 (jwk) 给其他人 people/apps 以验证我的签名时所做的那样...这是一个快速的方法从 secp256k1 public 密钥导出 X 和 Y 坐标:
import base64url from 'base64url';
function getCoordinatesFromSecp256k1PublicKey(uncompressedHexPubKey: string) {
const publicKeyBuff = Buffer.from(uncompressedHexPubKey, 'hex');
const pubKeyCoordsBuff = publicKeyBuff.slice(1); // First byte just signals that it is uncompressed. TRASH!
const halfLen = Buffer.byteLength(pubKeyCoordsBuff) / 2; // should be 32;
const x = pubKeyCoordsBuff.slice(0, halfLen);
const y = pubKeyCoordsBuff.slice(halfLen, Buffer.byteLength(pubKeyCoordsBuff) + 1);
return {
x: base64url.fromBase64(x.toString('base64')),
y: base64url.fromBase64(y.toString('base64'))
};
}
这样您就可以 return 您的 JWK 数据:
const { x, y } = getCoordinatesFromSecp256k1PublicKey(pubKey);
JSON.stringify(
{
use: 'sig',
kid: 'my-keyid',
alg: 'ECDSA',
kty: 'EC',
crv: 'P-256',
x,
y,
},
null,
2
)