JS之间加解密,JS和Go通信加解密,JS和PHP通信加解密

本地引入

CryptoJS.min.js(网盘Tool下) <!--或者CDN-->
<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.min.js"></script>

  

// ****************************
// JS 对称加密算法
let pwd = CryptoJS.enc.Utf8.parse("666666"); // 解析明文
let key = CryptoJS.enc.Utf8.parse("abcd1234"); // 解析秘钥
let iv = CryptoJS.enc.Utf8.parse("666666"); // 解析偏移向量, CBC模式下用到, ECB模式不用

// JS AES CBC模式 加密
let ciphertext = CryptoJS.AES.encrypt(pwd, key, {
        mode: CryptoJS.mode.CBC,  // 加密模式
        padding: CryptoJS.pad.Pkcs7,  // 填充方式
        iv: iv  // 偏移向量
}).toString();

console.log(ciphertext)
// ciphertext结果为:p0h2lUuOAh4tmEN7FTLq8w==, base64的形式

// JS AES CBC模式 解密, 必须为base64格式才能解密,如果为16进制,需要先转为base64
let key = CryptoJS.enc.Utf8.parse("abcd1234"); // 解析秘钥
let iv = CryptoJS.enc.Utf8.parse("666666"); // 解析偏移向量, CBC模式下用到, ECB模式不用
let ciphertexts = CryptoJS.AES.decrypt("p0h2lUuOAh4tmEN7FTLq8w==", key, {
        mode: CryptoJS.mode.CBC,  // 加密模式
        padding: CryptoJS.pad.Pkcs7,  // 填充方式
        iv: iv  // 偏移向量
}).toString(CryptoJS.enc.Utf8);

console.log(ciphertexts)
// ****************************
// ****************************
// JS DES ECB模式 加密
function encryptByDES(message, key){
     let keyHex = CryptoJS.enc.Utf8.parse(key);
     let encrypted = CryptoJS.DES.encrypt(message, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
     });
     return encrypted.ciphertext.toString();
}
// JS DES ECB模式 解密
function decryptByDES(ciphertext, key){
     let keyHex = CryptoJS.enc.Utf8.parse(key);
     let decrypted = CryptoJS.DES.decrypt({
            ciphertext: CryptoJS.enc.Hex.parse(ciphertext)
     }, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
     });
      let result_value = decrypted.toString(CryptoJS.enc.Utf8);
      return result_value;
}
let message = '18616563858';//需要加密的数据
let key = 'pptv';//加密key
// JS DES 加密
desMessage = encryptByDES(message, key);
console.log(desMessage);
// JS DES 解密
message = decryptByDES(desMessage,key)
console.log(message);
// ****************************
// ****************************
// JS ECB模式 加密
var key = "abcd1234"
let ckey = CryptoJS.enc.Utf8.parse(key)
let encrypted = CryptoJS.AES.encrypt("TFT2020@ASX", ckey, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
  });
let hexstr = encrypted.ciphertext.toString()
console.log(hexstr); // 返回hex格式的密文

// PHP 解密
$mes = hex2bin("4b5bc2f487e7b081d1188beb4f0deb38");
$res = openssl_decrypt($mes, 'AES-128-ECB', "1234567890123456", OPENSSL_RAW_DATA);
echo $res; //输出admin
 // ****************************
// ****************************
var key = "abcd1234"
let string = "TFT2020SAC%&#"
let ivstr = "123456"
 let KeyHex = CryptoJS.enc.Utf8.parse(key)
let encrypted = CryptoJS.DES.encrypt(string,
        KeyHex, {
          mode: CryptoJS.mode.CBC,  // ecb模式不需要偏移量
          padding: CryptoJS.pad.Pkcs7,
          iv: CryptoJS.enc.Utf8.parse(ivstr)
  });
let hexstr = encrypted.ciphertext.toString() // 返回hex格式的密文
console.log(hexstr)

// PHP解密
$mes = hex2bin(hexstr);
$res = openssl_decrypt($mes, 'DES-CBC', "abcd1234", OPENSSL_RAW_DATA, "123456");
echo $res; //输出TFT2020SAC%&#
// ****************************
// ****************************
// PHP AES加密
$key = '1234567890123456'; //密钥,前后端双方事先约定好
$iv = '12345678'; //偏移量,前后端双方事先约定好,ecb模式不需要此参数
$message = "TFT202@S$%A";
$aes = openssl_encrypt($message, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
$rs = bin2hex($aes);
var_dump($rs);
    
// JS AES解密
let ckey = CryptoJS.enc.Utf8.parse("1234567890123456"); 
let ciphertext = CryptoJS.enc.Hex.parse("b9e1cab6e983ca5f0cc2f85e3df8de3b");
let srcs = CryptoJS.enc.Base64.stringify(ciphertext);
let decrypt = CryptoJS.AES.decrypt(srcs, ckey, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
  });
let decrypted = decrypt.toString(CryptoJS.enc.Utf8);
console.log(decrypted.toString(CryptoJS.enc.Utf8));
// ****************************
// ****************************
// PHP DES加密
$des = openssl_encrypt($message, 'DES-CBC', $key, OPENSSL_RAW_DATA, $iv);
$rs = bin2hex($des);
var_dump($rs);
    
// JS DES解密
let keyHex = CryptoJS.enc.Utf8.parse("1234567890123456")
let decrypted = CryptoJS.DES.decrypt({
    ciphertext: CryptoJS.enc.Hex.parse("7e001ef45efe287715a7f826fd9c9d46")
    }, keyHex, {
        iv: CryptoJS.enc.Utf8.parse("12345678"),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
  });
console.log(decrypted.toString(CryptoJS.enc.Utf8))
// ****************************

JS和Go通信加解密 DES_ECB

// ****************************
// JS DES ECB模式 加密
function encryptByDES(message, key){
        let keyHex = CryptoJS.enc.Utf8.parse(key);
        let encrypted = CryptoJS.DES.encrypt(message, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        return encrypted.ciphertext.toString();
}
// JS DES ECB模式 解密
function decryptByDES(ciphertext, key){
        let keyHex = CryptoJS.enc.Utf8.parse(key);
        let decrypted = CryptoJS.DES.decrypt({
            ciphertext: CryptoJS.enc.Hex.parse(ciphertext)
        }, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        let result_value = decrypted.toString(CryptoJS.enc.Utf8);
        return result_value;
}
let message = '18616563858';//需要加密的数据
let key = 'TSuiSHio';//加密key
// JS DES 加密
desMessage = encryptByDES(message, key);
console.log(desMessage);
// JS DES 解密
message = decryptByDES(desMessage,key)
message = decryptByDES("99DB561A3678B43352ECC40DC7519270", "TSuiSHio")
console.log(message);

// ****************************

// Go DES ECB加密
func EncryptDES_ECB(src, key string) string {
   data := []byte(src)
   keyByte := []byte(key)
   block, err := des.NewCipher(keyByte)
   if err != nil {
      panic(err)
   }
   bs := block.BlockSize()
   //对明文数据进行补码
   data = PKCS5Padding(data, bs)
   if len(data)%bs != 0 {
      panic("Need a multiple of the blocksize")
   }
   out := make([]byte, len(data))
   dst := out
   for len(data) > 0 {
      //对明文按照blocksize进行分块加密
      //必要时可以使用go关键字进行并行加密
      block.Encrypt(dst, data[:bs])
      data = data[bs:]
      dst = dst[bs:]
   }
   return fmt.Sprintf("%X", out)
}

// Go DES ECB解密
func DecryptDES_ECB(src, key string) string {
   data, err := hex.DecodeString(src)
   if err != nil {
      panic(err)
   }
   keyByte := []byte(key)
   block, err := des.NewCipher(keyByte)
   if err != nil {
      panic(err)
   }
   bs := block.BlockSize()
   if len(data)%bs != 0 {
      panic("crypto/cipher: input not full blocks")
   }
   out := make([]byte, len(data))
   dst := out
   for len(data) > 0 {
      block.Decrypt(dst, data[:bs])
      data = data[bs:]
      dst = dst[bs:]
   }
   out = PKCS5UnPadding(out)
   return string(out)
}

// *********************************************

//明文补码算法
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
   padding := blockSize - len(ciphertext)%blockSize
   padtext := bytes.Repeat([]byte{byte(padding)}, padding)
   return append(ciphertext, padtext...)
}

//明文减码算法
func PKCS5UnPadding(origData []byte) []byte {
   length := len(origData)
   unpadding := int(origData[length-1])
   return origData[:(length - unpadding)]
}
//=====调用=====
//key的长度必须都是8位
key := "TSuiSHio"
iv := "XadiousY"
info := "TiTAouA@loRoOiu"
 
Enc_str = EncryptDES_ECB(info, key)
fmt.Println(Enc_str)
Dec_str = DecryptDES_ECB(Enc_str, key)
fmt.Println(Dec_str)
Dec_str = DecryptDES_ECB("953c7eb7eb632a3f0e85f7f7cd3187a6", key)
fmt.Println(Dec_str)
//****************

Go AES DES加密

package main

import (
    "crypto/aes"
    "bytes"
    "encoding/base64"
    "crypto/cipher"
    "fmt"
    "crypto/des"
   "encoding/hex"
)

func main() {
    var aeskey = []byte("321423u9y8d2fwfl")
    pass := []byte("vdncloud123456")
    xpass, err := AesEncrypt(pass, aeskey)
    if err != nil {
        fmt.Println(err)
        return
    }

    pass64 := base64.StdEncoding.EncodeToString(xpass)
    fmt.Printf("加密后:%v
",pass64)

    bytesPass, err := base64.StdEncoding.DecodeString(pass64)
    if err != nil {
        fmt.Println(err)
        return
    }
    tpass, err := AesDecrypt(bytesPass, aeskey)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("解密后:%s
", tpass)


    //key的长度必须都是8位
    key := "TSuiSHio"
    iv := "XadiousY"
    info := "TiTAouA@loRoOiu"
 
    Enc_str := EncryptDES_CBC(info, key, iv)
    fmt.Println(Enc_str)
    Dec_str := DecryptDES_CBC(Enc_str, key, iv)
    fmt.Println(Dec_str)
 
    Enc_str = EncryptDES_ECB(info, key)
    fmt.Println(Enc_str)
    Dec_str = DecryptDES_ECB(Enc_str, key)
    fmt.Println(Dec_str)
    Dec_str = DecryptDES_ECB("953c7eb7eb632a3f0e85f7f7cd3187a6", key)
    fmt.Println(Dec_str)


}
// DES CBC加密
func EncryptDES_CBC(src, key, iv string) string {
   data := []byte(src)
   keyByte := []byte(key)
   block, err := des.NewCipher(keyByte)
   if err != nil {
      panic(err)
   }
   data = PKCS5Padding(data, block.BlockSize())
   //获取CBC加密模式
   ivk := []byte(iv) 
   mode := cipher.NewCBCEncrypter(block, ivk)
   out := make([]byte, len(data))
   mode.CryptBlocks(out, data)
   return fmt.Sprintf("%X", out)
}

// DES CBC解密
func DecryptDES_CBC(src, key, iv string) string {
   keyByte := []byte(key)
   data, err := hex.DecodeString(src)
   if err != nil {
      panic(err)
   }
   block, err := des.NewCipher(keyByte)
   if err != nil {
      panic(err)
   }
   ivk := []byte(iv) 
   mode := cipher.NewCBCDecrypter(block, ivk)
   plaintext := make([]byte, len(data))
   mode.CryptBlocks(plaintext, data)
   plaintext = PKCS5UnPadding(plaintext)
   return string(plaintext)
}

// DES ECB加密
func EncryptDES_ECB(src, key string) string {
   data := []byte(src)
   keyByte := []byte(key)
   block, err := des.NewCipher(keyByte)
   if err != nil {
      panic(err)
   }
   bs := block.BlockSize()
   //对明文数据进行补码
   data = PKCS5Padding(data, bs)
   if len(data)%bs != 0 {
      panic("Need a multiple of the blocksize")
   }
   out := make([]byte, len(data))
   dst := out
   for len(data) > 0 {
      //对明文按照blocksize进行分块加密
      //必要时可以使用go关键字进行并行加密
      block.Encrypt(dst, data[:bs])
      data = data[bs:]
      dst = dst[bs:]
   }
   return fmt.Sprintf("%X", out)
}

// DES ECB解密
func DecryptDES_ECB(src, key string) string {
   data, err := hex.DecodeString(src)
   if err != nil {
      panic(err)
   }
   keyByte := []byte(key)
   block, err := des.NewCipher(keyByte)
   if err != nil {
      panic(err)
   }
   bs := block.BlockSize()
   if len(data)%bs != 0 {
      panic("crypto/cipher: input not full blocks")
   }
   out := make([]byte, len(data))
   dst := out
   for len(data) > 0 {
      block.Decrypt(dst, data[:bs])
      data = data[bs:]
      dst = dst[bs:]
   }
   out = PKCS5UnPadding(out)
   return string(out)
}

// *********************************************

//明文补码算法
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
   padding := blockSize - len(ciphertext)%blockSize
   padtext := bytes.Repeat([]byte{byte(padding)}, padding)
   return append(ciphertext, padtext...)
}

//明文减码算法
func PKCS5UnPadding(origData []byte) []byte {
   length := len(origData)
   unpadding := int(origData[length-1])
   return origData[:(length - unpadding)]
}

// *********************************************

// AES 加密
func AesEncrypt(origData, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    blockSize := block.BlockSize()
    origData = PKCS5Padding(origData, blockSize)
    blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
    crypted := make([]byte, len(origData))
    blockMode.CryptBlocks(crypted, origData)
    return crypted, nil
}

// AES 解密
func AesDecrypt(crypted, key []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

    blockSize := block.BlockSize()
    blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
    origData := make([]byte, len(crypted))
    blockMode.CryptBlocks(origData, crypted)
    origData = PKCS5UnPadding(origData)
    return origData, nil
}

sha256(sha256.min.js网盘Tool下)

需要引入<script src='sha256.min.js'></script>

// *********************
    let param = {
          "acount": 100,
          "type": "1",
          "name": "linyifan",
          "bankCardNo": "6432323232323236563",
    }
    let paramStr = ksort(param)
    paramStr = JSON.stringify(paramStr)
    console.log(typeof paramStr)
    let secret = sha256(paramStr)
    param.sign = secret
    console.log(param)

    function ksort(o) {
        let sorted = {},
        keys = Object.keys(o);
        keys.sort();
        keys.forEach((key)=>{
            sorted[key] = o[key];
        })
        return sorted;
    }
    // *********************

    // *********************
    // PHP解密
    $data = [
        "acount"=> 100,
        "type"=> "1",
        "name"=> "linyifan",
        "bankCardNo"=> "6432323232323236563",
        "sign"=> "",
    ];
    $this->sha256_verify($data,$sign);
    public function sha256_verify($data,$sign){
        unset($data['sign']);
        ksort($data);
        $data = json_encode($data,JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES);
        print_r($data);
        print_r(hash("sha256", $data));die;
        if(hash("sha256",json_encode($data,JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES)) !== $sign){
            $this->wrtlog('data',json_encode($data,JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES));
            $this->wrtlog('sha256',hash("sha256",json_encode($data,JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES)));
            return false;
        }
        return true;
    }
    // *********************
 
原文地址:https://www.cnblogs.com/Essaycode/p/14661965.html