HarmonyOS鸿蒙Next中SM4示例的加解密方式如何使用Java端生成的公私钥

HarmonyOS鸿蒙Next中SM4示例的加解密方式如何使用Java端生成的公私钥 能否提供一份SM4使用java端生成的SM4公私钥的加解密方法
将加密的密文数据解码转换为安卓可用数据(用于鸿蒙和安卓的交接)
针对安卓的密文处理,转成鸿蒙可用uint8Array数组数据
对安卓生成的的密文进行解密

3 回复
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer } from '@kit.ArkTS';

@Entry
@Component
struct RSA2048Crypt {
  @State message: string = '点击开始';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            SM4Crypto()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

async function SM4Crypto() {
  const sKey: string = "";
  const symKeyData = buffer.from(sKey, 'hex') //  hex    utf-8
  let symKeyDataUint8Array = new Uint8Array(symKeyData.buffer)
  let symKey = await genSymKeyByData(symKeyDataUint8Array);
  let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from('This is a test', 'utf-8').buffer) };
  let encryptText = await encryptMessagePromise(symKey, plainText);

  let decryptText = await decryptMessagePromise(symKey, encryptText);
  if (plainText.data.toString() === decryptText.data.toString()) {
    console.info('decrypt ok');
    console.info('decrypt plainText: ' + buffer.from(decryptText.data).toString('utf-8'));
  } else {
    console.error('decrypt failed');
  }
}

// 加密消息
async function encryptMessagePromise(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
  let cipher = cryptoFramework.createCipher('SM4_128|ECB|PKCS7');
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);
  let encryptData = await cipher.doFinal(plainText);
  console.log(`encryption successed`)
  return encryptData;
}

// 解密消息
async function decryptMessagePromise(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
  let decoder = cryptoFramework.createCipher('SM4_128|ECB|PKCS7');
  await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null);
  let decryptData = await decoder.doFinal(cipherText);
  console.log(`decryption successed ${buffer.from(decryptData.data).toString()}`)
  return decryptData;
}

async function genSymKeyByData(symKeyData: Uint8Array) {
  let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
  let symGenerator = cryptoFramework.createSymKeyGenerator('SM4_128');
  let symKey = await symGenerator.convertKey(symKeyBlob);
  console.log(`sm4 convert successed`)
  return symKey;
}

更多关于HarmonyOS鸿蒙Next中SM4示例的加解密方式如何使用Java端生成的公私钥的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中使用SM4进行加解密时,可以通过Java端生成的公私钥进行操作。具体步骤如下:

  1. 密钥生成:在Java端使用密钥生成器(如KeyPairGenerator)生成SM2的公私钥对。SM4对称密钥可以通过随机数生成器生成。

  2. 密钥导出:将生成的SM2公私钥对和SM4密钥导出为字节数组或Base64编码字符串,以便在鸿蒙系统中使用。

  3. 鸿蒙端密钥导入:在鸿蒙系统中,使用SecurityUtils或相关API将Java端导出的密钥导入为鸿蒙系统的密钥对象。

  4. 加解密操作:使用鸿蒙系统的SM4Cipher类进行加解密操作。加密时,使用SM4密钥对数据进行加密;解密时,使用相同的SM4密钥对密文进行解密。

  5. 签名验证:如果需要签名验证,可以使用SM2私钥对数据进行签名,然后在鸿蒙端使用SM2公钥进行验证。

示例代码片段:

// Java端生成SM2公私钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("SM2")
KeyPair keyPair = keyPairGenerator.generateKeyPair()
PublicKey publicKey = keyPair.getPublic()
PrivateKey privateKey = keyPair.getPrivate()

// Java端生成SM4密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("SM4")
SecretKey secretKey = keyGenerator.generateKey()

// 鸿蒙端导入密钥
byte[] publicKeyBytes = publicKey.getEncoded()
byte[] privateKeyBytes = privateKey.getEncoded()
byte[] sm4KeyBytes = secretKey.getEncoded()

// 鸿蒙端进行加解密
SM4Cipher sm4Cipher = new SM4Cipher()
sm4Cipher.init(Cipher.ENCRYPT_MODE, sm4KeyBytes)
byte[] encryptedData = sm4Cipher.doFinal(plainText)

sm4Cipher.init(Cipher.DECRYPT_MODE, sm4KeyBytes)
byte[] decryptedData = sm4Cipher.doFinal(encryptedData)

在HarmonyOS鸿蒙Next中使用SM4加解密时,可以通过Java端生成的公私钥进行密钥交换。首先,使用Java生成的公钥加密SM4密钥,然后在鸿蒙端使用私钥解密获取SM4密钥。鸿蒙端可以使用Cipher类进行SM4加解密操作。确保密钥格式和算法一致,如使用RSA进行密钥交换,SM4进行数据加解密。

示例代码:

// Java端生成RSA密钥对
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();

// 鸿蒙端使用私钥解密SM4密钥
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedKey = cipher.doFinal(encryptedSM4Key);

// 使用SM4进行加解密
Cipher sm4Cipher = Cipher.getInstance("SM4");
sm4Cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(decryptedKey, "SM4"));
byte[] encryptedData = sm4Cipher.doFinal(data);
回到顶部