• 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的长度

  • 相关阅读:
    8.存储器
    7.计算机的总线
    6.计算机的字符与编码集
    5.计算机的计量单位
    JAVA 实用插件
    并发(三)
    并发(二)
    Java 8 Lambda
    并发(一)
    Mybatis(七)-- LRU LFU 算法
  • 原文地址:https://www.cnblogs.com/smartrui/p/12020144.html
Copyright © 2020-2023  润新知