javaScript

加密解密

# 1. DES 加解密, 在线工具(http://tool.chacuo.net/cryptdes)

function desDecrypt(decodeTxt, key) {
  key =
    key.length >= 8 ? key.slice(0, 8) : key.concat('0'.repeat(8 - key.length))
  key = Buffer.from(key)
  const decipher = crypto.createDecipheriv('des-ecb', key, null)
  decipher.setAutoPadding(true)
  let decryptedData = decipher.update(decodeTxt, 'hex', 'utf-8')
  decryptedData += decipher.final('utf-8')
  return decryptedData
}

function desEncrypt(encodeText, key) {
  key = Buffer.from(key)
  const decipher = crypto.createCipheriv('des-ecb', key, null)
  let encryptedData: any = decipher.update(encodeText, 'utf-8', 'hex')
  encryptedData += decipher.final('hex')
  return encryptedData
}
import CryptoJS from 'crypto-js'
export async function desDecrypt(encryptedData, key, iv = null) {
  try {
    key = CryptoJS.enc.Utf8.parse(key)
    const encryptedText = CryptoJS.enc.Hex.parse(encryptedData)
    const decrypted = CryptoJS.DES.decrypt({ ciphertext: encryptedText }, key, {
      mode: CryptoJS.mode.ECB,
    })
    const decryptedText = decrypted.toString(CryptoJS.enc.Utf8)
    return decryptedText
  } catch (error) {
    console.error('Error decrypting error:', error.message)
  }
}

js浏览器中使用Buffer如下:
const encoder = new TextEncoder()
let text = encoder.encode('text')
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

public class DESEncryption {

    public static void main(String[] args) throws Exception {
        String key = "12345678"; // 8-character key
        String iv = "12345678";  // 8-character IV
        String plaintext = "Hello, DES!";

        byte[] encrypted = encrypt(plaintext, key, iv);
        System.out.println("Encrypted Text: " + bytesToHex(encrypted));
    }

    public static byte[] encrypt(String plaintext, String key, String iv) throws Exception {
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        SecretKey secretKey = SecretKeyFactory.getInstance("DES").generateSecret(new DESKeySpec(key.getBytes("UTF-8")));
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
        return cipher.doFinal(plaintext.getBytes("UTF-8"));
    }

    private static String bytesToHex(byte[] bytes) {
        StringBuilder result = new StringBuilder();
        for (byte b : bytes) {
            result.append(String.format("%02x", b));
        }
        return result.toString();
    }
}

# 2. aes 加解密

 decryptAes(encryptedData, key, iv: any = '') {
    iv = Buffer.from(key)
    key = Buffer.from(key)
    const decipher = createDecipheriv('aes-128-cbc', key, iv)
    decipher.setAutoPadding(true)
    let decrypted = decipher.update(encryptedData, 'hex', 'utf-8')
    decrypted += decipher.final('utf-8')
    return decrypted
    return this.restoreData(decrypted.toString())  // 删除偏移位置
  }

  aesEncrypt(encodeText, key) {
    key = Buffer.from(key)
    const decipher = createCipheriv('aes-128-cbc', key, key)
    let encryptedData: any = decipher.update(encodeText, 'utf-8', 'hex')
    encryptedData += decipher.final('hex')
    return encryptedData
  }

# 3. 加解密方法

import CryptoJS from 'crypto-js'

const iv = '你的密钥字符串'

export const encrypt = (value, key = iv) =>
  CryptoJS.AES.encrypt(value, key, { iv }).toString()
export const decrypt = (value, key = iv) =>
  CryptoJS.AES.decrypt(value, key, { iv }).toString(CryptoJS.enc.Utf8)
  • 3.1 使用
import { encrypt, decrypt } from '@/crypto.js'
let data = {
  //需要加密的内容
  id: '',
  token: ''
}
let setenCodeStr = encrypt(JSON.stringify(data), 'ueseInfo')
let getDecrypt = JSON.parse(decrypt(data.enCodeStr, 'ueseInfo'))

// 打开窗口到指定位置
let openedWindow
function openWin(
  url = 'http://xxxxx?info=setenCodeStr',
  name = '',
  iWidth = 560,
  iHeight = 579
) {
  let iTop = window.screen.availHeight - 30 - iHeight - 50

  let iLeft = window.screen.availWidth - 10 - iWidth - 30
  openedWindow = window.open(
    url,
    name,
    'height=' +
      iHeight +
      ',innerHeight= ' +
      iHeight +
      ',width=' +
      iWidth +
      ',innerWidth=' +
      iWidth +
      ',top=' +
      iTop +
      ',left=' +
      iLeft +
      ',status=no,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=0,titlebar=no'
  )
  window.localStorage.setItem('openedWindow', openedWindow)
}

# 4. url 传参注意

let url = 'U2FsdGVkX19Fo64gLtxluFe4WE6bhvOxZ+klqYm1+BhkoBC49TgQfPua4K3MgRgPEbYa/DMnAnR9DV8PRBysyQ=='
let str =  encodeURI(url)  //传参用
str=str.replace(/\%/g,'%25').replace(/\#/g,'%23').replace(/\+/g,'%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F').replace(' ','+').replace(/\?/g,'%3F').replace(/\&/g,'%26').replace(/\=/g,'%3D')  // url中特殊字符处理

window.location.href = `http://xxxxx?info=${str}`

decodeURI(route.query.info)  //取参数

1. +     URL+号表示空格 %2B
2. 空格  URL中的空格可以用+号或者编码 %20
3. /     分隔目录和子目录 %2F
4. ?     分隔实际的 URL 和参数 %3F
5. %     指定特殊字符 %25
6. #     表示书签 %23
7. &     URL中指定的参数间的分隔符 %26
8. =     URL中指定参数的值 %3D
上次更新: