harmony-utils之SM2,SM2加解密
harmony-utils 簡(jiǎn)介與說(shuō)明
[harmony-utils] 一款功能豐富且極易上手的HarmonyOS工具庫(kù),借助眾多實(shí)用工具類,致力于助力開(kāi)發(fā)者迅速構(gòu)建鴻蒙應(yīng)用。其封裝的工具涵蓋了APP、設(shè)備、屏幕、授權(quán)、通知、線程間通信、彈框、吐司、生物認(rèn)證、用戶首選項(xiàng)、拍照、相冊(cè)、掃碼、文件、日志,異常捕獲、字符、字符串、數(shù)字、集合、日期、隨機(jī)、base64、加密、解密、JSON等一系列的功能和操作,能夠滿足各種不同的開(kāi)發(fā)需求。
[picker_utils] 是harmony-utils拆分出來(lái)的一個(gè)子庫(kù),包含PickerUtil、PhotoHelper、ScanUtil。
下載安裝ohpm i @pura/harmony-utils
ohpm i @pura/picker_utils
//全局初始化方法,在UIAbility的onCreate方法中初始化 AppUtil.init()
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
AppUtil.init(this.context);
}
SM2 算法簡(jiǎn)介
SM2是由中國(guó)國(guó)家密碼管理局于2010年發(fā)布的橢圓曲線公鑰密碼算法,屬于我國(guó)商用密碼體系的核心組成部分。該算法基于橢圓曲線密碼學(xué)(ECC),采用256位密鑰長(zhǎng)度,在安全性上等同RSA-3072,但具有更高的運(yùn)算效率和更低的計(jì)算資源消耗。
作為非對(duì)稱算法,SM2支持?數(shù)字簽名?、?密鑰交換?和?公鑰加密?三大功能,其安全性依賴于橢圓曲線離散對(duì)數(shù)問(wèn)題的難解性,可抵御暴力破解和量子計(jì)算威脅。相較于RSA算法,SM2在相同安全強(qiáng)度下密鑰更短、簽名速度更快,已廣泛應(yīng)用于金融支付、電子認(rèn)證、政務(wù)系統(tǒng)及物聯(lián)網(wǎng)安全等領(lǐng)域,并成為國(guó)際標(biāo)準(zhǔn)ISO/IEC 14888-3的組成部分。
SM2 應(yīng)用場(chǎng)景
SM2 算法在我國(guó)的金融、政務(wù)、電力等關(guān)鍵領(lǐng)域有著廣泛的應(yīng)用。例如,在金融領(lǐng)域的網(wǎng)上銀行、電子支付等場(chǎng)景中,用于保障用戶身份認(rèn)證、交易數(shù)據(jù)的安全傳輸和完整性保護(hù);在政務(wù)領(lǐng)域的電子公文傳輸、政務(wù)系統(tǒng)登錄等方面,確保政務(wù)信息的安全和可靠。
在實(shí)際應(yīng)用中,SM2 算法通常會(huì)與 SM3、SM4 等國(guó)密算法配合使用。一般用 SM4 對(duì)數(shù)據(jù)內(nèi)容進(jìn)行加密,使用 SM3 對(duì)內(nèi)容進(jìn)行摘要,再使用 SM2 對(duì)摘要進(jìn)行簽名。接收端先用 SM2 對(duì)摘要進(jìn)行驗(yàn)簽,驗(yàn)簽成功后,對(duì)發(fā)送過(guò)來(lái)的內(nèi)容進(jìn)行 SM3 摘要,查看生成的摘要和驗(yàn)簽后的摘要是否一致,以防止篡改。
API方法與使用
generateKeyPair 生成非對(duì)稱密鑰KeyPair
let keyPair = SM2.generateKeyPairSync();
let pubKey = keyPair.pubKey; //公鑰
let priKey = keyPair.priKey; //私鑰
let pubKeyStr = CryptoHelper.dataBlobToStr(pubKey.getEncoded(), 'base64'); //將公鑰轉(zhuǎn)換成base64字符串。
LogUtil.error(`pubKeyStr2: ${pubKeyStr}`);
let priKeyStr = CryptoHelper.dataBlobToStr(priKey.getEncoded(), 'base64'); //將私鑰轉(zhuǎn)換成base64符符串。
LogUtil.error(`priKeyStr2: ${priKeyStr}`);
getConvertKeyPair 獲取轉(zhuǎn)換的非對(duì)稱密鑰KeyPair
let pubKeyStr = "3059301306072a8648ce3d020106082a811ccf5501822d034200045417bebc296d14ebed6b6d0298019935677c5a8549150adf82e5c51f567066a7e8186915b10d3a8f0c544b2c03ee39ff3063125b53b906cc4da2232ae127c178"; //16進(jìn)制字符串密鑰
let priKeyStr = "3031020101042035ae8b8faec0e80e64b26d5239d60c7a694aaa84bd106ed12f4600d9fe2cbd09a00a06082a811ccf5501822d"; //16進(jìn)制字符串密鑰
let keyPair = await SM2.getConvertKeyPair(pubKeyStr, priKeyStr, 'hex');
let pubKey = keyPair.pubKey; //公鑰
let priKey = keyPair.priKey; //私鑰
let pubKeyStr3 = CryptoHelper.dataBlobToStr(pubKey.getEncoded(), 'hex'); //將公鑰轉(zhuǎn)換成16進(jìn)制字符串。
LogUtil.error(`pubKeyStr3: ${pubKeyStr3}`);
let priKeyStr3 = CryptoHelper.dataBlobToStr(priKey.getEncoded(), 'hex'); //將私鑰轉(zhuǎn)換成16進(jìn)制字符串。
LogUtil.error(`priKeyStr3: ${priKeyStr3}`);
getSM2PubKey 獲取轉(zhuǎn)換SM2公鑰, 將C1C2C3格式的SM2公鑰轉(zhuǎn)換為鴻蒙所需的ASN.1格式
//16進(jìn)制的C1C2C3格式的SM2公鑰
let pubKeyStr = "04FB40A51A9D6E9333A73B3633BA72B0989BD69F54420108E7036C8FA0E6C6142C422F70D75063AC98EC9E2D2CB82B847C51979A1485DAB5573ABCC0FC69B5988E";
let pubKey = SM2.getSM2PubKey(pubKeyStr); //將16進(jìn)制的C1C2C3格式的SM2公鑰轉(zhuǎn)換為鴻蒙所需的ASN.1格式公鑰
let pubKeyStr1 = CryptoHelper.dataBlobToStr(pubKey.getEncoded(), 'hex'); //將公鑰轉(zhuǎn)換成16進(jìn)制字符串。
LogUtil.error(`轉(zhuǎn)換后的公鑰: ${pubKeyStr1}`);
getSM2PriKey 獲取轉(zhuǎn)換SM2私鑰
let priKeyStr="6330B599ECD23ABDC74B9A5B7B5E00E553005F72743101C5FAB83AEB579B7074";
let priKey = SM2.getSM2PriKey(priKeyStr);
let priKeyStr1 = CryptoHelper.dataBlobToStr(priKey.getEncoded(), 'hex'); //將私鑰轉(zhuǎn)換成base64符符串。
LogUtil.error(`轉(zhuǎn)換后的私鑰: ${priKeyStr1}`);
encrypt 加密
let pubKeyStr = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYIZ4YCxXfIKvy3Fzmpl43hk7ojUsZqoZyww1YYtw4bICcaD/KmKy+OO4bMTnbrjbjNfJQaVApDTOW9a+PvazXQ=="; //base64字符串公鑰
let priKeyStr = "MDECAQEEIKu8PGHEU4Wxiw6xwb0loj0NVLlR7vGe5jYgan8u+hKboAoGCCqBHM9VAYIt"; //base64字符串私鑰
let keyPair = SM2.getConvertKeyPairSync(pubKeyStr, priKeyStr, 'base64');
let msg = "鴻蒙技術(shù)交流QQ群:1029219059"; //待加密字符串
let msgDataBlob = CryptoHelper.strToDataBlob(msg, 'utf-8');
let encryptDataBlob = await SM2.encrypt(msgDataBlob, keyPair!.pubKey); //加密
let encryptStr = CryptoHelper.dataBlobToStr(encryptDataBlob, 'utf-8');
LogUtil.error(`加密后: ${encryptStr}`);
decrypt 解密
let pubKeyStr = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYIZ4YCxXfIKvy3Fzmpl43hk7ojUsZqoZyww1YYtw4bICcaD/KmKy+OO4bMTnbrjbjNfJQaVApDTOW9a+PvazXQ=="; //base64字符串公鑰
let priKeyStr = "MDECAQEEIKu8PGHEU4Wxiw6xwb0loj0NVLlR7vGe5jYgan8u+hKboAoGCCqBHM9VAYIt"; //base64字符串私鑰
let keyPair = SM2.getConvertKeyPairSync(pubKeyStr, priKeyStr, 'base64');
let msg = "鴻蒙技術(shù)交流QQ群:1029219059"; //待加密字符串
let msgDataBlob = CryptoHelper.strToDataBlob(msg, 'utf-8');
let encryptDataBlob = await SM2.encrypt(msgDataBlob, keyPair!.pubKey); //加密
let decryptDataBlob = await SM2.decrypt(encryptDataBlob, keyPair!.priKey); //解密
let decryptStr = CryptoHelper.dataBlobToStr(decryptDataBlob, 'utf-8');
LogUtil.error(`加解密后: ${decryptStr}`);
getCipherTextSpec 獲取轉(zhuǎn)換SM2密文格式,ASN.1格式轉(zhuǎn)換為C1C2C3或C1C3C2
let pubKeyStr = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYIZ4YCxXfIKvy3Fzmpl43hk7ojUsZqoZyww1YYtw4bICcaD/KmKy+OO4bMTnbrjbjNfJQaVApDTOW9a+PvazXQ=="; //base64字符串公鑰
let priKeyStr = "MDECAQEEIKu8PGHEU4Wxiw6xwb0loj0NVLlR7vGe5jYgan8u+hKboAoGCCqBHM9VAYIt"; //base64字符串私鑰
let keyPair = SM2.getConvertKeyPairSync(pubKeyStr, priKeyStr, 'base64');
let msg = "鴻蒙技術(shù)交流QQ群:1029219059"; //待加密字符串
let msgDataBlob = CryptoHelper.strToDataBlob(msg, 'utf-8');
let encryptDataBlob = SM2.encryptSync(msgDataBlob, keyPair!.pubKey); //加密
let c1c2c3Str = SM2.getCipherTextSpec(encryptDataBlob, 0); //轉(zhuǎn)換密文
LogUtil.error(`C1C2C3密文: ${c1c2c3Str}`);
let c1c3c2Str = SM2.getCipherTextSpec(encryptDataBlob, 1); //轉(zhuǎn)換密文
LogUtil.error(`C1C3C2密文: ${c1c3c2Str}`);
sign 對(duì)數(shù)據(jù)進(jìn)行簽名
let pubKeyStr = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYIZ4YCxXfIKvy3Fzmpl43hk7ojUsZqoZyww1YYtw4bICcaD/KmKy+OO4bMTnbrjbjNfJQaVApDTOW9a+PvazXQ=="; //base64字符串公鑰
let priKeyStr = "MDECAQEEIKu8PGHEU4Wxiw6xwb0loj0NVLlR7vGe5jYgan8u+hKboAoGCCqBHM9VAYIt"; //base64字符串私鑰
let keyPair = SM2.getConvertKeyPairSync(pubKeyStr, priKeyStr, 'base64');
let msg = "harmony-utils,一款高效的HarmonyOS工具包,封裝了常用工具類,提供一系列簡(jiǎn)單易用的方法。幫助開(kāi)發(fā)者快速構(gòu)建鴻蒙應(yīng)用。";
let dataBlob = CryptoHelper.strToDataBlob(msg, 'utf-8');
let signDataBlob =await SM2.sign(dataBlob, keyPair!.priKey);
let signStr = CryptoHelper.dataBlobToStr(signDataBlob, 'hex');
LogUtil.error(`簽名,異步: ${signStr}`);
verify 對(duì)數(shù)據(jù)進(jìn)行驗(yàn)簽
let pubKeyStr = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYIZ4YCxXfIKvy3Fzmpl43hk7ojUsZqoZyww1YYtw4bICcaD/KmKy+OO4bMTnbrjbjNfJQaVApDTOW9a+PvazXQ=="; //base64字符串公鑰
let priKeyStr = "MDECAQEEIKu8PGHEU4Wxiw6xwb0loj0NVLlR7vGe5jYgan8u+hKboAoGCCqBHM9VAYIt"; //base64字符串私鑰
let keyPair = SM2.getConvertKeyPairSync(pubKeyStr, priKeyStr, 'base64');
let msg = "harmony-utils,一款高效的HarmonyOS工具包,封裝了常用工具類,提供一系列簡(jiǎn)單易用的方法。幫助開(kāi)發(fā)者快速構(gòu)建鴻蒙應(yīng)用。";
let dataBlob = CryptoHelper.strToDataBlob(msg, 'utf-8');
let signDataBlob =await SM2.sign(dataBlob, keyPair!.priKey);
let verify = await SM2.verify(dataBlob, signDataBlob, keyPair!.pubKey);
LogUtil.error(`驗(yàn)簽,異步: ${verify}`);
signSegment 對(duì)數(shù)據(jù)進(jìn)行分段簽名
let pubKeyStr = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYIZ4YCxXfIKvy3Fzmpl43hk7ojUsZqoZyww1YYtw4bICcaD/KmKy+OO4bMTnbrjbjNfJQaVApDTOW9a+PvazXQ=="; //base64字符串公鑰
let priKeyStr = "MDECAQEEIKu8PGHEU4Wxiw6xwb0loj0NVLlR7vGe5jYgan8u+hKboAoGCCqBHM9VAYIt"; //base64字符串私鑰
let keyPair = SM2.getConvertKeyPairSync(pubKeyStr, priKeyStr, 'base64');
let dataStr = "harmony-utils,一款高效的HarmonyOS工具包,封裝了常用工具類,提供一系列簡(jiǎn)單易用的方法。幫助開(kāi)發(fā)者快速構(gòu)建鴻蒙應(yīng)用。gitee地址:https://gitee.com/tongyuyan/harmony-utils。github主頁(yè)地址:https://github.com/787107497。";
let data = CryptoHelper.strToUint8Array(dataStr, 'utf-8');
let signDataBlob = await SM2.signSegment(data, keyPair!.priKey);
let signStr = CryptoHelper.dataBlobToStr(signDataBlob, 'base64');
LogUtil.error(`分段簽名,異步: ${signStr}`);
verifySegment 對(duì)數(shù)據(jù)進(jìn)行分段驗(yàn)簽
let pubKeyStr = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYIZ4YCxXfIKvy3Fzmpl43hk7ojUsZqoZyww1YYtw4bICcaD/KmKy+OO4bMTnbrjbjNfJQaVApDTOW9a+PvazXQ=="; //base64字符串公鑰
let priKeyStr = "MDECAQEEIKu8PGHEU4Wxiw6xwb0loj0NVLlR7vGe5jYgan8u+hKboAoGCCqBHM9VAYIt"; //base64字符串私鑰
let keyPair = SM2.getConvertKeyPairSync(pubKeyStr, priKeyStr, 'base64');
let dataStr = "harmony-utils,一款高效的HarmonyOS工具包,封裝了常用工具類,提供一系列簡(jiǎn)單易用的方法。幫助開(kāi)發(fā)者快速構(gòu)建鴻蒙應(yīng)用。gitee地址:https://gitee.com/tongyuyan/harmony-utils。github主頁(yè)地址:https://github.com/787107497。";
let data = CryptoHelper.strToUint8Array(dataStr, 'utf-8');
let signDataBlob = await SM2.signSegment(data, keyPair!.priKey);
let verify = await SM2.verifySegment(data, signDataBlob, keyPair!.pubKey);
LogUtil.error(`分段驗(yàn)簽,異步: ${verify}`);
創(chuàng)作不易,請(qǐng)給童長(zhǎng)老點(diǎn)贊
審核編輯 黃宇
-
SM2
+關(guān)注
關(guān)注
0文章
3瀏覽量
2452 -
Harmony
+關(guān)注
關(guān)注
0文章
108瀏覽量
3017
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論