#HarmonyOS NEXT体验官# 数据加密 3. 指定密钥参数生成非对称密钥对 原创
指定密钥参数生成非对称密钥对
⚫ 以RSA为例,根据指定的密钥参数,生成非对称密钥对(KeyPair),并获取
密钥参数属性。
⚫ 该对象可用于后续的加解密等操作。获取的密钥参数属性可用于存储或运输。
指定密钥参数生成非对称密钥对
⚫ 构造RSACommonParamsSpec对象,用于指定RSA算法中公私钥包含的公共参数(n)。
RSACommonParamsSpec是AsyKeySpec的子类。需要通过参数algName指定算法’RSA’;
指定密钥参数类型AsyKeySpecType.COMMON_PARAMS_SPEC,表示是公私钥中包含的公
共参数。使用密钥参数生成密钥时,用到的bigint类型需要以大端模式输入,且必须为正数。
⚫ 创建RSAPubKeySpec对象,用于指定RSA算法中公钥包含的参数(n, pk)。
RSAPubKeySpec是AsyKeySpec的子类。通过参数algName指定算法’RSA’;指定密钥参数类
型AsyKeySpecType.PUBLIC_KEY_SPEC,表示是公钥中包含的参数。
指定密钥参数生成非对称密钥对
⚫ 调用cryptoFramework.createAsyKeyGeneratorBySpec,将RSAPubKeySpec对象
传入,创建非对称密钥生成器(AsyKeyGeneratorBySpec)。
⚫ 调用AsyKeyGeneratorBySpec.generatePubKey,获得指定的公钥(PubKey)。
⚫ 调用PubKey.getAsyKeySpec,获取模数n和公钥pk(即公钥指数e)。
指定密钥参数生成非对称密钥对
import cryptoFramework from '@ohos.security.cryptoFramework';
// RSA公钥密钥参数生成函数
function genRsaPubKeySpec(nIn: bigint, eIn: bigint): cryptoFramework.RSAPubKeySpec {
let rsaCommSpec: cryptoFramework.RSACommonParamsSpec = {
n: nIn,
algName: 'RSA',
specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC
};
let rsaPubKeySpec: cryptoFramework.RSAPubKeySpec = {
params: rsaCommSpec,
pk: eIn,
algName: 'RSA',
specType: cryptoFramework.AsyKeySpecType.PUBLIC_KEY_SPEC
};
return rsaPubKeySpec;
}
指定密钥参数生成非对称密钥对
// 根据密钥参数构造RSA公钥规范对象
function genRsa2048PubKeySpec() {
let nIn =
BigInt('0x9260d0750ae117eee55c3f3deaba74917521a262ee76007cdf8
a56755ad73a1598a1408410a01434c3f5bc54a88b57fa19fc4328daea07
50a4c44e88cff3b2382621b80f670464433e4336e6d003e8cd65bff211da
144b88291c2259a00a72b711c116ef7686e8fee34e4d933c868187bdc26
f7be071493c86f7a5941c3510806ad67b0f94d88f5cf5c02a092821d8626
e8932b65c5bd8c92049c210932b7afa7ac59c0e886ae5c1edb00d8ce2c5
7633db26bd6639bff73cee82be9275c402b4cf2a4388da8cf8c64eefe1c5a
0f5ab8057c39fa5c0589c3e253f0960332300f94bea44877b588e1edbde9
7cf2360727a09b775262d7ee552b3319b9266f05a25');
let eIn = BigInt('0x010001');
return genRsaPubKeySpec(nIn, eIn);
}
指定密钥参数生成非对称密钥对
// 将RSA公钥规格与预期值进行比较
function compareRsaPubKeyBySpec(rsaKeySpec: cryptoFramework.RSAPubKeySpec, n: bigint | string
| number, e: bigint | string | number) {
if (typeof n === 'string' || typeof e === 'string') {
console.error('type is string');
return false;
}
if (typeof n === 'number' || typeof e === 'number') {
console.error('type is number');
return false;
}
if (rsaKeySpec.params.n != n) {
return false;
}
if (rsaKeySpec.pk != e) {
return false;
}
return true;
}
指定密钥参数生成非对称密钥对
// 根据RSA公钥规格生成RSA公钥,获取密钥规格,并与预期值进行比较
function rsaUsePubKeySpecGetCallback() {
let rsaPubKeySpec = genRsa2048PubKeySpec();
let rsaGeneratorSpec = cryptoFramework.createAsyKeyGeneratorBySpec(rsaPubKeySpec);
rsaGeneratorSpec.generatePubKey((error, key) => {
if (error) {
console.error('generate pubKey error' + 'error code: ' + error.code + 'error message' + error.message);
}
let pubKey = key;
let nBN = pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.RSA_N_BN);
let eBN = pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.RSA_PK_BN);
if (compareRsaPubKeyBySpec(rsaPubKeySpec, nBN, eBN) != true) {
console.error('error pub key big number.');
} else {
console.info('n, e in the pubKey are same as the spec.');
}
});
}