RSA的分段加密与解密
加密与解密是一个比较常见的场景,有的时候,待加密的文本可能很长很长,因此就有了分段加密/解密。
不说废话,直接来看代码:
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密钥每次加密生成的密文字节长度计算方式:密钥位数/8let 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
- 上一篇:sm4分段加解密
- 下一篇:TCP为啥需要"三次握手"与"四次挥手"?
