今天在使用go與php的AES加解密交互中,一直有個問題那就是在go中加密後,在php端始終都是無法解密,經過排查最後發現是加密key長度引起的問題, 這裡簡單記錄下。 go的AES使用的是第三方的庫, "openssl" ,因為用的匆忙,沒註意看文檔,所以就直接弄了示例代碼,才發現和php端無法解 ...
今天在使用go與php的AES加解密交互中,一直有個問題那就是在go中加密後,在php端始終都是無法解密,經過排查最後發現是加密key長度引起的問題, 這裡簡單記錄下。
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等模式。
我在php中因為沒有太在意這個長度,所以搞的32位,但由於我用的是ECB模式,所以其實32位的字元長度實際是截成16個字元了,那麼我在go中還配置成32個字元就不對了,直接在go中把key的長度改成php中配置的key的一半就行了,哎,你說這坑貨php,如果key配置不對提示下多好。
go代碼
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代碼
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的長度