javascript
go、JS AES(CBC模式)加密解密兼容
js 代碼:
<!DOCTYPE html> ?
<html lang="en"> ?
<head> ?
? ? <meta charset="UTF-8"> ?
? ? <title>Title</title> ?
??
</head> ?
<script src="aes/aes.js"></script> ?
<!--
<script src="components/pad-zeropadding.js"></script> ?
-->
<body> ?
<script>?
? ? var key = CryptoJS.enc.Utf8.parse("7971267812365mn8");
? ? var plaintText = 'hello world'; // 明文
? ? var iv=key; ?//16位字符串
? ? var encryptedData = CryptoJS.AES.encrypt(plaintText, key, {
? ? ? ? iv: ?key,
? ? ? ? mode: CryptoJS.mode.CBC, ?
? ? ? ? padding: CryptoJS.pad.Pkcs7
? ? }); ?
??
? ? console.log("加密前:"+plaintText); ?
? ? console.log("加密后:"+encryptedData); ? ?//Pkcs7: ? WoCzvm6eZiM4/bx5o/CzGw==
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //ZeroPadding : ? cUYmaJktt7P+dqv+Ijds9g==
? ? console.log("加密后 base64:"+encryptedData.ciphertext.toString(CryptoJS.enc.Base64));
? ? encryptedData = encryptedData.ciphertext.toString(); ?
? ? console.log("解密前-no-hex:"+encryptedData);?
? ? var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedData); ?
? ? console.log("解密前hex:"+encryptedHexStr);?
? ? var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); ?
? ? console.log("解密前:"+encryptedBase64Str); ?
? ? var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, {
? ? ? ? iv: ?key,
? ? ? ? mode: CryptoJS.mode.CBC, ?
? ? ? ? padding: CryptoJS.pad.Pkcs7 ?
? ? }); ?
??
? ? var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); ?
? ? console.log("解密后:"+decryptedStr); ?
</script> ?
</body> ?
</html>
go代碼:
package main
import (
? ? "bytes"
? ? "crypto/aes"
? ? "crypto/cipher"
? ? "en_de/cryption"
? ? "encoding/base64"
? ? "fmt"
)
func testAes111() {
? ? // AES-128。key長度:16, 24, 32 bytes 對應 AES-128, AES-192, AES-256
? ? key := []byte("7971267812365mn8")
? ? result, err := AesEncrypt([]byte("hello world"), key)
? ? if err != nil {
? ? ? ? panic(err)
? ? }
? ? fmt.Println("加密后:",base64.StdEncoding.EncodeToString(result)) ? ?//zero UR5c4C1iW5mIdxrv5rxo4w==,pkcs jE7BUAKWpdJWb2ulcFWd/g== ?和pthon,js相同
? ? origData, err := AesDecrypt(result, key)
? ? if err != nil {
? ? ? ? panic(err)
? ? }
? ? fmt.Println("解密后:",string(origData))
}
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)
? ? //origData = ZeroPadding(origData, block.BlockSize())
? ? blockMode := cipher.NewCBCEncrypter(block, key[:blockSize]) ?//iv=key
? ? crypted := make([]byte, len(origData))
? ? // 根據CryptBlocks方法的說明,如下方式初始化crypted也可以
? ? // crypted := origData
? ? blockMode.CryptBlocks(crypted, origData)
? ? return crypted, nil
}
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))
? ? // origData := crypted
? ? blockMode.CryptBlocks(origData, crypted)
? ? origData = PKCS5UnPadding(origData)
? ? // origData = ZeroUnPadding(origData)
? ? return origData, nil
}
func ZeroPadding(ciphertext []byte, blockSize int) []byte {
? ? padding := blockSize - len(ciphertext)%blockSize
? ? padtext := bytes.Repeat([]byte{0}, padding)
? ? return append(ciphertext, padtext...)
}
func ZeroUnPadding(origData []byte) []byte {
? ? length := len(origData)
? ? unpadding := int(origData[length-1])
? ? return origData[:(length - unpadding)]
}
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 次
? ? unpadding := int(origData[length-1])
? ? return origData[:(length - unpadding)]
}
func main() {
? ? testAes111()
? ? return
}
總結
以上是生活随笔為你收集整理的go、JS AES(CBC模式)加密解密兼容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VIRTIO 前后端驱动中 GPA,HV
- 下一篇: 基于Android的手机点名签到学生请假