SM3摘要算法对明文进行编码的转换

SM3摘要算法对明文进行编码的转换

HarmonyOS
2024-05-21 20:40:06
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
mafast

本文主要介绍使用SM3摘要算法对明文进行摘要,然后对摘要得到的数据进行一个编码转换。

场景

SM3可以用于计算数据的哈希值,以确保数据在传输过程中不被篡改或损坏,保证了数据的安全性。

使用的核心API

createMd

buffer.from

Base64Helper

核心代码解释

1. 通过接口createMd生成摘要操作实例。

2. 接受用户数据,通过接口update,更新摘要,此步骤可重复,算法库不限制单次update的长度。

3. 通过接口digest,返回摘要计算结果。

4. 获取当前摘要算法名与摘要计算长度。

5. TAG是我设置的标识符,以便观察。

6. 通过buffer.from以及tostring()可以把摘要的数据转成想要的编码格式。

7. 通过new util.Base64Helper创建base64实例,再通过base64.encodeToStringSync()对数据进行转换。

核心代码如下:

import cryptoFramework from '@ohos.security.cryptoFramework'; 
import { BusinessError } from '@ohos.base'; 
import buffer from '@ohos.buffer'; 
import util from '@ohos.util'; 
  
@Entry 
@Component 
struct Sm3 { 
  @State message: string = 'Sm3' 
  
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
      } 
      .width('100%') 
      .onClick(()=>{ 
        doMdByPromise(); 
      }) 
    } 
    .height('100%') 
  } 
} 
//将明文字符串转换为字节流。 
function stringToUint8Array(str: string) { 
  let arr = new Uint8Array(str.length); 
  for (let i = 0, j = str.length; i < j; ++i) { 
    arr[i] = str.charCodeAt(i); 
  } 
  return arr; 
} 
  
// 以Promise方式完成摘要 
async function doMdByPromise() { 
  let TAG="Test-"; 
  let mdAlgName = "SM3"; // 摘要算法名称。 
  let message = "ahdjashdjahduqwyieqwijkdals45451234545155aadasdadawdsa"; // 需要消化的数据。 
  let md = cryptoFramework.createMd(mdAlgName); 
  console.info("mdAlgName:" + md.algName); 
  // 如果数据量较小,可以使用update()一次传递所有数据。输入参数的长度没有限制。 
  let promiseMdUpdate = md.update({ data: stringToUint8Array(message) }); 
  promiseMdUpdate.then(() => { 
    // 调用摘要()返回结果。 
    let PromiseMdDigest = md.digest(); 
    //console.log("SM3:"+PromiseMdDigest); 
    return PromiseMdDigest; 
  }).then(digestOutput => { 
    let mdOutput = digestOutput; 
    console.info(TAG+"Result:" + mdOutput.data); 
    //转成16进制 
    let buf=buffer.from(mdOutput.data); 
    console.log(TAG+"Hex222:"+buf.toString("hex")); 
    let mdLen = md.getMdLength(); 
    console.info(TAG+"MDlength: " + mdLen); 
    //转成base64 
    let base64=new util.Base64Helper; 
    let priKeyBase64=base64.encodeToStringSync(mdOutput.data) 
    console.log(TAG+"base64:"+priKeyBase64) 
  }).catch((error: BusinessError) => { 
    console.error("error:" + error.message); 
  }); 
}

实现效果

适配的版本信息

 IDE:DevEco    Studio 4.0.1.601

SDK:HarmoneyOS    4.0.10.11

分享
微博
QQ
微信
回复
2024-05-22 16:21:11
相关问题
能否提供一个关于SM3加密demo?
258浏览 • 1回复 待解决
能否提供一个SM3加密案例
257浏览 • 1回复 待解决
如何常见密钥进行格式转换
248浏览 • 1回复 待解决
如何使用国密SM2算法进行加解密
1020浏览 • 1回复 待解决
SM4采用OFB模式进行加解密
352浏览 • 1回复 待解决
如何Serviceabbility进行调试?
1646浏览 • 1回复 待解决
基于PhotoViewPicker图片进行操作
188浏览 • 1回复 待解决
指定url图片进行下载保存
447浏览 • 1回复 待解决
基于CameraKit相机进行操作
222浏览 • 1回复 待解决
基于ImageKit图片进行处理
194浏览 • 1回复 待解决
打包怎么代码进行混淆?
5166浏览 • 1回复 待解决
如何图片进行高斯模糊处理
700浏览 • 1回复 待解决
如何相册图片进行编辑裁剪
728浏览 • 1回复 待解决
如何鸿蒙设备进行ui测试?
2141浏览 • 1回复 待解决
如何进行base64编码,有人知道吗?
225浏览 • 1回复 待解决
如何JSON数据进行解析优化
268浏览 • 1回复 待解决