RSA的签名与验签
目前鸿蒙的算法库提供了2种RSA签名验签的填充模式:
1.PKCS1:即RFC3447规范中的RSAES-PKCS1-V1_5模式,对应OpenSSL中的RSA_PKCS1_PADDING。使用该模式时需要设置摘要(md),摘要算法输出的长度需要小于RSA密钥长度。例如RSA2048的密钥字节长度为256。
2.PSS:即RFC3447规范中的RSASSA-PSS模式,对应OpenSSL中的RSA_PKCS1_PSS_PADDING。使用该模式时需要设置两个摘要(md和mgf1_md),且md和mgf1_md长度之和需要小于RSA的密钥长度。例如RSA2048的密钥字节长度为256。
对于PKCS1填充模式的签名验签,文档也有:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-rsa-sign-sig-verify-pkcs1。分段签名验签过程也和SM4基本一致,这里介绍PSS填充模式的签名验签过程。
首先创建签名实例:
let signAlg = "RSA1024|PSS|SHA256|MGF1_SHA256";let signer = cryptoFramework.createSign(signAlg);
注意:这里createSign参数的格式为:算法|填充模式|摘要|掩码摘要 。
一定要init !!!
signer.initSync(keyPair.priKey);
分段过程:
let blockSize = 128;for (let i = 0; i < oriSignData.length; i+=blockSize) {const element = oriSignData.subarray(i,Math.min(i+blockSize,oriSignData.length));signer.updateSync({data:element})}let signedData = signer.signSync(null)
RSA的验签和SM2的过程也差不多
同样的,创建验签的实例并初始化:
let verifyAlg = "RSA1024|PSS|SHA256|MGF1_SHA256" //算法|填充模式|摘要|掩码摘要let verify = cryptoFramework.createVerify(verifyAlg);verify.initSync(keyPair.pubKey);
for (let i = 0; i < oriSignData.length; i+=blockSize) {const element = oriSignData.subarray(i,Math.min(i+blockSize,oriSignData.length))verify.updateSync({data:element})}this.signRes = verify.verifySync(null,signedData)
到这,就行了。RSA的签名验签就行了。
完整代码:
import { cryptoFramework } from '@kit.CryptoArchitectureKit';import { buffer } from '@kit.ArkTS';import { hilog } from '@kit.PerformanceAnalysisKit';struct RSAPage {message: string = 'RSA 签名与验签';signRes: boolean = false;encryptStr: string = "我是一段非常非常长的文本";build() {Column() {Text(this.message + "看看结果:" + this.signRes).id('RSAPageHelloWorld').fontSize(30).fontWeight(FontWeight.Bold)Button("签名和验签").onClick(() => {try {let oriSignData = new Uint8Array(buffer.from(this.encryptStr).buffer);let generator = cryptoFramework.createAsyKeyGenerator("RSA1024");let keyPair = generator.generateKeyPairSync();let signAlg = "RSA1024|PSS|SHA256|MGF1_SHA256" //算法|填充模式|摘要|掩码摘要let signer = cryptoFramework.createSign(signAlg);signer.initSync(keyPair.priKey);let blockSize = 128;for (let i = 0; i < oriSignData.length; i+=blockSize) {const element = oriSignData.subarray(i,Math.min(i+blockSize,oriSignData.length));signer.updateSync({data:element})}let signedData = signer.signSync(null)let verifyAlg = "RSA1024|PSS|SHA256|MGF1_SHA256" //算法|填充模式|摘要|掩码摘要let verify = cryptoFramework.createVerify(verifyAlg);verify.initSync(keyPair.pubKey);for (let i = 0; i < oriSignData.length; i+=blockSize) {const element = oriSignData.subarray(i,Math.min(i+blockSize,oriSignData.length))verify.updateSync({data:element})}this.signRes = verify.verifySync(null,signedData)}catch (e){hilog.info(0x0000,"ccTest",JSON.stringify(e))}})}.height('100%').width('100%')}}
版权保护: 本文由 绿茶加糖-郭保升 原创,转载请保留链接: https://www.guobaosheng.com/tuijian/2025/0711/365.html
- 上一篇:HTTPS通信时地址是加密的吗?
- 下一篇:sm2加解密和签名验签
