BouncyCastle库中实现的SM3摘要算法完全满足我们平时计算短数据及超大数据摘要的需求,主要使用方法就是三部曲

  1. init: 初始化
  2. update: 添加待计算数据,如果是大文件,可以循环N次update方法,将大文件一点点的添加进去
  3. doFinal: 计算最终结果

代码不多,就直接上了:

/**
 * 摘要算法测试
 */
@Test
public void testSM3() {
    try {
        SM3Digest sm3Digest = new SM3Digest();
        // SM3 512比特为一组(64字节),满一组计算一次,所以直接调它的update方法,不用担心内存问题
        sm3Digest.update(new byte[]{0x61, 0x62, 0x63}, 0, 3);
        byte[] resultBytes = new byte[32];
        sm3Digest.doFinal(resultBytes, 0);

        Assert.assertArrayEquals(resultBytes, Hex.decodeStrict("66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0"));
    }catch (Exception ex) {
        Assert.fail(ex.getMessage());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

提示

不用担心大文件,一直调用update可能导致的内存溢出,或者占用大量内存问题。熟悉SM3算法或看过C语言版的实现的朋友应该清楚,待计算的数据满一个BlockSize也即64字节,算法内部就会计算一轮,所以无论添加多少数据,内存占用也就那几个寄存器和缓冲区的大小。