HarmonyOS 鸿蒙Next ArkTS不支持RSA公钥解密吗?有其他ohpm库可以用吗?求推荐

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

HarmonyOS 鸿蒙Next ArkTS不支持RSA公钥解密吗?有其他ohpm库可以用吗?求推荐

按照ArkTS API文档开发,使用rsa公钥解密后端传来的加密数据(后端私钥加密过的),cipher.init传入公钥时报错 “401, init failed.”

Dev 3.1.1 Release   API9

记得js是有个node-rsa库支持RSA公钥解密的,不知道ohpm库有没有?

21 回复

这边也遇到类型问题,花了几天找了个临时替代方案,就是使用 JSEncrypt

(1)首先参考 JSEncrypt如何集成在鸿蒙项目。进行集成

(2)JSEncrypt本身不支持RSA公钥进行解密,要进行改造。参考篇文章 改造JSEncrypt支持RSA公钥解密 里面的方法二

这边只用了 JSEncrypt 的公钥解密,测试是通过的。 其他使用鸿蒙官方API接口。感觉鸿蒙开发生态太差了, 这个小问题拖了我几天

膜拜大佬,真解出来了

我这边是基于API 9去改, 貌似后面版本, 语法严格很多, 可能走不通

RSA加密解密api9一直能用啊。还有你这说法 “使用rsa公钥解密后端传来的加密数据(后端私钥加密过的)” ,公钥咋可能能解密后端私钥加密过的数据?

正常情况下的使用模式是:

公钥加密,私钥解密:发送方使用接收方的公钥加密数据,然后只有接收方能用自己的私钥解密这份数据,确保了数据的机密性。

在RSA等非对称加密算法中,私钥加密的数据理论上确实只能用对应的私钥解密。这是因为在非对称加密体系的设计中,公钥和私钥的数学关系是这样的:

私钥是保密的,由信息接收者持有。

公钥则是公开的,可以自由分发给任何需要与私钥持有者进行安全通信的实体。

在Java中,RSA加密算法确实允许你使用私钥进行加密,公钥进行解密,但这并不符合RSA加密的标准实践和推荐的安全模式。通常,RSA被设计为使用公钥进行加密,私钥进行解密,这是基于非对称加密的基本原则:公钥公开,用于加密;私钥保密,用于解密。如果私钥用于加密,那么理论上任何拥有公钥的人都能解密信息,会有安全问题。

这个说法不对吧,通常来说,客户端只保留有公钥,那么它应该支持公钥加密以上传数据,但是也需要公钥解密以支持解析拉取的数据。

import cryptoFramework from "@ohos.security.cryptoFramework"
import util from '@ohos.util'
export class RSA {
  async RSA(key:string){
    return RSADecode(key)
  }
}

let priKey =‘MIICdwI*****VFxBQ=’ let base = new util.Base64Helper(); // 字节流转成可理解的字符串 function uint8ArrayToString(array) { let arrayString = ‘’; for (let i = 0; i < array.length; i++) { arrayString += String.fromCharCode(array[i]); } return arrayString; }

// RSA 解密 export function RSADecode(key:string) {

let globalCipherOutput; let globalDecodeOutput; var globalKeyPair; let cipherTextSplitLen = 128; // RSA密钥每次加密生成的密文数据长度计算方式:密钥位数/8 let keyGenName = “RSA1024”; let cipherAlgName = “RSA1024|PKCS1”; let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator(keyGenName); // 创建非对称密钥生成器对象 let decoder = cryptoFramework.createCipher(cipherAlgName); // 创建解密Decoder对象 let privteKeyDataBlob: cryptoFramework.DataBlob = { data: base.decodeSync(priKey) }; return new Promise((resolve, reject) => { setTimeout(() => { resolve(“testRsaMultiDoFinal”); }, 10); }).then(() => { return asyKeyGenerator.convertKey(null, privteKeyDataBlob); }).then(KeyPair => { globalKeyPair = KeyPair; // 保存到密钥对全局变量 return; }).then(() =>{ return decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, globalKeyPair.priKey, null); }).then(async() => { key = key.split("\n").join(’’) let cipherData = await base.decodeSync(key) globalCipherOutput = Array.from(cipherData)

globalDecodeOutput = [];
<span class="hljs-comment"><span class="hljs-comment">// 将密文按128B进行拆分解密,得到原文后进行拼接</span></span>
<span class="hljs-keyword"><span class="hljs-keyword">for</span></span> (<span class="hljs-keyword"><span class="hljs-keyword">let</span></span> i = <span class="hljs-number"><span class="hljs-number">0</span></span>; i &lt; (globalCipherOutput.length / cipherTextSplitLen); i++) {
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> tempBlobData = globalCipherOutput.slice(i * cipherTextSplitLen, (i + <span class="hljs-number"><span class="hljs-number">1</span></span>) * cipherTextSplitLen);
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> message = <span class="hljs-keyword"><span class="hljs-keyword">new</span></span> <span class="hljs-built_in"><span class="hljs-built_in">Uint8Array</span></span>(tempBlobData);
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> tempBlob = { data : message };
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> tempDecodeOutput = await decoder.doFinal(tempBlob);
  globalDecodeOutput += uint8ArrayToString(tempDecodeOutput.data);
}
console.info(`encode and decode success`+globalDecodeOutput);
<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> globalDecodeOutput;

}).catch(error => { console.error(<span class="hljs-keyword"><span class="hljs-keyword">catch</span></span> error, ${error.code}, ${error.message}); }) } <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

磨了好几天 RSA 私钥分段解密终于可以用了,有需要的给你们参考

老哥,有RSA私钥分段加密的代码吗

楼主解决了吗,我也是使用公钥解密,现在在
init(opMode: CryptoMode, key: Key, params: ParamsSpec): Promise<void>;

这个方法的抱401

请问你解决了吗? 我是使用RSA私钥加密,然后用公钥解密,结果私钥加密这就卡住了。 难道鸿蒙RSA只能用公钥加密、私钥解密? android上的RSA是可以用私钥加密、公钥解密的。

这个问题咨询了华为的技术支持,反馈是说,rsa的私钥加密,公钥解密的,还在开发中,目前还不支持

好的,感谢回复。我准备用napi调用openssl库的RSA算法试试看

测试API 10也不支持,官方快支持啊,卡手了。

那就难搞了,我也是卡这里了。

楼主解决了吗

楼主解决了吗,我也卡在这里了

"[@ohos](/user/ohos)/crypto-js": "^2.0.3-rc.0",

这个库好像没有RSA加解密相关的API,只有AES/DES/MD5/HMAC等加解密

请问你是怎么解决的? 找到支持ArkTS的RSA算法库吗?我这边也有这个问题

HarmonyOS 鸿蒙Next ArkTS目前不支持RSA公钥解密,因为RSA加密标准实践是公钥加密、私钥解密。如果确实需要类似功能,建议检查算法设计或考虑使用其他加密库,如通过NAPI调用OpenSSL库等。暂无直接推荐的ohpm库支持RSA公钥解密。如果问题依旧没法解决,请加我微信,我的微信是itying888。

回到顶部