lpilp/phpsm2sm3sm4

SM4 golang 版和 php 版本加密后数据不一致,求指点

Closed this issue · 6 comments

PHP demo 代码:

    $key = "0123456789abcdef";
    $iv = '0000000000000000';

    $sm4 = new RtSm4($key);
    $data = "123456";

    echo "==== test sm4 sm4-cbc============";
    echo "\nphp sm4:     ".$hex = $sm4->encrypt($data,'sm4-cbc',$iv); //default is cbc
    echo "\nphp decode:  ".$sm4->decrypt($hex,'sm4-cbc',$iv,'hex');

Golang demo 代码
jsonString := "123456"
errsm4, encryptdata := DoSm4Encrypt(jsonString)
if errsm4 != nil {
t.Log(errsm4)
return
}
t.Log(string(encryptdata))

--------------------------------------------------
     key        = "0123456789abcdef"
keyiv      = "0000000000000000"
// sm4 加密
    func DoSm4Encrypt(val string) (error, []byte) {
        byteKey := []byte(key)
        data := []byte(val)
        _ = sm4.SetIV([]byte(keyiv))
        ecbMsg, err := sm4.Sm4Cbc(byteKey, data, true) //sm4Ecb模式pksc7填充加密
        if err != nil {
	        println("DoSm4Decrypt err:", err)
	        return err, nil
        }
        return nil, ecbMsg
    }
      
    使用 golang 版本加密的值和 php 版本加密的值不一致,使用同样的 key 和 iv 
lpilp commented

你用的哪个go的库,我试试 或者你把go加密的结果打出来看看

https://github.com/tjfoc/gmsm

在您的文档里看到这个关于 golang的 ,在 php 和 golang 中使用相同的 key 和 iv 。
在golang中解密原始数据,解密也能获取到原始数据
使用 php 生成的串,使用 golang 解密失败

=== RUN TestSm4
sm_test.go:24: u�6���Ƿ�eW�g�R�
sm_test.go:26: 123456
sm_test.go:29:

lpilp commented

输入输出的格式不一样呢, 我这个加密输出是hex的, 解密输入也是 hex, go那个输入输出是 byte[], 相当于是bin格式, 你得格式转换下,PHP这个应该没有什么问题 ,与openssl(新版本openssl就支持sm4了) 算出来的是一样的,

大佬 golang 版本的有 https://github.com/tjfoc/gmsm 使用例子吗 ,结合 php 加解密

lpilp commented

没有,他那个项目里有一个sm4Test.go 文件,你按那个用法就行, 生成的不一样,可以转一下格式
对接双方用什么语言都无所谓,只要最后统一成一个格式就行

func hexStringToByte(hex string) []byte {
    h, err := hex.DecodeString(hex)
    if err != nil {
        log.Fatalf("hexStringToByte: %s", err)
    }
    return h
}

go的 hex转 []byte

好的 谢谢喽