求一个HarmonyOS相关的加解密 demo?

求一个HarmonyOS相关的加解密 demo?

阅读 552
avatarAI BotBETA

在HarmonyOS中实现加解密功能,你可以使用Java或Kotlin(取决于你的应用是否使用Java或Kotlin作为开发语言)来利用现有的加密库,如Java Cryptography Extension (JCE) 提供的加密服务。以下是一个简单的示例,展示了如何在HarmonyOS应用中使用AES加密和解密字符串。

1. 引入必要的库

对于HarmonyOS应用,通常不需要额外引入加密库,因为Java的加密功能已经内置在JDK中。

2. AES加密和解密示例

这里是一个简单的AES加密和解密的示例代码:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;

public class AESEncryptionDemo {

    private static final String ALGORITHM = "AES";
    private static final int KEY_SIZE = 128; // 可以是128, 192, 或 256

    public static void main(String[] args) throws Exception {
        String originalText = "Hello, HarmonyOS!";
        String encryptedText = encrypt(originalText);
        String decryptedText = decrypt(encryptedText);

        System.out.println("Original: " + originalText);
        System.out.println("Encrypted: " + encryptedText);
        System.out.println("Decrypted: " + decryptedText);
    }

    public static String encrypt(String data) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        keyGenerator.init(KEY_SIZE, new SecureRandom());
        SecretKey secretKey = keyGenerator.generateKey();

        byte[] keyBytes = secretKey.getEncoded();
        SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM);

        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

        byte[] encryptedBytes = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decrypt(String encryptedData) throws Exception {
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);

        // 注意:这里使用相同的密钥进行解密
        // 在实际应用中,你需要安全地存储和访问密钥
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        keyGenerator.init(KEY_SIZE, new SecureRandom());
        SecretKey secretKey = keyGenerator.generateKey();

        byte[] keyBytes = secretKey.getEncoded();
        SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM);

        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes);

        // 注意:在实际应用中,密钥应该在加密和解密时使用相同的实例
    }
}

注意:

  • 这个示例中,每次加密和解密都生成了新的密钥,这在实际应用中是不合理的。你应该在加密时生成密钥,并安全地存储这个密钥,以便在解密时使用。
  • 加密后的数据被编码为Base64字符串,以便于存储和传输。
  • 在生产环境中,密钥管理是非常重要的,你需要确保密钥的安全性和可用性。
  • 根据你的具体需求,你可能需要调整加密算法(如AES)、密钥大小(如128位、192位或256位)以及加密模式(如CBC、ECB等)。
1 个回答

关于AES|ECB|PKCS7 demo:

//加密 
async function aesEncrypt(text:string,puKey:string): Promise<string>{ 
  let globalResult = "" 
  try { 
    let cipherAlgName = 'AES128|ECB|PKCS7'; 
    let globalCipher = cryptoFramework.createCipher(cipherAlgName); 
    let symAlgName = 'AES128'; 
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName); 
    let dataUint8Array = base.decodeSync(puKey) 
    let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array } 
    let promiseSymKey = await symKeyGenerator.convertKey(keyBlob) 
    await globalCipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, promiseSymKey, null); 
    let result = await globalCipher.doFinal({data:stringToUint8Array(text)}) 
    globalResult = base.encodeToStringSync(result.data); 
  } catch (err) { 
    console.log(err.message) 
  } 
  return globalResult; 
} 
// 解密 
async function aesDecrypt(text: string, key: string) { 
  let globalResult = "" 
  try { 
    let cipherAlgName = 'AES128|ECB|PKCS7'; 
    let globalCipher = cryptoFramework.createCipher(cipherAlgName); 
    let symAlgName = 'AES128'; 
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName); 
    let dataUint8Array = base.decodeSync(key) 
    let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array } 
    let promiseSymKey = await symKeyGenerator.convertKey(keyBlob) 
    await globalCipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, promiseSymKey, null); 
    let plainText: cryptoFramework.DataBlob = { data: base.decodeSync(text) } 
    let result = await globalCipher.doFinal(plainText) 
    globalResult = uint8ArrayToString(result.data); 
    console.log("解密后的明文==》" + globalResult) 
  } catch (err) { 
    console.log(err.message) 
  } 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题