今天在使用go與php的AES加解密交互中,一直有個問題那就是在go中加密後,在php端始終都是沒法解密,通過排查最後發現是加密key長度引發的問題, 這裏簡單記錄下。php
go的AES使用的是第三方的庫,openssl,由於用的匆忙,沒注意看文檔,因此就直接弄了示例代碼,才發現和php端沒法解密,其實在文檔中它其實講的很清楚了, 「The length of the key can be 16/24/32 characters (128/192/256 bits)」,這個key的長度只能是16,24和32個字符,分別對應AES-128, AES-192, or AES-256等模式。git
我在php中由於沒有太在乎這個長度,因此搞的32位,但因爲我用的是ECB模式,因此其實32位的字符長度實際是截成16個字符了,那麼我在go中還配置成32個字符就不對了,直接在go中把key的長度改爲php中配置的key的一半就好了,哎,你說這坑貨php,若是key配置不對提示下多好。github
go代碼golang
func Encrypt(data map[string]interface{}) (s string) { src,_ :=json.Marshal(data) key := []byte("YzfNCQoF9P7tjwyZ") dst , err := openssl.AesECBEncrypt(src, key, openssl.PKCS7_PADDING) if err !=nil { fmt.Printf("encrypt error:%s" ,err) } fmt.Printf(SafeBase64Encode(base64.StdEncoding.EncodeToString(dst)) ) return SafeBase64Encode(base64.StdEncoding.EncodeToString(dst)) }
php代碼json
public static function encrypt($str, $key){ $encryptStr = openssl_encrypt($str, 'AES-128-ECB',$key,OPENSSL_RAW_DATA); return static::urlsafe_b64encode($encryptStr); }
總結:php與golang的AES, 要多注意下key的長度加密