HarmonyOS 鸿蒙Next eftool-加密组件-RSA

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

HarmonyOS 鸿蒙Next eftool-加密组件-RSA
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

关于HarmonyOS 鸿蒙Next eftool-加密组件-RSA的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。

9 回复

<markdown _ngcontent-mof-c237="" class="markdownPreContainer">

大家好,本人是oh三方库eftool的作者,今天我们来了解eftool的加解密组件之RSA,常见的前后端请求保证数据安全性的做法除了采用AES对称加密,还可以使用非对称加密RSA,接下来我们进入到eftool的加密组件AES的使用,后续将会做成章节系列,欢迎大家踊跃提出意见和需求

本示例使用eftool版本为API11的1.1.12-1版本

首选需要引入RSA

 import {
  RSA
} from '[@yunkss](/user/yunkss)/eftool'
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

使用

1.使用1024位秘钥操作

generateRSAKey 生成秘钥

let rsa = await RSA.generateRSAKey();

this.message = rsa.getDataRow().publicKey;

生成的返回对象为eftool中的OutDTO对象,通过rsa.getDataRow().publicKey获取生成的公钥,通过rsa.getDataRow().privateKey获取生成的私钥 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

encodePKCS1 加密

let encode = await RSA.encodePKCS1('测试RSA-PKCS1加密字符串CSX~~', rsa.getDataRow().publicKey);

this.message = encode.getDataRow();

生成的返回对象为eftool中的OutDTO对象,encode.getDataRow()获取加密后的内容 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

encodePKCS1Segment 分段加密

let encode = await RSA.encodePKCS1Segment('测试RSA-1024-PKCS1分段加密字符串CSX测试RSA-1024-PKCS1分段加密字符串CSX测试RSA-1024-PKCS1分段加密字符串CSX测试RSA-1024-PKCS1分段加密字符串CSX测试RSA-1024-PKCS1分段加密字符串CSX测试RSA-1024-PKCS1分段加密字符串CSX测试RSA-1024-PKCS1分段加密字符串CSX测试RSA-1024-PKCS1分段加密字符串CSX~~', rsa.getDataRow().publicKey)

this.message = encode.getDataRow();

生成的返回对象为eftool中的OutDTO对象,encode.getDataRow()获取分段加密后的内容 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

decodePKCS1 解密


let decode = await RSA.decodePKCS1(encode.getDataRow(), rsa.getDataRow().privateKey);

this.message = decode.getDataRow();

生成的返回对象为eftool中的OutDTO对象,通过decode.getDataRow()获取解密后的内容 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

decodePKCS1Segment 分段解密

let decode = await RSA.decodePKCS1Segment(encode.getDataRow(), rsa.getDataRow().privateKey);

this.message = decode.getDataRow();

生成的返回对象为eftool中的OutDTO对象,通过decode.getDataRow()获取分段解密后的内容 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

signPKCS1 签名-PKCS1

let sign = await RSA.signPKCS1('这个是1024位RSA的验签字符串~~',rsa.getDataRow().privateKey);

this.message = sign.getDataRow();

生成的返回对象为eftool中的OutDTO对象,通过sign.getDataRow()获取签名后的内容 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

verifyPKCS1 验签-PKCS1

let verify = await RSA.verifyPKCS1(sign.getDataRow(),'这个是1024位RSA的验签字符串~~', rsa.getDataRow().publicKey);

this.message = verify.getMsg();

生成的返回对象为eftool中的OutDTO对象,通过verify.getMsg()获取验签的结果 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

2.使用2048位秘钥操作

generate2048RSAKey 生成秘钥

let rsa = await RSA.generate2048RSAKey();

this.message = rsa.getDataRow().publicKey;

生成的返回对象为eftool中的OutDTO对象,通过rsa.getDataRow().publicKey获取生成的公钥,通过rsa.getDataRow().privateKey获取生成的私钥 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

encode2048PKCS1 加密

let encode = await RSA.encode2048PKCS1('测试RSA-2048-PKCS1加密字符串CSX~~',rsa.getDataRow().publicKey);

this.message = encode.getDataRow();

生成的返回对象为eftool中的OutDTO对象,encode.getDataRow()获取加密后的内容 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

encode2048PKCS1Segment 分段加密

let encode = await RSA.encode2048PKCS1Segment('测试RSA-2048-PKCS1分段加密字符串CSX测试RSA-2048-PKCS1分段加密字符串CSX测试RSA-2048-PKCS1分段加密字符串CSX测试RSA-2048-PKCS1分段加密字符串CSX测试RSA-2048-PKCS1分段加密字符串CSX测试RSA-2048-PKCS1分段加密字符串CSX测试RSA-2048-PKCS1分段加密字符串CSX~~', rsa.getDataRow()
      .publicKey);

this.message = encode.getDataRow();

生成的返回对象为eftool中的OutDTO对象,encode.getDataRow()获取分段加密后的内容 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

decode2048PKCS1 解密


let decode = await RSA.decode2048PKCS1(encode.getDataRow(), rsa.getDataRow().privateKey);

this.message = decode.getDataRow();

生成的返回对象为eftool中的OutDTO对象,通过decode.getDataRow()获取解密后的内容 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

decode2048PKCS1Segment 分段解密

let decode = await RSA.decode2048PKCS1Segment(encode.getDataRow(), rsa.getDataRow().privateKey);

this.message = decode.getDataRow();

生成的返回对象为eftool中的OutDTO对象,通过decode.getDataRow()获取分段解密后的内容 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

sign2048PKCS1 签名-PKCS1

let sign = await RSA.signPKCS1('这个是2048位RSA的验签字符串~~',rsa.getDataRow().privateKey);

this.message = sign.getDataRow();

生成的返回对象为eftool中的OutDTO对象,通过sign.getDataRow()获取签名后的内容 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

verify2048PKCS1 验签-PKCS1

let verify = await RSA.verify2048PKCS1(sign.getDataRow(),'这个是2048位RSA的验签字符串~~', rsa.getDataRow().publicKey);

this.message = verify.getMsg();

生成的返回对象为eftool中的OutDTO对象,通过verify.getMsg()获取验签的结果 <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

服务器端pem密钥转换

pemToStrKey 将pem文件中的数据转换成公钥字符串支持1024/2048字节

let pubKey = RSA.pemToStrKey(`-----BEGIN PUBLIC KEY-----
                MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1nwHtqSbMNwjHKutrLUI
                +dMBCtoRb/SSY00ujBMsNPFdERxaizxgWVZbypVqgj3/4ZsZw9R65OyQu6oLqjA9
                Wk2nVLpPRtZNjwJgNRB4pYKf+RmLn35UdpIQC9/1+UUeoelboLEMCamCeXPCT5dv
                xqVheO+S6IOLiN6XGbkNZM2VBNtmAhIUVDLct2yH5YbD6plC8Tg+iMbiigG7r7Cs
                JE+Go5tb3BZjUYiF8fJ5ZKYCATkK4lO39rsXU8AAnw0duAq7LHk6xacwjyUA57S8
                0S3LFHcOyP7UoNfQ+cbV/z+72sYJV4RwO6AeE2Muz8jYR1GlcCW1wYBGNOpyRVKg
                4QIDAQAB
                -----END PUBLIC KEY-----`);

let encode = await RSA.encode2048PKCS1(‘测试2048位RSA-PKCS1加密字符串CSX~~’, pubKey);
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

服务器端往往可能会直接给前端pem文件,然后进行加解密,故需要特殊注意一下将pem转成秘钥字符串方法的使用,其中----BEGIN 和 ----END无需自行处理,pemToStrKey方法内部会进行替换

如果加解密的字符较大建议采用分段加密的方式,减少传输过程中的数据过大而引起的系列问题

通过本章内容,我们已经学会了RSA如何使用1024位和2048位的秘钥进行加解密签名以及验签,下一章节我们将学习ECDSA的使用

如果大家有新的需求,欢迎给eftool提出issueissue提交地址

</markdown>
请问如何修改RSA中改成自己的publicKey和privateKey?

试试 let str = “RSA密钥”; const base = new util.Base64Helper(); let prkArray = base.decodeSync(str); //str是RSA密钥 参考:【https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-crypto-architecture-17-V5

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

RSA.encode/decode中的第一个参数就是自己的publicKey和privateKey

感谢,这个试过了,不行,加密之后的密文在后端解密不出来。。。

希望HarmonyOS能加强与其他品牌设备的兼容性,让更多人受益。

回到顶部