如何解决RSA加密报-1错误码问题
=================

#### 问题现象

使用RSA加密算法进行加密，执行后报-1错误码是什么原因？如何解决？

RSA公钥参数如下：

\-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuo5/hnnCOAERqdJwQM6Uwo2FZ
Gq/JHKRj43QnxxnxUIhnwaHH7PUv8V2v8pNdJl5NYD6qiEiD7i59HI0G5PSj3gjZ
4KuHy/RIN95BZyLtrg2BKzNiGvUV4IPFzE9ZAe0fcEvDPxGZn/vRWLRnQaEeYehc
OUkt2vbKPLwtTWKwzQIDAQAB
-----END PUBLIC KEY-----

报错信息截图如下：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/c1/v3/q8t_gVLoSfS35ABXJcJNLw/zh-cn_image_0000002658848479.png?HW-CC-KV=V1&HW-CC-Date=20260709T134157Z&HW-CC-Expire=86400&HW-CC-Sign=637B95D5BE8B64EA20DD87238C88529B52107644E703199ED4E0CAE7D7F7A49B "点击放大")

code = "-1"
message = "The input string contains unsupported characters"

#### 背景知识

[RSA](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-asym-encrypt-decrypt-spec#rsa)是一种非对称加解密算法，使用RSA算法进行加解密可以参考[使用RSA非对称密钥（PKCS1模式）加解密(ArkTS)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-rsa-asym-encrypt-decrypt-pkcs1)。

*   创建非对称密钥生成器实例API：[cryptoFramework.createAsyKeyGenerator](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-cryptoframework#cryptoframeworkcreateasykeygenerator)。
*   非对称密钥生成器密钥API：[AsyKeyGenerator.generateKeyPair](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-cryptoframework#generatekeypair-1)。
*   创建加解密实例API：[cryptoFramework.createCipher](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-cryptoframework#cryptoframeworkcreatecipher)。
*   初始化加解密实例对象API：[Cipher.init](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-cryptoframework#init-1)。
*   执行并结束加解密API：[Cipher.doFinal](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-cryptoframework#dofinal-1)。

#### 问题定位

1.  分析错误码-1，使用RSA加密时遇到错误码-1，这通常表示“ERR\_UNEXPECTED”，即遇到了一个未被预期或未被特定处理的问题。
2.  根据错误提示信息“The input string contains unsupported characters”可以进一步判断出报错原因是因为输入参数错误。
3.  RSA公钥加密输入参数为公钥和明文，明文传入后转换为Uint8Array数据类型，排除明文参数错误，可以确认报错是由传入的公钥参数导致。
4.  公钥数据中除公钥外尚有开头和结尾的标识符字符串，而RSA加密只需要公钥，最终可以确认报-1错误码是因为没有去除公钥数据首尾标识符导致。

#### 分析结论

RSA加密报-1错误码是因为没有对公钥数据进行去除首尾标识符，从而传入了错误的公钥参数，导致加密方法解析公钥参数失败。

#### 修改建议

将公钥数据去除'-----BEGIN PUBLIC KEY-----'和'-----END PUBLIC KEY-----'标识符后作为公钥参数执行RSA加密。

完整示例代码如下：

import { buffer, util } from '@kit.ArkTS';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';

_// RSA pubKey example. 实际使用需要更换自己的公钥PEM_
const pubKeyStr = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuo5/hnnCOAERqdJwQM6Uwo2FZ\\n' +
  'Gq/JHKRj43QnxxnxUIhnwaHH7PUv8V2v8pNdJl5NYD6qiEiD7i59HI0G5PSj3gjZ\\n' +
  '4KuHy/RIN95BZyLtrg2BKzNiGvUV4IPFzE9ZAe0fcEvDPxGZn/vRWLRnQaEeYehc\\n' +
  'OUkt2vbKPLwtTWKwzQIDAQAB';

_// RSA加密方法_
async function encryptRSA(message: string, pubKeyStr: string) {
  try {
    _// 初始化Base64工具实例_
    let base64Helper = new util.Base64Helper();
  _  // 公钥转换为Uint8Array，然后包装为DataBlob类型_
    let pubKeyBlob: cryptoFramework.DataBlob = { data: base64Helper.decodeSync(pubKeyStr) };
 _   // 创建RSA key生成器_
    let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
   _ // 将公钥包装数据pubKeyBlob转换成密钥对类型KeyPair_
    let keyPair = await rsaGenerator.convertKey(pubKeyBlob, null);
   _ // 创建Cipher对象_
    let cipher = cryptoFramework.createCipher('RSA1024|PKCS1');
    _// 初始化加密模式，指定密钥keyPair.pubKey_
    await cipher.init(cryptoFramework.CryptoMode.ENCRYPT\_MODE, keyPair.pubKey, null);
   _ // 包装要加密的明文_
    let plainTextBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
    _// 传入明文，获取加密后的数据_
    let encryptBlob = await cipher.doFinal(plainTextBlob);
   _ // 返回加密后的字符串_
    _// return base64Helper.encodeToStringSync(encryptBlob.data);_
    console.info(\`base64Helper: ${base64Helper.encodeToStringSync(encryptBlob.data)}\`);
  } catch (e) {
    console.error('\[base64Helper\] error');
  }
  return undefined;
}


@Entry
@Component
struct Index {
  build() {
    RelativeContainer() {
      Button('RSA加密')
        .fontSize($r('app.float.page\_text\_font\_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '\_\_container\_\_', align: VerticalAlign.Center },
          middle: { anchor: '\_\_container\_\_', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          encryptRSA('This is a test demo.', pubKeyStr);
        });
    }
    .height('100%')
    .width('100%');
  }
}

#### 总结

方法报错问题可以根据错误码和错误提示进行判断错误原因，进行排查修改。