|  | @@ -1,155 +1,15 @@
 | 
	
		
			
				|  |  | -const PUBLIC_KEY = import.meta.env.VITE_PUBLIC_KEY
 | 
	
		
			
				|  |  | -const PRIVATE_KEY = import.meta.env.VITE_PRIVATE_KEY
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -let publicKey: CryptoKey
 | 
	
		
			
				|  |  | -let privateKey: CryptoKey
 | 
	
		
			
				|  |  | +import jsrsasign from 'jsrsasign'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -async function setPublicKey() {
 | 
	
		
			
				|  |  | -  const publicKeyBuffer = pemToBuffer(PUBLIC_KEY);
 | 
	
		
			
				|  |  | -  publicKey = await window.crypto.subtle.importKey(
 | 
	
		
			
				|  |  | -    "spki", // 这边如果私钥则是pkcs8
 | 
	
		
			
				|  |  | -    publicKeyBuffer,
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -      name: "RSA-OAEP",
 | 
	
		
			
				|  |  | -      hash: { name: 'SHA-256' },
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    true,
 | 
	
		
			
				|  |  | -    ["encrypt"] // 用于加密所以是公钥,私钥就是 decrypt
 | 
	
		
			
				|  |  | -  )
 | 
	
		
			
				|  |  | -  // console.log(publicKey)
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +const PUBLIC_KEY = import.meta.env.VITE_PUBLIC_KEY
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -async function setPrivateKey() {
 | 
	
		
			
				|  |  | -  const privateBuffer = pemToBuffer(PRIVATE_KEY);
 | 
	
		
			
				|  |  | -  privateKey = await window.crypto.subtle.importKey(
 | 
	
		
			
				|  |  | -    "pkcs8", // 这边如果私钥则是pkcs8
 | 
	
		
			
				|  |  | -    privateBuffer,
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -      name: "RSA-OAEP",
 | 
	
		
			
				|  |  | -      hash: { name: 'SHA-256' },
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    true,
 | 
	
		
			
				|  |  | -    ["decrypt"] // 用于加密所以是公钥,私钥就是 decrypt
 | 
	
		
			
				|  |  | -  )
 | 
	
		
			
				|  |  | -  // console.log(privateKey)
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +// 初始化RSA密钥对象
 | 
	
		
			
				|  |  | +const publicKey = jsrsasign.KEYUTIL.getKey(PUBLIC_KEY);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -setPublicKey()
 | 
	
		
			
				|  |  | -// setPrivateKey()
 | 
	
		
			
				|  |  | +console.log(publicKey)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// setTimeout(() => {
 | 
	
		
			
				|  |  | -//   // encrypt('asdfasdf').then(res => {
 | 
	
		
			
				|  |  | -//   //   console.log(res)
 | 
	
		
			
				|  |  | -//   // })
 | 
	
		
			
				|  |  | -//   decrypt('uts03JfyTGh/l8ivwQX/n9a6UpaVpfGgLaelrPfyMMdbslJmj79UNnv30NqktM7E6LhOyp4Ebt+EoJ8ss1FPyMlKpxwPHCFIanaClyR/aTCzeQGxVH2kZKJuZu02vrX1m2qXjn0Z1aV43GV5bNB40qPHzUZsMzMBHOqCAvqYO2zZwGpmFRFRu/93CPgpxgbhsbH7dCwOqJt9I7DMx9KaiiJmnPlbDSI4HG/wP/J2L1GHnZPK9zq+ccHm7WUYeVhf2xVYvma+hSzLWSiuwT1n5vRMIUKwjlT66usKJkEVhIiLTPmR6KLqEmWN21a/p6Dus/MCkFlA5hAURBalDqlnMQ==').then(res => {
 | 
	
		
			
				|  |  | -//     console.log(res)
 | 
	
		
			
				|  |  | -//   })
 | 
	
		
			
				|  |  | -// }, 300)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  export function encrypt(str: string) {
 | 
	
		
			
				|  |  | -  const enc = new TextEncoder()
 | 
	
		
			
				|  |  | -  const data = enc.encode(str) // 这边将要加密的字符串转为utf-8的Uint8Array
 | 
	
		
			
				|  |  | -  return new Promise(async (resolve) => {
 | 
	
		
			
				|  |  | -    const buffer = await window.crypto.subtle.encrypt(
 | 
	
		
			
				|  |  | -      {
 | 
	
		
			
				|  |  | -        name: "RSA-OAEP"
 | 
	
		
			
				|  |  | -      },
 | 
	
		
			
				|  |  | -      publicKey, // 生成或者导入的CryptoKey对象
 | 
	
		
			
				|  |  | -      data
 | 
	
		
			
				|  |  | -    )
 | 
	
		
			
				|  |  | -    const resStr = window.btoa(String.fromCharCode(...new Uint8Array(buffer)))
 | 
	
		
			
				|  |  | -    resolve(resStr)
 | 
	
		
			
				|  |  | -  })
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -export function decrypt(base64String: string) {
 | 
	
		
			
				|  |  | -  return new Promise(async (resolve) => {
 | 
	
		
			
				|  |  | -    const buffer = await window.crypto.subtle.decrypt(
 | 
	
		
			
				|  |  | -      {
 | 
	
		
			
				|  |  | -        name: "RSA-OAEP"
 | 
	
		
			
				|  |  | -      },
 | 
	
		
			
				|  |  | -      privateKey,
 | 
	
		
			
				|  |  | -      base64ToUint8Array(base64String)
 | 
	
		
			
				|  |  | -    )
 | 
	
		
			
				|  |  | -    const resStr = new TextDecoder().decode(buffer);
 | 
	
		
			
				|  |  | -    resolve(resStr)
 | 
	
		
			
				|  |  | -  })
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -function pemToBuffer(pem: string) {
 | 
	
		
			
				|  |  | -  const lines = pem.split('\n');
 | 
	
		
			
				|  |  | -  const encoded = lines.slice(1, -1).join('');
 | 
	
		
			
				|  |  | -  const decoded = window.atob(encoded);
 | 
	
		
			
				|  |  | -  const buffer = new Uint8Array(decoded.length);
 | 
	
		
			
				|  |  | -  for (let i = 0; i < decoded.length; ++i) {
 | 
	
		
			
				|  |  | -    buffer[i] = decoded.charCodeAt(i);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  return buffer.buffer
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -function base64ToUint8Array(base64String: string) {
 | 
	
		
			
				|  |  | -  const padding = '='.repeat((4 - base64String.length % 4) % 4)
 | 
	
		
			
				|  |  | -  const base64 = (base64String + padding).replace(/\-/g, '+').replace(/_/g, '/')
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  const rawData = window.atob(base64)
 | 
	
		
			
				|  |  | -  const outputArray = new Uint8Array(rawData.length)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  for (let i = 0; i < rawData.length; ++i) {
 | 
	
		
			
				|  |  | -    outputArray[i] = rawData.charCodeAt(i)
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  return outputArray
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -//#region 生成公钥私钥
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// generateKey()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -function generateKey() {
 | 
	
		
			
				|  |  | -  window.crypto.subtle.generateKey(
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -      name: "RSA-OAEP",
 | 
	
		
			
				|  |  | -      modulusLength: 2048,
 | 
	
		
			
				|  |  | -      publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
 | 
	
		
			
				|  |  | -      hash: {
 | 
	
		
			
				|  |  | -        name: "SHA-256" // 这边如果后端使用公钥加密,要注意与前端一致
 | 
	
		
			
				|  |  | -      },
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    true,
 | 
	
		
			
				|  |  | -    ["encrypt", "decrypt"] // must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
 | 
	
		
			
				|  |  | -  ).then(key => {
 | 
	
		
			
				|  |  | -    getPemText('spki', key.publicKey)
 | 
	
		
			
				|  |  | -    getPemText('pkcs8', key.privateKey)
 | 
	
		
			
				|  |  | -  })
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -function getPemText(type: "pkcs8" | "spki", key: CryptoKey) {
 | 
	
		
			
				|  |  | -  // 导出私钥
 | 
	
		
			
				|  |  | -  window.crypto.subtle.exportKey(type, key).then(function (res) {
 | 
	
		
			
				|  |  | -    const key = RSA2text(res, type) // 私钥pem
 | 
	
		
			
				|  |  | -    console.log(key)
 | 
	
		
			
				|  |  | -    console.log(key.length)
 | 
	
		
			
				|  |  | -  }).catch(function (err) {
 | 
	
		
			
				|  |  | -    console.error(err)
 | 
	
		
			
				|  |  | -  })
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// pem格式文本
 | 
	
		
			
				|  |  | -function RSA2text(buffer: ArrayBuffer, type: "pkcs8" | "spki") {
 | 
	
		
			
				|  |  | -  const isPrivate = type === 'pkcs8'
 | 
	
		
			
				|  |  | -  let binary = ''
 | 
	
		
			
				|  |  | -  const bytes = new Uint8Array(buffer)
 | 
	
		
			
				|  |  | -  const len = bytes.byteLength
 | 
	
		
			
				|  |  | -  for (let i = 0; i < len; i++) {
 | 
	
		
			
				|  |  | -    binary += String.fromCharCode(bytes[i])
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  const base64 = window.btoa(binary)
 | 
	
		
			
				|  |  | -  console.log(base64)
 | 
	
		
			
				|  |  | -  console.log('\n')
 | 
	
		
			
				|  |  | -  let text = "-----BEGIN " + (isPrivate ? "PRIVATE" : "PUBLIC") + " KEY-----\n" // 这里-----BEGIN和-----是固定的
 | 
	
		
			
				|  |  | -  text += base64.replace(/[^\x00-\xff]/g, "$&\x01").replace(/.{64}\x01?/g, "$&\n") // 中间base64编码
 | 
	
		
			
				|  |  | -  text += "\n-----END " + (isPrivate ? "PRIVATE" : "PUBLIC") + " KEY-----" // 这里-----END和-----是固定的
 | 
	
		
			
				|  |  | -  return text
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -//#endregion
 | 
	
		
			
				|  |  | +  const encrypted = jsrsasign.KJUR.crypto.Cipher.encrypt(str, publicKey, 'RSAOAEP256');
 | 
	
		
			
				|  |  | +  const resStr = jsrsasign.hextob64(encrypted)
 | 
	
		
			
				|  |  | +  return resStr
 | 
	
		
			
				|  |  | +}
 |