HarmonyOS 鸿蒙Next ArkTS不支持RSA公钥解密吗?有其他ohpm库可以用吗?求推荐
HarmonyOS 鸿蒙Next ArkTS不支持RSA公钥解密吗?有其他ohpm库可以用吗?求推荐
按照ArkTS API文档开发,使用rsa公钥解密后端传来的加密数据(后端私钥加密过的),cipher.init传入公钥时报错 “401, init failed.”
Dev 3.1.1 Release API9
记得js是有个node-rsa库支持RSA公钥解密的,不知道ohpm库有没有?
这边也遇到类型问题,花了几天找了个临时替代方案,就是使用 JSEncrypt
(1)首先参考 JSEncrypt如何集成在鸿蒙项目。进行集成
(2)JSEncrypt本身不支持RSA公钥进行解密,要进行改造。参考篇文章 改造JSEncrypt支持RSA公钥解密 里面的方法二
这边只用了 JSEncrypt 的公钥解密,测试是通过的。 其他使用鸿蒙官方API接口。感觉鸿蒙开发生态太差了, 这个小问题拖了我几天
膜拜大佬,真解出来了
我这边是基于API 9去改, 貌似后面版本, 语法严格很多, 可能走不通
在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 < (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算法试试看
那就难搞了,我也是卡这里了。
楼主解决了吗,我也卡在这里了
"[@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。