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

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

相關文章
相關標籤/搜索