HarmonyOS 鸿蒙Next:cryptoFramework RSA使用私钥加密数据,程序不运行

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

HarmonyOS 鸿蒙Next:cryptoFramework RSA使用私钥加密数据,程序不运行

RSA 使用公钥加密数据,私钥解密数据运行正常。

使用私钥加密数据程序不运行,请问是什么原因?

 let cipher = cryptoFramework.createCipher(‘RSA1024|PKCS1’);
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.priKey, null);


关于HarmonyOS 鸿蒙Next:cryptoFramework RSA使用私钥加密数据,程序不运行的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。

25 回复

升级HarmonyOS后,感觉手机的整体性能都有了很大的提升。

目前实际验证下来,最新版本的可以了,就是文档(HarmonyOS NEXT Developer Beta1)说明上可能有点歧义:

1、《使用RSA密钥对(PKCS1模式)签名验签》 -- 对应Android端的私钥签名验签

2、《使用RSA密钥对(PKCS1模式)签名及签名恢复》 -- 对应Android端的私钥加密解密

你用的是api 11吧

使用的5.0.0(12)

文档是,从目前看是公钥加密私钥解密的模式: 调用Cipher.init,设置模式为加密(CryptoMode.ENCRYPT_MODE),指定加密密钥(KeyPair.PubKey),初始化加密Cipher实例; 调用Cipher.init,设置模式为解密(CryptoMode.DECRYPT_MODE),指定解密密钥(KeyPair.PriKey)初始化解密Cipher实例

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

楼主解决了吗

没有解决,我没用cryptoFramework了 我用napi调用了openssl,用C实现的

大佬 求教程

请问解决了吗?同样的问题,已知公钥,不知道怎么转换

看到下面这个方法,但是还是报401参数错误,不着调怎么处理

@ohos.security.cert (证书模块)-安全-ArkTS接口参考-ArkTS API参考-HarmonyOS应用开发

同样的问题,业务场景需要,JAVA里可以,鸿蒙上不行。

哦,我以为是我使用的方法不对。看了半天,公钥加密数据和私钥加密数据,使用的方法是同一个,就参数不一样,不知道为啥就是不能用私钥加密,直接提示参数错误

大佬,求助下,已知公钥字符串,在鸿蒙怎么转成符合x509规范的二进制数据呢!

let strBuffer = buffer.from(pubKeyString, ‘utf-8’) let arrData = new Uint8Array(strBuffer.buffer) let rsaGenerator = cryptoFramework.createAsyKeyGenerator(“RSA1024”); let pubKeyBlob = { data: arrData }; let keyPair = await rsaGenerator.convertKey(pubKeyBlob, null); return keyPair.pubKey

我在文档看到这个转换方法,但是运行报错了,不知道啥原因

是不是code返回401;非法入参;arrData这个数组数据需要符合x509规范,应该是数组长度需要是162

私钥加密就是签名,否则单纯作为数据加密没有意义,公钥要分发,所有人都知道

这里的公私钥格式不同,不能调换使用

try catch一下 这里 await cipher1.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.priKey, null);私钥加密模式初始化出错了

我再试试看。现在业务场景就是单纯的用私钥加密数据,然后用公钥解密数据,不需要数据签名

移植的java代码是这样,运行是正常的。

// 使用私钥-加密数据
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
cipher.doFinal(data);

// 使用公钥-解密数据
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
cipher.doFinal(data);

可能公钥和私钥对象不一样

看了文档,数据加密和签名的操作是不一样的

数据加密:公钥加密、私钥解密

签名:私钥签名、公钥验证

let src = "hello123"
<span class="hljs-keyword">let</span> rsaGenerator = cryptoFramework.createAsyKeyGenerator(<span class="hljs-string">"RSA1024|PRIMES_2"</span>);
<span class="hljs-keyword">let</span> keyPair = await rsaGenerator.generateKeyPair();

<span class="hljs-keyword">let</span> srcData: cryptoFramework.DataBlob = { data: <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint8Array</span>(buffer.from(src, <span class="hljs-string">'utf-8'</span>).buffer) };

<span class="hljs-keyword">let</span> cipher1 = cryptoFramework.createCipher(<span class="hljs-string">"RSA1024|PKCS1"</span>);
await cipher1.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.priKey, <span class="hljs-literal">null</span>);
<span class="hljs-keyword">let</span> enResult = await cipher1.doFinal(srcData);
Log.info(<span class="hljs-string">"result123456"</span>, <span class="hljs-string">"encode success"</span>)

<span class="hljs-keyword">let</span> cipher2 = cryptoFramework.createCipher(<span class="hljs-string">"RSA1024|PKCS1"</span>);
await cipher2.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyPair.pubKey, <span class="hljs-literal">null</span>);
<span class="hljs-keyword">let</span> deResult = await cipher2.doFinal(enResult);
Log.info(<span class="hljs-string">"result123456"</span>, <span class="hljs-string">"decode success"</span>)

<span class="hljs-keyword">let</span> textDecoder =  util.TextDecoder.create(<span class="hljs-string">'utf-8'</span>, { ignoreBOM : <span class="hljs-literal">true</span> })
Log.info(<span class="hljs-string">"result123456"</span>, textDecoder.decodeWithStream(deResult.data))</code><button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button></pre>  <p>私钥加密,公钥解密,程序运行失败</p></div></div>

楼主 你解决了吗

回到顶部