所有内容均为测试可用,真实
当前位置:绿茶加糖-郭保升 > SSL证书 > 正文

RSA的签名与验签

07-11 SSL证书

目前鸿蒙的算法库提供了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';@Entry@Componentstruct RSAPage {  @State messagestring = 'RSA 签名与验签';  @State signResboolean = false;  encryptStrstring = "我是一段非常非常长的文本";  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