记录一下sm-crypto sm2算法踩的一个坑

记录一下sm-crypto sm2算法踩的一个坑

 次点击
9 分钟阅读

最近使用java写了一个程序,用到了sm2加密算法,使用的是hutool这个库

结果我把这个程序用typescript重写了之后服务端却解密失败了

经过排查,发现是java版本和ts版本的sm2加密结果不同

这里面由于sm2算法会添加随机数的特性,每次加密的结果本身就完全不同,因此我在这里卡了好久,最后才发现,ts可以解密ts加密的,java却不能解密ts加密的。。。

既然已经知道了是两个sm2算法不同,那么就要从sm2的格式、参数下手看看

先看sm2算法的解密实现(GMT_0003.4-2012):

可以看出,下面的计算步骤几乎是固定的,不同的实现应该不会产生差异,那么我们着重看一下B1这一步,看看GM/T 0003.1 2012中是怎么转换数据的。

到这里,我们可以分别用java和typescript生成一个密文,看一下具体的结构:

Java:

    public static void main(String[] args) throws IOException {
        SM2 sm2 = SmUtil.sm2("...");

        byte[] encrypt = sm2.encrypt("test".getBytes());
        System.out.println(Arrays.toString(encrypt));
    }

输出结果:4, -116, -34, -108, -32, -61, -92, 49, 6, -86, 103, 32, -116, -105, -25, 10, -107, 52, 100, -69, -7, -68, 116, -37, 34, -36, -18, -78, -37, 97, -46, -94, 78, 99, -110, 63, -82, 43, -38, 35, -25, -23, 108, 52, 2, -12, -6, -84, -124, -111, 52, 78, -51, 108, 101, 68, -77, 38, -63, -79, -22, -21, 2, 19, 15, 57, 85, 80, -13, -64, -48, 14, -6, 100, -2, 16, 125, 90, -63, 46, 68, 91, 36, 15, -30, 2, 53, -107, 119, -97, 112, 93, 20, 38, 103, -83, 83, 64, 111, 50, 51]

TypeScript

import { sm2 } from 'sm-crypto';

const sm2EncryptHex:string = sm2.doEncrypt("test", Buffer.from("...", 'base64').toString('hex'), 1);
const bytes:Buffer = Buffer.from(sm2EncryptHex, 'hex');
let out = "";
bytes.forEach(byte => {
    out += byte.toString(10) + " ";
});
console.log(out);

输出结果: `126 238 250 44 170 57 238 90 253 17 58 169 29 214 107 251 216 236 21 15 72 232 1 240 98 184 248 137 249 222 114 49 119 168 171 188 179 151 81 236 65 158 241 94 120 227 147 148 171 125 119 86 250 99 145 149 190 200 203 40 62 90 193 119 147 13 217 43 72 155 223 126 119 74 60 157 134 134 75 93 191 92 52 192 158 186 21 22 150 110 138 223 132 144 132 99 225 143 173

很显然,Java输出的结果是有一个字节表示密文压缩类型的,而ts的结果却没有!

到这一步,就很简单了,typescript的这个sm-crypto库,不知为何默认下是不会给密文前添加04前缀,声明该密文是未压缩的。

经过测试,手动给密文前添加一个字节04,即可用java代码正常解密ts加密的sm2密文

这个问题笔者排查了将近三个小时。。。最后甚至还是在AI的提示下才找到的问题。。。实在惭愧

在此记录一下,以后遇到类似的问题时调试起来不会再那么没有头绪。

参考资料:

https://www.gmssl.cn/gmssl/down/GMT_0003.1-2012.pdf

https://www.gmssl.cn/gmssl/down/GMT_0003.4-2012.pdf

© 本文著作权归作者所有,未经许可不得转载使用。