HarmonyOS鸿蒙Next中RSA指定公钥或私钥字符串加密和解密

HarmonyOS鸿蒙Next中RSA指定公钥或私钥字符串加密和解密 RSA指定公钥或私钥字符串加密和解密,得到加密或解密后的字符串

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

@Component
struct Index {
  @State message: string = 'Hello World';
  @State jmMessage: string = '暂无'
  @State jiemMessage: string = '暂无'
  @State jieStr: string = ''

  private keyPair: cryptoFramework.KeyPair | undefined = undefined
  private jmBlob: cryptoFramework.DataBlob = { data: new Uint8Array() }
  private privateKey: string = ''
  private pubKeyString: string = ''

  // 加密
  async jm(text: string) {
    let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024')
    this.keyPair = await rsaGenerator.generateKeyPair()
    let Base64Helper = new util.Base64Helper()
    let cipher = cryptoFramework.createCipher("RSA1024|PKCS1");
    cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, this.keyPair.pubKey, null)
    let inputUnit8Array = this.convertStringToUnit8Array(this.message)
    let inputBlob: cryptoFramework.DataBlob = { data: inputUnit8Array }
    let resultBlob = await cipher.doFinal(inputBlob)

    this.jmBlob = resultBlob
    let resStr = Base64Helper.encodeToStringSync(resultBlob.data)
    console.log('jm:' + resultBlob.data.toString())
    this.jieStr = resStr
    return resStr
  }

  // 解密
  async jiem(text: string) {
    try {
      let decoder = cryptoFramework.createCipher('RSA1024|PKCS1');
      console.log('ji_priKey:' + this.keyPair!.priKey.getEncoded().data.toString())
      await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, this.keyPair!.priKey, null);
      let Base64Helper = new util.Base64Helper()
      let jiemessage = Base64Helper.decodeSync(text)
      console.log('jiem:' + jiemessage.toString())
      let decryptData = await decoder.doFinal({ data: jiemessage });
      let decryptDataString = this.convertUnit8ArrayToString(decryptData.data)
      return decryptDataString
    } catch (e) {
      console.log('error123:' + JSON.stringify(e))
      return ''
    }
  }

  // 将base64转成unit8
  convertBase64ToUnit8Array(text: string) {
    let base64Helper = new util.Base64Helper();
    return base64Helper.decodeSync(text)
  }

  // 将unit8转成string ,字节码不能为0
  convertUnit8ArrayToString(uint8: Uint8Array) {
    return util.TextDecoder.create().decodeWithStream(uint8)
  }

  // 将明文string转成unit8,处理不了汉字和特殊字符
  convertStringToUnit8Array(text: string) {
    let arr: number[] = new Array(text.length)
    for (let i = 0, j = text.length; i < j; i++) {
      arr[i] = text.charCodeAt(i)
    }
    return new Uint8Array(arr)
  }

  build() {
    Row() {
      Column() {
        TextInput({ text: this.message })
          .onChange((value: string) => {
            this.message = value
          })
        Text('加密前的数据:')
        Text(this.message)
        Button('加密').onClick(() => {
          this.jm(this.message).then(data => {
            this.jmMessage = data
          })
        })
        Button('解密').onClick(() => {
          this.jiem(this.jieStr).then(data => {
            this.jiemMessage = data
          })
        })
        Text('加密后的数据:')
        Text(this.jmMessage)
        Text('解密后的数据:')
        Text(this.jiemMessage)
      }
      .width('100%')
    }
    .height('100%')
  }
}

更多关于HarmonyOS鸿蒙Next中RSA指定公钥或私钥字符串加密和解密的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,RSA加密和解密可以通过使用cryptoFramework模块来实现。以下是使用指定公钥或私钥字符串进行RSA加密和解密的基本步骤:

  1. 创建RSA密钥对生成器: 使用cryptoFramework.createAsyKeyGenerator创建RSA密钥对生成器。

    let rsaKeyPairGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
    
  2. 生成RSA密钥对: 调用rsaKeyPairGenerator.generateKeyPair生成RSA密钥对。

    rsaKeyPairGenerator.generateKeyPair((err, keyPair) => {
        if (err) {
            console.error("Failed to generate key pair: " + err.message);
            return;
        }
        let pubKey = keyPair.pubKey;
        let priKey = keyPair.priKey;
    });
    
  3. 指定公钥或私钥字符串: 假设你已经有了公钥或私钥的字符串,可以通过cryptoFramework.createPubKeycryptoFramework.createPriKey来创建对应的密钥对象。

    let pubKeyStr = "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----";
    let priKeyStr = "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----";
    
    let pubKey = cryptoFramework.createPubKey(pubKeyStr);
    let priKey = cryptoFramework.createPriKey(priKeyStr);
    
  4. 加密: 使用cryptoFramework.createCipher创建RSA加密器,并调用cipher.initcipher.doFinal进行加密。

    let cipher = cryptoFramework.createCipher("RSA1024|PKCS1");
    cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, pubKey, null);
    let plainText = "Hello, HarmonyOS!";
    cipher.doFinal(plainText, (err, data) => {
        if (err) {
            console.error("Failed to encrypt: " + err.message);
            return;
        }
        console.log("Encrypted data: " + data);
    });
    
  5. 解密: 使用cryptoFramework.createCipher创建RSA解密器,并调用cipher.initcipher.doFinal进行解密。

    let cipher = cryptoFramework.createCipher("RSA1024|PKCS1");
    cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, priKey, null);
    let encryptedData = "..."; // 加密后的数据
    cipher.doFinal(encryptedData, (err, data) => {
        if (err) {
            console.error("Failed to decrypt: " + err.message);
            return;
        }
        console.log("Decrypted data: " + data);
    });
    

在HarmonyOS鸿蒙Next中,使用RSA进行加密和解密时,可以通过KeyFactoryX509EncodedKeySpecPKCS8EncodedKeySpec来加载公钥或私钥的字符串。具体步骤如下:

  1. 生成RSA密钥对:使用KeyPairGenerator生成RSA密钥对。
  2. 加载公钥/私钥:将公钥或私钥字符串转换为PublicKeyPrivateKey对象。
  3. 加密:使用Cipher类,选择RSA/ECB/PKCS1Padding模式进行加密。
  4. 解密:同样使用Cipher类进行解密。

示例代码:

// 加载公钥
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(Base64.decode(publicKeyStr)));

// 加密
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedData = cipher.doFinal(plainText.getBytes());

// 加载私钥
PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(privateKeyStr)));

// 解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(encryptedData);

确保处理Base64编码和解码,以及异常处理。

回到顶部