GO與PHP的AES交互,key長度問題


今天在使用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的長度


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM