欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

GO与PHP的AES交互,key长度问题

程序员文章站 2022-07-09 20:18:14
今天在使用go与php的AES加解密交互中,一直有个问题那就是在go中加密后,在php端始终都是无法解密,经过排查最后发现是加密key长度引起的问题, 这里简单记录下。 go的AES使用的是第三方的库, "openssl" ,因为用的匆忙,没注意看文档,所以就直接弄了示例代码,才发现和php端无法解 ......

今天在使用go与php的aes加解密交互中,一直有个问题那就是在go中加密后,在php端始终都是无法解密,经过排查最后发现是加密key长度引起的问题, 这里简单记录下。

go的aes使用的是第三方的库,,因为用的匆忙,没注意看文档,所以就直接弄了示例代码,才发现和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的长度