该方法是使用国密进行密钥交换算法的js版本实现。实现方法详见示例项目。
步骤:
- 安装依赖包
npm i gmlog
or
pnpm i gmlog
- 导入使用
import { SM2 } from 'gmlog'
- 初始化
设置初始点坐标
p = 0x8542d69e4c044f18e8b92435bf6ff7de457283915c45517d722edb8b08f1dfc3n
a = 0x787968b4fa32c3fd2417842e73bbfeff2f3c848b6831d7e0ec65228b3937e498n
b = 0x63e4c6d3b23b0c849cf84241484bfe48f61d59a5b16ba06e6e12d1da27c5249an
n = 0x8542d69e4c044f18e8b92435bf6ff7dd297720630485628d5ae74ee7c32e79b7n
G = [0x421debd61b62eab6746434ebc3cc315e32220b3badd50bdc4c4e6c147fedd43dn, 0x0680512bcbb42c07d47349d2153b70c4e5d7fdfcbfa36ea1a85841b9e46e09a2n]
h = 1n
设置身份(也可以为空)
IDA='ALICE123@YAHOO.COM'
IDB='BOB123@YAHOO.COM'
将上面设置的椭圆曲线上的点赋值给导入的SM2
对象。
const curveParam: any[] = [
p,
a,
b,
n,
G,
h,
];
const sm = new SM2(...curveParam);
// 生成SMA
const smA = new SM2(...curveParam, IDA as any, privateKeyA, publicKeyA as any);
- 生成密钥对
A要完成密钥协商需要A的密钥对和B的临时密钥对。同理,B要完成密钥协商也要A的临时密钥对和B的密钥对。以A为例,在A这侧需要生成两个密钥对。
生成方式使用sm.genKeyPair()
方法。
生成临时密钥使用sm.agreement_initiate()
方法。
在获得临时密钥后,将临时密钥的和正式密钥的公钥都发送给B,同理A收到B的临时密钥和正式密钥的公钥后即可以开始密钥协商。
const { res: res1, content: content1 } = smA.agreement_confirm(
rKeyA.privateKey as bigint, //A的临时密钥私钥
rKeyA.publicKey as { x: bigint, y: bigint }, // A的临时密钥公钥
rKeyB.publicKey as { x: bigint, y: bigint }, // b的临时密钥公钥
publicKeyB as { x: bigint, y: bigint }, //B的正式密钥公钥
IDB, // B的ID 可为空
null,
option // 选项 可为空,取值为bool值
);
- 获取密钥协商后的密钥
let KA = null, // 密钥协商获取的密钥
SA = null;
if (option) {
KA = content1[0];
SA = content1[1];
} else {
KA = content1[0];
}
{x:bigint,y:bigint}类型的密钥类型转化为十六进制字符串使用toString(16)方法。