GO-使用golang解密使用php的openssl_encrypt加密的结果以及key的长度不满足要求时的处理方法
注:加密类型为AES-128-ECB的参考– https://blog.csdn.net/a_lzq/article/details/108392654
不同语言之间的通讯尤其涉及到标准加密的情况的时候往往有很多不标准的事情闹得人焦头烂额的.今天就在处理php和go的加密通讯的时候遇到了问题.
首先来看下正常的情况下的通讯
php加密部分
<?php
$iv = "1234567890abcdef";
$key = "abcdef1234567890";
//使用OPENSSL_RAW_DATA,多一次转换,方便说明白通讯过程
echo base64_encode(openssl_encrypt("hello world", "AES-128-CBC", $key, OPENSSL_RAW_DATA, $iv));
结果
CtqXZg7SH5ACIK7gWwOu4w==
go解密部分
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
)
func main() {
originData , _ := base64.StdEncoding.DecodeString( "CtqXZg7SH5ACIK7gWwOu4w==" )
iv := []byte("1234567890abcdef")
keyByteString := "abcdef1234567890"
cipherBlock, err := aes.NewCipher([]byte(keyByteString))
if err != nil{
fmt.Println(err)
}
cipher.NewCBCDecrypter(cipherBlock, iv).CryptBlocks(originData, originData)
fmt.Println(string(PKCS5UnPadding(originData)))
}
//这个方法是直接找的网上的实现
func PKCS5UnPadding(src []byte) []byte {
length := len(src)
unpadding := int(src[length-1])
if length - unpadding < 0 {
return []byte("")
<