HarmonyOS鸿蒙Next中如何用noPadding模式进行RSA加解密?

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

HarmonyOS鸿蒙Next中如何用noPadding模式进行RSA加解密? 我们的项目中有使用无填充模式进行RSA加解密的场景,如在iOS中进行RSA加密时指定了kSecPaddingNone参数。 在鸿蒙上只看到了文档中提及:"NoPadding:不带填充,输入的数据必须与RSA钥模(即RSA模数n的字节长度)一样长;输出数据长度与RSA钥模一样长。"文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/crypto-asym-encrypt-decrypt-spec-V5#%E5%A1%AB%E5%85%85%E6%A8%A1%E5%BC%8F%E4%B8%BAnopadding

但没有事例代码说明如何做,目前我们开发阻塞在这里,麻烦提供一段事例代码说明如何在鸿蒙上进行等价于iOS的kSecPaddingNone的RSA加密,现在iOS、android都是可以的,就鸿蒙上不行。因为涉及到客户端加密,后端解密,兼顾多端,现在我们也无法修改加密的填充模式。(此前提过RSA的无填充模式加解密,华为建议修改填充模式)

加密公钥字符串如下: xxxxxxxxxxxxxxxxxxxxxxxxxxLADCBhwKBgQxxxxxx8AgfA0a62G9Ja1p43ZV/pUzKTCXCViM/aDq2j/CN6zAebCthDDXWckvM/P+0CyRRZ4h9ffMN3jTQsHUTRg2Tbnc74A5w/1Aa63UUPxzx/nKZN9UJI3Nnk2gYIekZAlSqs8zq+b8IcQ5mbJU3+dmxx65GOO1MXr4dOcsKLwIBAw==

待加密的字符串为随机生成的16位字符串,如: 1f9baebda3ccxxxx

请尽快给一个事例代码。


更多关于HarmonyOS鸿蒙Next中如何用noPadding模式进行RSA加解密?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

需要补齐待加密字符串:

  encryptRSA(pubKeyStr: string, encryptStr: string) {

    let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024|PRIMES_2');

    let cipher = cryptoFramework.createCipher('RSA1024|NoPadding');

    let that = new util.Base64Helper();

    let pubKey = that.decodeSync(pubKeyStr);

    let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };

    rsaGenerator.convertKey(pubKeyBlob, null, (err, keyPair) => {

      if (err) {
        Logger.error("convertKey: error." + (err as BusinessError).code);
        return;
      }

    //补齐待加密字符串

      let planArr = new Uint8Array(128);

      let arr = this.stringToUint8Array(encryptStr);

      planArr.set(arr,planArr.length-arr.length);

      console.log(`加密成功 pubKey `+that.encodeToStringSync(keyPair.pubKey.getEncoded().data))

      cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.pubKey, null, (err, data) => {

        let input: cryptoFramework.DataBlob = { data: planArr };

        cipher.doFinal(input, (err, data) => {

          Logger.info(TAG, "EncryptOutPut is "+ data.data);

          let result = that.encodeToStringSync(data.data)

          Logger.info(TAG, "result is "+ result);
        })
      })
    })
  }

更多关于HarmonyOS鸿蒙Next中如何用noPadding模式进行RSA加解密?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用noPadding模式进行RSA加解密可以通过MbedTLS库来实现。以下是具体步骤:

  1. 初始化RSA上下文:首先,需要创建并初始化一个RSA上下文对象。

  2. 设置RSA密钥:使用mbedtls_rsa_importmbedtls_rsa_gen_key函数导入或生成RSA密钥。

  3. 配置noPadding模式:在RSA上下文中,通过mbedtls_rsa_set_padding函数将填充模式设置为MBEDTLS_RSA_PKCS_V15,并指定noPadding模式。

  4. 执行加密或解密操作:使用mbedtls_rsa_pkcs1_encryptmbedtls_rsa_pkcs1_decrypt函数进行加密或解密操作。在noPadding模式下,输入数据的长度必须与RSA密钥的长度一致。

  5. 清理资源:操作完成后,使用mbedtls_rsa_free函数释放RSA上下文资源。

示例代码如下:

#include "mbedtls/rsa.h"
#include "mbedtls/entropy.h"
#include "mbedtls/ctr_drbg.h"

mbedtls_rsa_context rsa;
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;

// 初始化
mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, 0);
mbedtls_entropy_init(&entropy);
mbedtls_ctr_drbg_init(&ctr_drbg);

// 设置密钥
mbedtls_rsa_gen_key(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, 2048, 65537);

// 设置noPadding模式
mbedtls_rsa_set_padding(&rsa, MBEDTLS_RSA_PKCS_V15, 0);

// 加密
unsigned char input[256] = { /* 输入数据 */ };
unsigned char output[256];
mbedtls_rsa_pkcs1_encrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, MBEDTLS_RSA_PUBLIC, sizeof(input), input, output);

// 解密
unsigned char decrypted[256];
mbedtls_rsa_pkcs1_decrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, MBEDTLS_RSA_PRIVATE, &olen, output, decrypted, sizeof(decrypted));

// 清理
mbedtls_rsa_free(&rsa);
mbedtls_entropy_free(&entropy);
mbedtls_ctr_drbg_free(&ctr_drbg);

在HarmonyOS鸿蒙Next中,使用noPadding模式进行RSA加解密可以通过Cipher类实现。首先,创建Cipher实例并设置为RSA模式,然后指定paddingNoPadding。示例代码如下:

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

注意:NoPadding模式要求明文长度必须与密钥长度一致,解密时也需使用相同模式。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!