HarmonyOS鸿蒙Next中如何将下列java的加密和解密方法转换成对应的方法?

HarmonyOS鸿蒙Next中如何将下列java的加密和解密方法转换成对应的方法?

AES加密

/**
 * AES加密
 *
 * @param content 需要加密的内容
 * @param strKey  加密秘钥
 * @return 加密后的比特流
 */
public static String encrypt(String content, String strKey) throws Exception {
    SecretKeySpec key = new SecretKeySpec(strKey.getBytes(), "AES"); //NOSONAR
    Cipher cipher = Cipher.getInstance("AES");
    byte[] byteContent = content.getBytes(StandardCharsets.UTF_8);
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return byte2hex(cipher.doFinal(byteContent));
}

RSA加密

/**
 * RSA加密
 *
 * @param data
 * @param publicKey
 * @return
 */
public static String encryptRSA(String data, PublicKey publicKey) throws Exception {
    // 对数据加密
    Cipher cipher = Cipher.getInstance(RSA_KEY_DECRYPT_ALGORITHM);
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    return byte2hex(cipher.doFinal(data.getBytes()));
}

byte[]转16进制string

/**
 * byte[]转16进制string
 *
 * @param b
 * @return
 */
public static String byte2hex(byte[] b) {
    StringBuilder hs = new StringBuilder();
    for (byte bi : b) {
        String temp = Integer.toHexString(bi & 0XFF);
        if (temp.length() == 1) {
            hs.append("0");
        }
        hs.append(temp);
    }
    return hs.toString().toUpperCase();
}

获取公钥

public static PublicKey getPublicKey(String publicKey) throws Exception {
    byte[] keyBytes = Base64.getDecoder().decode(publicKey);
    X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    return keyFactory.generatePublic(spec);
}

RSA签名

/**
 * RSA签名
 *
 * @param data
 * @param privateKey
 * @return
 */
public static String sign(String data, PrivateKey privateKey) throws Exception {
    Signature signature = Signature.getInstance("SHA1WithRSA");
    signature.initSign(privateKey);
    signature.update(data.getBytes(StandardCharsets.UTF_8));
    return Base64.getEncoder().encodeToString(signature.sign());
}

RSA解密

/**
 * RSA解密
 *
 * @param message
 * @param privateKey
 * @return
 */
public static String decryptRSA(String message, PrivateKey privateKey) throws Exception {
    byte[] bytes = hex2byte(message);
    Cipher cipher = Cipher.getInstance(RSA_KEY_DECRYPT_ALGORITHM);
    cipher.init(2, privateKey);
    byte[] result = cipher.doFinal(bytes);
    return new String(result);
}

AES解密

/**
 * AES解密
 *
 * @param content 待解密内容
 * @param strKey  解密密钥
 * @return 解密后的
 */
public static String decrypt(String content, String strKey) throws Exception {
    SecretKeySpec key = new SecretKeySpec(strKey.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, key);
    return new String(cipher.doFinal(hex2byte(content)));
}

更多关于HarmonyOS鸿蒙Next中如何将下列java的加密和解密方法转换成对应的方法?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

更多关于HarmonyOS鸿蒙Next中如何将下列java的加密和解密方法转换成对应的方法?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中使用ArkTS实现AES加密解密:

加密方法示例:

import cryptoFramework from '@ohos.security.cryptoFramework';

async function encryptAES(text: string, key: string) {
  let cipher = cryptoFramework.createCipher('AES256|ECB|PKCS7');
  let keyBlob = { data: stringToUint8Array(key) };
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyBlob, null);
  let input = { data: stringToUint8Array(text) };
  let encrypted = await cipher.doFinal(input);
  return uint8ArrayToBase64(encrypted.data);
}

解密方法类似,将CryptoMode改为DECRYPT_MODE即可。需注意密钥长度需符合AES标准(128/192/256位)。

在HarmonyOS Next中,可以使用ArkTS实现类似功能。以下是转换后的代码示例:

  1. AES加密/解密:
import cryptoFramework from '@ohos.security.cryptoFramework';

async function aesEncrypt(content: string, key: string): Promise<string> {
  let cipher = cryptoFramework.createCipher('AES128|ECB|PKCS7');
  let keyBlob = { data: new Uint8Array(Array.from(key, c => c.charCodeAt(0))) };
  let symKey = await cryptoFramework.createSymKeyGenerator('AES128').convertKey(keyBlob);
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);
  let input = { data: new Uint8Array(Array.from(content, c => c.charCodeAt(0))) };
  let output = await cipher.doFinal(input);
  return Array.from(output.data).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();
}
  1. RSA加密/解密:
async function rsaEncrypt(data: string, publicKey: cryptoFramework.PubKey): Promise<string> {
  let cipher = cryptoFramework.createCipher('RSA1024|PKCS1');
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, publicKey, null);
  let input = { data: new Uint8Array(Array.from(data, c => c.charCodeAt(0))) };
  let output = await cipher.doFinal(input);
  return Array.from(output.data).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();
}
  1. 16进制转换:
function byte2hex(bytes: Uint8Array): string {
  return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();
}

function hex2byte(hex: string): Uint8Array {
  let result = new Uint8Array(hex.length / 2);
  for (let i = 0; i < hex.length; i += 2) {
    result[i/2] = parseInt(hex.substr(i, 2), 16);
  }
  return result;
}
  1. 获取公钥:
async function getPublicKey(base64Key: string): Promise<cryptoFramework.PubKey> {
  let keyData = new Uint8Array(atob(base64Key).split('').map(c => c.charCodeAt(0)));
  let keyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
  return await keyGenerator.convertKey({ data: keyData }, false);
}
  1. RSA签名:
async function rsaSign(data: string, privateKey: cryptoFramework.PriKey): Promise<string> {
  let signer = cryptoFramework.createSign('RSA1024|SHA1');
  await signer.init(privateKey);
  let input = { data: new Uint8Array(Array.from(data, c => c.charCodeAt(0))) };
  let signature = await signer.sign(input);
  return btoa(String.fromCharCode(...Array.from(signature.data)));
}

注意:HarmonyOS Next的加密API与Java有些差异,需要异步处理,且部分参数配置方式不同。实际使用时请根据具体需求调整参数。

回到顶部