BouncyCastle库中实现的SM3摘要算法完全满足我们平时计算短数据及超大数据摘要的需求,主要使用方法就是三部曲
- init: 初始化
- update: 添加待计算数据,如果是大文件,可以循环N次update方法,将大文件一点点的添加进去
- 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
提示
不用担心大文件,一直调用update可能导致的内存溢出,或者占用大量内存问题。熟悉SM3算法或看过C语言版的实现的朋友应该清楚,待计算的数据满一个BlockSize也即64字节,算法内部就会计算一轮,所以无论添加多少数据,内存占用也就那几个寄存器和缓冲区的大小。
未经本人同意,禁止转载!