首先引入依赖
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.66</version>
</dependency>
SM3工具类,对文件进行摘要
package com.tencent.tusi.common.utils;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.io.File;
import java.security.Security;
public class SM3Utils {
static {
Security.addProvider(new BouncyCastleProvider());
}
public static String encrypt(File contractFile){
String resultHexString = "";
byte[] srcData = Tools.File2byte(contractFile);
byte[] resultHash = hash(srcData);
resultHexString = ImageUtil.byte2HexStr(resultHash);
return resultHexString;
}
private static byte[] hash(byte[] srcData) {
SM3Digest digest = new SM3Digest();
digest.update(srcData,0,srcData.length);
byte[] hash = new byte[digest.getDigestSize()];
digest.doFinal(hash,0);
return hash;
}
}
上文中涉及到的文件转换成二进制和二进制转化成十六进制的工具方法
/**
* 将文件转换成byte数组
* @param tradeFile
* @return
*/
public static byte[] File2byte(File tradeFile){
byte[] buffer = null;
try
{
FileInputStream fis = new FileInputStream(tradeFile);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int n;
while ((n = fis.read(b)) != -1)
{
bos.write(b, 0, n);
}
fis.close();
bos.close();
buffer = bos.toByteArray();
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
return buffer;
}
public static String byte2HexStr(byte[] b) {
StringBuilder stringBuilder = new StringBuilder("");
for (int n = 0; n < b.length; n++){
int v = b[n] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
测试方法
@Test
public void sm3Test(){
String result = "";
File file = new File("D:\\83F586C703543759A762DBB5E40CBAE0.pdf");
result = SM3Utils.encrypt(file);
System.out.println(result);
}