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; 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.

实现效果

适配的版本信息

  • IDE:DevEco    Studio 4.0.1.601
  • SDK:HarmoneyOS    4.0.10.11
分享
微博
QQ
微信
回复
2024-05-29 22:30:38
相关问题
如何使用SM4的CBC模式加解密
1678浏览 • 1回复 待解决
SM4 CBC模式加解密,有好的方案吗?
1497浏览 • 1回复 待解决
HarmonyOS SM2/SM4结合加解密
515浏览 • 1回复 待解决
HarmonyOS SM2,SM4国密加解密使用demo
729浏览 • 1回复 待解决
HarmonyOS sm4、rsa等加解密库及参考文档
1145浏览 • 1回复 待解决
HarmonyOS SM4如何进行SM4/ECB/NoPadding加密
333浏览 • 1回复 待解决
HarmonyOS SM4加密
137浏览 • 1回复 待解决
HarmonyOS sm4加密有无cbc方式
306浏览 • 1回复 待解决
HarmonyOS 没找到 sm4 cbc 加密
315浏览 • 1回复 待解决
如何使用国密SM2算法进行加解密
5513浏览 • 1回复 待解决
HarmonyOS sm4 支持 CBC PKCS5Padding 吗
207浏览 • 1回复 待解决
HarmonyOS Sm2和DES加解密问题
968浏览 • 1回复 待解决
想了解一下SM4相关案例
1213浏览 • 1回复 待解决
ARKUI采用什么模式进行开发?
593浏览 • 1回复 待解决