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

RSA的分段加密与解密

07-11 SSL证书

加密与解密是一个比较常见的场景,有的时候,待加密的文本可能很长很长,因此就有了分段加密/解密。

不说废话,直接来看代码:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
 public static async rsaEncrypt(publicKey: string, plainText: cryptoFramework.DataBlob): Promise<cryptoFramework.DataBlob> {    let result: cryptoFramework.DataBlob = { data: new Uint8Array() };    try {      let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator(RSA2.ASY_KEY_NAME_RSA_3072);      let cipher = cryptoFramework.createCipher(RSA2.ALG_NAME_RSA_3072); //创建一个 Cipher (解密)对象      let plainTextSplitLen = 64;      let cipherText = new Uint8Array();      /* * 引入外部的公钥加密 * */      let publicKeyDataBlob :cryptoFramework.DataBlob = { data: base.decodeSync(publicKey) };      let keyGenPromise: cryptoFramework.KeyPair = await asyKeyGenerator.convertKey(publicKeyDataBlob, null);      await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyGenPromise.pubKey, null);      for (let i = 0; i < plainText.data.length; i += plainTextSplitLen) {        let updateMessage = plainText.data.subarray(i, i + plainTextSplitLen);        let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage };        // 将原文按64字符进行拆分,循环调用doFinal进行加密,使用1024bit密钥时,每次加密生成128字节长度的密文        let updateOutput = cipher.doFinalSync(updateMessageBlob);        let mergeText = new Uint8Array(cipherText.length + updateOutput.data.length);        mergeText.set(cipherText);        mergeText.set(updateOutput.data, cipherText.length);        cipherText = mergeText;      }      result.data = cipherText;    } catch (err) {      console.log(err.message)    }    return result;  }

代码说明:核心部分在这个for循环里,主要就是将待加密的内容循环加密,拼接成最终结果。

需要注意的是:cipher这个必须要init初始化,不然会报401错误

解密过程就是反着来

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
public static async rsaDecrypt(cipherText: cryptoFramework.DataBlob, privateKey: string): Promise<string> {    let result = '';    try {      let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator(RSA2.ASY_KEY_NAME_RSA_3072);      const privateKeyDataBlob: cryptoFramework.DataBlob = { data: base.decodeSync(privateKey) };      const keyPair = await asyKeyGenerator.convertKey(null, privateKeyDataBlob);      let cipher = cryptoFramework.createCipher(RSA2.ALG_NAME_RSA_3072); //创建一个 Cipher (解密)对象      await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyPair.priKey, null);      let cipherTextSplitLen = 128// RSA密钥每次加密生成的密文字节长度计算方式:密钥位数/8      let decryptText = new Uint8Array();      for (let i = 0; i < cipherText.data.length; i += cipherTextSplitLen) {        let updateMessage = cipherText.data.subarray(i, i + cipherTextSplitLen);        let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage };        // 将密文按128字节进行拆分解密,得到原文后进行拼接        // 将原文按117字符进行拆分,循环调用doFinal进行加密,使用1024bit密钥时,每次加密生成128字节长度的密文        let updateOutput = await cipher.doFinalSync(updateMessageBlob);        let mergeText = new Uint8Array(decryptText.length + updateOutput.data.length);        mergeText.set(decryptText);        mergeText.set(updateOutput.data, decryptText.length);        decryptText = mergeText;      }      let decryptBlob: cryptoFramework.DataBlob = { data: decryptText };        })      result = uint8ArrayToString(decryptText);//uint8Array转string    } catch (err) {      console.error(err.code)    }    return result;  }

代码说明:同样的,解密的过程核心也在这个for循环中,就是将加密得到的密文按照固定长度循环解密,再把每次解密的结果拼接起来

这样就可以进行分段加解密了。完工。

版权保护: 本文由 绿茶加糖-郭保升 原创,转载请保留链接: https://www.guobaosheng.com/tuijian/2025/0711/368.html