SM4采用OFB模式进行加解密

SM4采用OFB模式进行加解密

HarmonyOS
2024-05-28 21:22:32
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
kersin

本文主要介绍使用SM4采用OFB模式,选择PKCS7参数,对明文进行加密,解密。

使用的核心API

SM4

核心代码解释

1.创建对称密钥生成器。

2.通过已有二进制数据生成密钥。

3.创建加解密生成器。

4.通过加解密生成器加密或解密数据。

核心代码如下:

import cryptoFramework from '@ohos.security.cryptoFramework'; 
import { BusinessError } from '@ohos.base'; 
import data from '@ohos.telephony.data'; 
import buffer from '@ohos.buffer'; 
  
@Entry 
@Component 
struct Sm4ByOFB { 
@State message: string = 'Hello World' 
@State text:string=''; 
@State decryptRes:string=''; 
build() { 
  Row() { 
    Column() { 
      TextInput() 
        .border({ 
          width:1 
        }) 
        .margin({top:0}) 
        .width(240) 
        .height(50) 
        .backgroundColor(Color.Pink) 
        .onChange(result=>{ 
          this.text=result; 
        }) 
      Button('加密') 
        .fontSize(50) 
        .fontWeight(FontWeight.Bold) 
        .margin(20) 
        .onClick(()=>{ 
          SM4OfbToEncrypt(this.text) 
          AlertDialog.show({message:'加密成功'}) 
        }) 
      Button('解密') 
        .fontSize(50) 
        .fontWeight(FontWeight.Bold) 
        .margin(20) 
        .onClick(async ()=>{ 
          this.decryptRes=await SM4OfbToDecrypt(); 
        }) 
      Text(`${this.decryptRes}`) 
        .border({ 
          width:1 
        }) 
        .margin({top:20}) 
        .width(240) 
        .height(50) 
        .backgroundColor(Color.Orange) 
    } 
    .width('100%') 
  } 
  .height('100%') 
} 
} 
  
// Convert strings in plaintext into byte streams. 
// 字符串转成字节流 
function stringToUint8Array(str: string) { 
return new Uint8Array(buffer.from(str,'utf-8').buffer); 
} 
// 字节流转成可理解的字符串 
function uint8ArrayToString(array:Uint8Array) { 
// 将UTF-8编码转换成Unicode编码 
let out: string = ""; 
let index: number = 0; 
let len: number = array.length; 
while (index < len) { 
  let character = array[index++]; 
  switch(character >> 4) { 
    case 0: 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
      out += String.fromCharCode(character); 
      break; 
    case 12: 
    case 13: 
      out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F)); 
      break; 
    case 14: 
      out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) | ((array[index++] & 0x3F) << 0)); 
      break; 
    default: 
      break; 
  } 
} 
return out; 
} 
  
  
let sm4Generator = cryptoFramework.createSymKeyGenerator('SM4_128'); 
let promiseSymKey = sm4Generator.generateSymKey(); 
let res:cryptoFramework.DataBlob; 
// SM4 OFB加密 
async function SM4OfbToEncrypt(plainText:string) { 
let cipher = cryptoFramework.createCipher("SM4_128|OFB|PKCS7"); 
let input: cryptoFramework.DataBlob = { data: stringToUint8Array(plainText) }; 
let cipherData: cryptoFramework.DataBlob; 
let key: cryptoFramework.SymKey; 
  
key=await promiseSymKey 
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE,key,null) 
cipherData=await cipher.doFinal(input) 
res=cipherData 
console.log("cipherData"+res) 
  
return res; 
} 
  
let result:cryptoFramework.DataBlob; 
  
async function SM4OfbToDecrypt(){ 
let sm4Generator = cryptoFramework.createSymKeyGenerator('SM4_128'); 
let decoder = cryptoFramework.createCipher("SM4_128|OFB|PKCS7"); 
await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE,await promiseSymKey,null) 
result=await decoder.doFinal(res) 
let mes=uint8ArrayToString(result.data) 
console.log("res11111"+mes); 
return mes; 
}

实现效果

适配的版本信息

  • IDE:DevEco    Studio 4.0.1.601
  • SDK:HarmoneyOS    4.0.10.11
分享
微博
QQ
微信
回复
2024-05-29 22:30:38
相关问题
如何使用SM4的CBC模式加解密
183浏览 • 1回复 待解决
SM4 CBC模式加解密,有好的方案吗?
449浏览 • 1回复 待解决
如何使用国密SM2算法进行加解密
865浏览 • 1回复 待解决
想了解一下SM4相关案例
300浏览 • 1回复 待解决
求大佬告知如何进行des加解密
423浏览 • 1回复 待解决
如何进行不同规格的AES加解密
210浏览 • 1回复 待解决
加解密算法库框架使用
452浏览 • 1回复 待解决
多种加密方式实现加解密
416浏览 • 1回复 待解决
RSA导入外部密钥实现加解密
362浏览 • 1回复 待解决
基于加解密算法框架的规格问题
208浏览 • 1回复 待解决
AES加解密长字符串是否需要分段
166浏览 • 1回复 待解决
实现一次非对称RSA非对称加解密
436浏览 • 1回复 待解决
使用32字节秘钥加解密后报错
467浏览 • 1回复 待解决
加解密HmacSha1 、HmacSha256、aes参考Demo
553浏览 • 1回复 待解决