SM4 golang 版和 php 版本加密后数据不一致,求指点
Closed this issue · 6 comments
yimingren30 commented
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加密的结果打出来看看
yimingren30 commented
在您的文档里看到这个关于 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了) 算出来的是一样的,
yimingren30 commented
大佬 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
yimingren30 commented
好的 谢谢喽