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 @ 2024-11-16 13:54  Herenwei_Wayne  阅读(7)  评论(0编辑  收藏  举报