HarmonyOS鸿蒙Next中RSA加密如何指定填充模式为不填充

HarmonyOS鸿蒙Next中RSA加密如何指定填充模式为不填充 如下代码,进行RSA加密时,填充模式为PKCS1时能正常加密。但填充模式为NoPadding时则报错,不能完成RSA加密。在加密框架的文档中,有如下说明:目前对称加解密中,PKCS5和PKCS7的实现相同,其padding长度和分组长度保持一致(即PKCS5和PKCS7在3DES中均按照8字节填充,在AES中均按照16字节填充),另有NoPadding表示不填充。但设置NoPadding却无法加密成功。

static async encryptRSA(pubKeyStr: string, encryptStr: string) {
  let base64Helper = new util.Base64Helper();

  let pubKeyUint8Array: Uint8Array = await base64Helper.decode(pubKeyStr)
  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyUint8Array }

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

  let keyPair = await rsaGenerator.convertKey(pubKeyBlob, null);

  let cipher = cryptoFramework.createCipher(`RSA1024|NoPadding`); // 报错,不能完成RSA加密

  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.pubKey, null);

  let plainTextBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(encryptStr, 'utf-8').buffer) };

  let encryptBlob = await cipher.doFinal(plainTextBlob);

  const encryptedString = await base64Helper.encodeToString(encryptBlob.data)
  return encryptedString
}

更多关于HarmonyOS鸿蒙Next中RSA加密如何指定填充模式为不填充的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

NoPadding不带填充,输入的数据必须与RSA钥模(即RSA模数n的字节长度)一样长,输出数据长度与RSA钥模一样长。

RSA公钥长度通常为1024位或2048位,如果你选择不填充需要满足公钥达到相应长度,建议您使用PKCS1填充更安全。

更多关于HarmonyOS鸿蒙Next中RSA加密如何指定填充模式为不填充的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,RSA加密默认使用PKCS1填充模式。若需指定填充模式为不填充,可使用Cipher类并设置NoPadding参数。具体代码如下:

import ohos.security.cipher.Cipher;
import ohos.security.cipher.CipherSpec;
import ohos.security.cipher.KeySpec;
import ohos.security.cipher.RSAKeyGenParameterSpec;

public class RSANoPaddingExample {
    public static void main(String[] args) {
        try {
            // 生成RSA密钥对
            KeySpec keySpec = new RSAKeyGenParameterSpec(2048);
            Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");

            // 初始化Cipher为加密模式
            cipher.init(Cipher.ENCRYPT_MODE, keySpec.getPublicKey());

            // 加密数据
            byte[] plainText = "Hello, HarmonyOS".getBytes();
            byte[] encryptedText = cipher.doFinal(plainText);

            // 输出加密结果
            System.out.println("Encrypted Text: " + new String(encryptedText));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,Cipher.getInstance("RSA/ECB/NoPadding")指定了RSA加密模式为ECB且无填充。注意,使用无填充模式时,输入数据的长度必须与密钥长度一致。

在HarmonyOS鸿蒙Next中,使用RSA加密时,可以通过Cipher类指定填充模式。若需指定为不填充,可使用"RSA/ECB/NoPadding"模式。示例代码如下:

import ohos.security.cipher.Cipher;
import ohos.security.cipher.CipherSpec;
import java.security.KeyPair;
import java.security.KeyPairGenerator;

public class RSANoPaddingExample {
    public static void main(String[] args) throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048);
        KeyPair keyPair = keyGen.generateKeyPair();

        Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());

        byte[] data = "Hello, HarmonyOS!".getBytes();
        byte[] encrypted = cipher.doFinal(data);
        System.out.println("Encrypted: " + new String(encrypted));
    }
}

此代码展示了如何使用"RSA/ECB/NoPadding"模式进行RSA加密。注意,不填充模式要求输入数据长度必须与密钥长度一致。

回到顶部