HarmonyOS 鸿蒙Next eftool-加密组件-RSA
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 联系官网客服。
<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>试试 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能加强与其他品牌设备的兼容性,让更多人受益。