jsencrypt rsa 中文 分片

<template>
  <div>
    <h1>RSA 分块加解密 Demo</h1>
    <textarea v-model="text" placeholder="输入要加密的文本"></textarea>
    <button @click="encryptText">加密</button>
    <p>加密后的文本(Base64 编码):{{ encryptedText }}</p>
    <button @click="decryptText">解密</button>
    <p>解密后的文本:{{ decryptedText }}</p>
  </div>
</template>

<script>
import JSEncrypt from 'jsencrypt';

export default {
  data() {
    return {
      text: 'RSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 DemoRSA 分块加解密 Demo',
      encryptedText: '',
      decryptedText: '',
      publicKey: `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArgbzDkO1fpSJQTFI4U8eCJKNSOsYUfsxNF/Xsy/cShDpCAYQpKGFaexXinAw29TGykF9yX/ZkqL4Vnz3/f1PU/WVvfhJ5CG48NJh1HCiyE8SJDy5bNULs2krYtvoh05rypJX9g7h+ugzfu1QTpxloYjmonwENpaFv2lwTugcD2hjoCxo+UJUumlP/Z8hZ62MNtWDRgU9mgwKK6zOnIiw1nS/MYP+Kde9N5N+9aVE+ILvA8IDXXstPC28AkjSyeoSVlZyGIWDQMxi3ePDo1HOepffsW4utp74xDCH60ImwgpZmeoIH8Sa9g5Oyv0aRLkxMOLjZqbtMOczAReAJvrzbwIDAQAB`,
      privateKey: `MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCuBvMOQ7V+lIlBMUjhTx4Iko1I6xhR+zE0X9ezL9xKEOkIBhCkoYVp7FeKcDDb1MbKQX3Jf9mSovhWfPf9/U9T9ZW9+EnkIbjw0mHUcKLITxIkPLls1QuzaSti2+iHTmvKklf2DuH66DN+7VBOnGWhiOaifAQ2loW/aXBO6BwPaGOgLGj5QlS6aU/9nyFnrYw21YNGBT2aDAorrM6ciLDWdL8xg/4p1703k371pUT4gu8DwgNdey08LbwCSNLJ6hJWVnIYhYNAzGLd48OjUc56l9+xbi62nvjEMIfrQibCClmZ6ggfxJr2Dk7K/RpEuTEw4uNmpu0w5zMBF4Am+vNvAgMBAAECggEACHmHKZkrg/wIyRd01KANNt6oKbZlK0zfwwytzOiWQjcbmgvtkI7bF+LuCmxXPMVaXuwci40B0+3CyTdxvjkxPUX24lbuhkEMKBIeuIE5tCaBnCkm4IFpffWvqrNJ2hj8D9Pbm7xyzcy0AUjeQc3E9z5a+OuwKtZesgkY8obEIw3eSJ+jShMUTZp/hx7zxtxziYFYj7RAKuRamRTuJcn2eTUpZtqx9ambDXLklKXhrXJS7er2Ev5jAKL/eh+21OS2oMcQlrCP9jRFygxv41hOhbAn3/F3KVM6uEE3T7jtEBks2L5KdwuNEfvDSeJsDxeEcHu5Q+JwQKE6uYVIeal3RQKBgQDPgXR4fPYO6sE4fpocuUjpLJ+4nQO8UIS36RjHR2i59UCT+KpAIskEe9J+l0mT/2/bk6NWvGujFsp/COjkOgzd3uNGxlAfjBVbwuaKRmtyD68iCCiLtr0ir2fj+65LQ29A/uHYfrnGnAu5uy7l2RXKas6G0IpohQ2GzPAo16irjQKBgQDWso63hGj1bEne+fzihoJIpKt1eEqhKRSoVXdVhc4qhfNZEAOrJhg/7ZxXegjio3yvtrdSCDfETHONawV0glg1wDAKp2w+OZv01MjZmyEq93fgQ+VAmEu2wl62tezpP8eorL9/DZwBgkAVeJZCvMSG5ibUsl7DZHZM4/rnQbCd6wKBgGp2KKOIuVV97BRoH/mMtnOriWbWaAw941nYJfZYFMsToUZJ1k+BiVDblmuMgxuDeohVfwAJO9A46Tuz/ojZn7BVopW1OXZ2EJ87p7xZ1NZ4ZYo4VVUZNICPLeYyQoIq3vGh042XtwjHFtz7xFv4vM1VbxCL/fcSDJaUnsLVopwhAoGBALIrnjp33O6G/krX5OBMRgRo+41R1YUm5WjI/G5xy2UIoqlvm8vFomwzEQKbWJJUoF3l4P5nqXfzBhX/EZjdrrx0kKnWxQJipqUojMHhdkYE9mubjL3tZS/238j68u+iqVu2eHjE34l1AR+QYgpiQym8B8+Ncwzt6yrmK0sM/bgfAoGBAKnAVUkmXuUaFJ7l0QkcVVAa5Uyzs4922WqBbBSQOOdVMVKzB0BvRpazUM/5geurAgpCV4Cs1w267D6AY5+gh+6eM5fCwzvttNdf3O2MyLz1w2z7AlPQhWTUJYkQ1FpvT0i8DV51NtcMM/pSZsFtizMIYd7jPfKz/QG5SafHiAqe`
    };
  },
  methods: {
    encryptLongText(text, publicKey) {
      const encrypt = new JSEncrypt({ default_key_size: 2048 });
      encrypt.setPublicKey(publicKey);
      //utf-8编码
      let bytes = new TextEncoder('utf-8').encode(text);
      //字节数组转base64
      const base64EncodedText = btoa(String.fromCharCode(...bytes));

      //分块 245字节
      let chunks = [];
      let offset = 0;
      while (offset < base64EncodedText.length) {
        let end = Math.min(offset + 245, base64EncodedText.length);
        chunks.push(base64EncodedText.slice(offset, end));
        offset = end;
      }

      //每块 rsa加密  return {string} the encrypted string encoded in base64
      let encryptedChunks = chunks.map(chunk => encrypt.encrypt(chunk));

      //base64 转 字符串 //atob == Base64格式转字符串编码
      encryptedChunks = encryptedChunks.map(chunk => atob(chunk));
      //拼接起来 字符串 转 最终base64
      return btoa(encryptedChunks.join(""));
    },
    decryptLongText(encryptedText, privateKey) {
      const decrypt = new JSEncrypt({ default_key_size: 2048 });
      decrypt.setPrivateKey(privateKey);

      //因为加密串为base64编码,需要将base64解码 //atob == Base64格式转字符串编码
      const base64DecodedText = atob(encryptedText);
      //分块 256字节
      let chunks = [];
      let offset = 0;
      while (offset < base64DecodedText.length) {
        let end = Math.min(offset + 256, base64DecodedText.length);
        //btoa == 字符串编码为Base64格式
        chunks.push(btoa(base64DecodedText.slice(offset, end)));
        offset = end;
      }

      //对每一块分别进行rsa解密
      let decryptedChunks = chunks.map(chunk => decrypt.decrypt(chunk));

      //将Base64编码的字符串转换回字节数组
      const decryptedBytes = Uint8Array.from(atob(decryptedChunks.join("")), c => c.charCodeAt(0));
      //使用TextDecoder将字节数组转换回UTF-8编码的字符串
      const decoder = new TextDecoder('utf-8');
      const decryptedText = decoder.decode(decryptedBytes);
      //转原始字符串
      return decryptedText;
    },
    encryptText() {
      this.encryptedText = this.encryptLongText(this.text, this.publicKey);
      this.decryptedText = '';
    },
    decryptText() {
      this.decryptedText = this.decryptLongText(this.encryptedText, this.privateKey);
    }
  }
};
</script>

<style scoped>
textarea {
  width: 100%;
  height: 100px;
  margin-bottom: 10px;
}

button {
  margin-right: 5px;
}
</style>
posted @   Herenwei_Wayne  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示