0%

PHP和Go之AES的CBC模式加解密

padding的填充方式可以根据自己需要修改

php

1
2
3
4
5
6
7
$key       = 'a7gE3fH9jKmN1pQ2rS4tU6vY8zW9xL0';
$iv = '7hJ3kQxZW45mNpR';
$data = '123456';
$encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
echo base64_encode($encrypted), PHP_EOL;
$decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
echo $decrypted;

go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/md5"
"encoding/base64"
"encoding/json"
"fmt"
)

func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padText := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padText...)
}

func PKCS7UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}

func AesEncryptCBC(orig string, key, iv string) string {
origData := []byte(orig)
k := []byte(key)

block, _ := aes.NewCipher(k)

blockSize := block.BlockSize()

origData = PKCS7Padding(origData, blockSize)

ivCopy := []byte(iv)
blockMode := cipher.NewCBCEncrypter(block, ivCopy[:blockSize])

cryted := make([]byte, len(origData))

blockMode.CryptBlocks(cryted, origData)
return base64.StdEncoding.EncodeToString(cryted)
}

func AesDecryptCBC(cryted string, key, iv string) string {
crytedByte, _ := base64.StdEncoding.DecodeString(cryted)
k := []byte(key)

block, _ := aes.NewCipher(k)

blockSize := block.BlockSize()

ivCopy := []byte(iv)
blockMode := cipher.NewCBCDecrypter(block, ivCopy[:blockSize])

orig := make([]byte, len(crytedByte))

blockMode.CryptBlocks(orig, crytedByte)

orig = PKCS7UnPadding(orig)
return string(orig)
}

func main() {
key := "a7gE3fH9jKmN1pQ2rS4tU6vY8zW9xL0"
iv := "7hJ3kQxZW45mNpR"
data := "123456"
encrypted := AesEncryptCBC(data, key, iv)
fmt.Println(encrypted)
decrypted := AesDecryptCBC(encrypted, key, iv)
fmt.Println(decrypted)
}