Encryption and Decryption with an RC2 Symmetric Key (CBC Mode) (ArkTS)

The Crypto framework supports encryption and decryption with an RC2 symmetric key since API version 26.0.0.

For details about the algorithm specifications, see Symmetric Key Encryption and Decryption Algorithm Specifications: RC2.

Encryption

  1. Call cryptoFramework.createSymKeyGenerator, SymKeyGenerator.generateSymKey, or SymKeyGenerator.convertKey to generate a symmetric key (SymKey) with the RC2 algorithm and a key length ranging from 8 bits to 1024 bits (for example, RC2_128).

    In addition to the example in this topic, RC2 and Randomly Generating a Symmetric Key/Converting Binary Data into a Symmetric Key may help you better understand how to generate an RC2 symmetric key pair. Note that the input parameters in the reference documents may be different from those in the example below.

  2. Call cryptoFramework.createCipher with the string parameter 'RC2_128|CBC|PKCS7' to create a Cipher instance for encryption. The key type is RC2, block cipher mode is CBC, and padding mode is PKCS7.

  3. Call Cipher.init to initialize the Cipher instance. Specifically, set the mode to cryptoFramework.CryptoMode.ENCRYPT_MODE (encryption), key to SymKey (the key for encryption), and parameter to IvParamsSpec (IV length: 8 bytes) corresponding to the CBC mode.

  4. To encrypt a small amount of data, simply call Cipher.doFinal.

Decryption

  1. Call cryptoFramework.createCipher with the string parameter 'RC2|CBC|PKCS7' (supporting RC2_8 to RC2_1024) to create a Cipher instance for decryption. The key type is RC2, block cipher mode is CBC, and padding mode is PKCS7.

  2. Call Cipher.init to initialize the Cipher instance. Specifically, set the mode to cryptoFramework.CryptoMode.DECRYPT_MODE (decryption), key to SymKey (the key for decryption), and parameter to IvParamsSpec corresponding to the CBC mode.

  3. To decrypt a small amount of data, simply call Cipher.doFinal.

  • Example (using asynchronous APIs):

    import { cryptoFramework } from '@kit.CryptoArchitectureKit';
    import { buffer } from '@kit.ArkTS';
    
    function generateRandom(len: number) {
      let rand = cryptoFramework.createRandom();
      let generateRandSync = rand.generateRandomSync(len);
      return generateRandSync;
    }
    
    function genIvParamsSpec() {
      let ivBlob = generateRandom(8);
      let ivParamsSpec: cryptoFramework.IvParamsSpec = {
        algName: 'IvParamsSpec',
        iv: ivBlob
      };
      return ivParamsSpec;
    }
    
    let iv = genIvParamsSpec();
    
    // Encrypt the message.
    async function encryptMessagePromise(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
      let cipher = cryptoFramework.createCipher('RC2|CBC|PKCS7');
      await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv);
      let cipherData = await cipher.doFinal(plainText);
      return cipherData;
    }
    
    // Decrypt the message.
    async function decryptMessagePromise(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
      let decoder = cryptoFramework.createCipher('RC2|CBC|PKCS7');
      await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv);
      let decryptData = await decoder.doFinal(cipherText);
      return decryptData;
    }
    
    async function genSymKeyByData(symKeyData: Uint8Array) {
      let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
      let rc2Generator = cryptoFramework.createSymKeyGenerator('RC2');
      let symKey = await rc2Generator.convertKey(symKeyBlob);
      console.info('convertKey result: success.');
      return symKey;
    }
    
    async function rc2CBC() {
      try {
        let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]);
        let symKey = await genSymKeyByData(keyData);
        let message = 'This is a test';
        let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, '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');
        }
      } catch (error) {
        console.error(`RC2 CBC failed: errCode: ${error.code}, message: ${error.message}`);
      }
    }
    
  • Example (using synchronous APIs):

    import { cryptoFramework } from '@kit.CryptoArchitectureKit';
    import { buffer } from '@kit.ArkTS';
    
    function generateRandom(len: number) {
      let rand = cryptoFramework.createRandom();
      let generateRandSync = rand.generateRandomSync(len);
      return generateRandSync;
    }
    
    function genIvParamsSpec() {
      let ivBlob = generateRandom(8);
      let ivParamsSpec: cryptoFramework.IvParamsSpec = {
        algName: 'IvParamsSpec',
        iv: ivBlob
      };
      return ivParamsSpec;
    }
    
    let iv = genIvParamsSpec();
    
    // Encrypt the message.
    function encryptMessage(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
      let cipher = cryptoFramework.createCipher('RC2|CBC|PKCS7');
      cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv);
      let cipherData = cipher.doFinalSync(plainText);
      return cipherData;
    }
    
    // Decrypt the message.
    function decryptMessage(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
      let decoder = cryptoFramework.createCipher('RC2|CBC|PKCS7');
      decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv);
      let decryptData = decoder.doFinalSync(cipherText);
      return decryptData;
    }
    
    function genSymKeyByData(symKeyData: Uint8Array) {
      let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
      let rc2Generator = cryptoFramework.createSymKeyGenerator('RC2');
      let symKey = rc2Generator.convertKeySync(symKeyBlob);
      console.info('convertKeySync result: success.');
      return symKey;
    }
    
    function rc2CBC() {
      try {
        let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]);
        let symKey = genSymKeyByData(keyData);
        let message = 'This is a test';
        let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
        let encryptText = encryptMessage(symKey, plainText);
        let decryptText = decryptMessage(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.');
        }
      } catch (error) {
        console.error(`RC2 CBC failed: errCode: ${error.code}, message: ${error.message}`);
      }
    }