bouncycastle中添加HMAC-SM3支持
一、
最近看完了PKCS#5中的内容,总结一下自己添加HMAC-SM3中遇到的问题和解决方法。
大概通读BC java源码以后,开始上手修改。
在SM3.java中添加如下代码:
/**
* SM3 HashMac
*/
public static class HashMac extends BaseMac {
public HashMac() {
super(new HMac(new SM3Digest()));
}
} public static class KeyGenerator extends BaseKeyGenerator {
public KeyGenerator() {
super("HMACSM3", 256, new CipherKeyGenerator());
}
} public static class Mappings extends DigestAlgorithmProvider {
private static final String PREFIX = SM3.class.getName(); public Mappings() {} @Override
public void configure(ConfigurableProvider provider) {
addHMACAlgorithm(provider, "SM3", PREFIX + "$HashMac", PREFIX + "$KeyGenerator");
addHMACAlias(provider, "SM3", GMObjectIdentifiers.hmac_sm3);
}
}
直接修改BC源码有一个问题,就是打包后无法使用java信任的签名签证。
所以找新的方法。。。
二、
新建项目->
新建SM3.java文件
import org.bouncycastle.asn1.gm.GMObjectIdentifiers;
import org.bouncycastle.crypto.CipherKeyGenerator;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
import org.bouncycastle.jcajce.provider.symmetric.util.BaseKeyGenerator;
import org.bouncycastle.jcajce.provider.symmetric.util.BaseMac; public class SM3 {
private SM3() {} /**
* SM3 HashMac
*/
public static class HashMac extends BaseMac {
public HashMac() {
super(new HMac(new SM3Digest()));
}
} public static class KeyGenerator extends BaseKeyGenerator {
public KeyGenerator() {
super("HMACSM3", 256, new CipherKeyGenerator());
}
} public static class Mappings extends DigestAlgorithmProvider {
private static final String PREFIX = SM3.class.getName(); public Mappings() {} @Override
public void configure(ConfigurableProvider provider) {
addHMACAlgorithm(provider, "SM3", PREFIX + "$HashMac", PREFIX + "$KeyGenerator");
addHMACAlias(provider, "SM3", GMObjectIdentifiers.hmac_sm3);
}
} }
新建DigestAlgorithmProvider.java文件
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
import org.bouncycastle.jcajce.provider.util.AlgorithmProvider; abstract class DigestAlgorithmProvider extends AlgorithmProvider {
protected void addHMACAlgorithm(ConfigurableProvider provider, String algorithm,
String algorithmClassName, String keyGeneratorClassName) {
String mainName = "HMAC" + algorithm; provider.addAlgorithm("Mac." + mainName, algorithmClassName);
provider.addAlgorithm("Alg.Alias.Mac.HMAC-" + algorithm, mainName);
provider.addAlgorithm("Alg.Alias.Mac.HMAC/" + algorithm, mainName);
provider.addAlgorithm("KeyGenerator." + mainName, keyGeneratorClassName);
provider.addAlgorithm("Alg.Alias.KeyGenerator.HMAC-" + algorithm, mainName);
provider.addAlgorithm("Alg.Alias.KeyGenerator.HMAC/" + algorithm, mainName);
} protected void addHMACAlias(ConfigurableProvider provider, String algorithm,
ASN1ObjectIdentifier oid) {
String mainName = "HMAC" + algorithm; provider.addAlgorithm("Alg.Alias.Mac." + oid, mainName);
provider.addAlgorithm("Alg.Alias.KeyGenerator." + oid, mainName);
}
}
新建测试类HmacTest.java
import java.security.MessageDigest;
import java.security.Security; import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex; public class HmacTest { static byte[] keyBytes = Hex.decode("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b");
static byte[] message = Hex.decode("4869205468657265"); public static void main(String[] args) throws Exception {
BouncyCastleProvider bcp = new BouncyCastleProvider();
Security.addProvider(bcp);
new SM3.Mappings().configure(bcp);
for (String s : Security.getAlgorithms("Mac")) {
if (s.contains("HMACSM3")) {
System.out.println(true);
break;
}
} HmacTest hmactest = new HmacTest();
hmactest.testHMac("HMAC-SM3");
} public void testHMac(String hmacName) throws Exception {
SecretKey key = new SecretKeySpec(keyBytes, hmacName);
byte[] out,out1; // SM3
MessageDigest sm3 = MessageDigest.getInstance("SM3", "BC");
out1 = sm3.digest(message);
System.out.println(Hex.toHexString(out1)); // HMAC-SM3
Mac mac = Mac.getInstance(hmacName, "BC");
mac.init(key);
mac.reset();
mac.update(message, 0, message.length);
out = mac.doFinal();
System.out.println(Hex.toHexString(out)); }
}
三、所有遇到的问题
1、abstract class DigestAlgorithmProvider
2、bcprov.jar不能放到java/jre/ext中,因为会loadSM3$Hmac.class,不然会报下面的exception。所以jar要和class使用相同的classloader。
Exception in thread "main" java.security.NoSuchAlgorithmException: class configured for Mac (provider: BC) cannot be found.
at java.security.Provider$Service.getImplClass(Provider.java:1649)
at java.security.Provider$Service.newInstance(Provider.java:1592)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:236)
at javax.crypto.JceSecurity.getInstance(JceSecurity.java:103)
at javax.crypto.Mac.getInstance(Mac.java:222)
at cn.com.infosec.HmacSM3.HmacTest.testHMac(HmacTest.java:37)
at cn.com.infosec.HmacSM3.HmacTest.main(HmacTest.java:30)
Caused by: java.lang.ClassNotFoundException: com.gsealy.HmacSM3.SM3X$HashMac
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.security.Provider$Service.getImplClass(Provider.java:1636)
... 6 more
具体classloader可以看http://blog.csdn.net/xyang81/article/details/7292380
bouncycastle中添加HMAC-SM3支持的更多相关文章
- KEIL4.12中添加ULINK2的支持
转载自:http://www.amobbs.com/thread-4767650-1-1.html 如果你用KEIL4.12,但却没有Ulink2下载器,只有早先用的Ulink下载器,那么你按照下面三 ...
- 一步一步在angular11中添加多语言支持
1.新建angular 2.添加@angular/localize ng add @angular/localize 3.设置默认locale_id,在app.module.ts中 import { ...
- Myeclipse中添加XFire插件支持
自Myeclipse7.5后貌似默认不启用XFire插件的集成 本人今天使用Myeclipse10.6是发现没有XFire 自己捣鼓捣鼓 已经成功添加XFire 添加步骤 1.打开Myeclipse ...
- eclipse中添加jstl标签支持(引入头)
https://blog.csdn.net/wangyuxuan_java/article/details/8580318
- IIS8中添加WCF支持几种方法小结[图文]
方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少 ...
- IIS配置svc(IIS8中添加WCF支持几种方法小结)
方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少 ...
- qemu中使用9p,支持host和guest中共享目录【转】
转自:https://blog.csdn.net/ayu_ag/article/details/52956351 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...
- 在pom包中添加spring-boot-starter-test包引用
有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...
- 为 ASP.NET Core (6.0)服务应用添加ApiKey验证支持
这个代码段演示了如何为一个ASP.NET Core项目中添加Apikey验证支持. 首先,通过下面的代码创建项目 dotnet new webapi -minimal -o yourwebapi 然后 ...
随机推荐
- L2-013 红色警报 (25分) 并查集复杂度
代码: 1 /* 2 这道题也是简单并查集,并查集复杂度: 3 空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(M Alpha(N)), 4 这里Alpha是 ...
- vi、wc、gzip、bzip2、tar、yum安装、dpek、用户信息操作等命令
命令模式 输入"dd"即可将这一行删除 按下"p"即可粘贴 插入模式: a:从光标这个位置之后插入 A:在行尾插入 i:从光标之前插入 I:行首插入 o:在光标 ...
- WPF 之路由事件和附加事件(六)
一.消息驱动与直接事件模型 事件的前身是消息(Message).Windows 是消息驱动的系统,运行其上的程序也遵循这个原则.消息的本质就是一条数据,这条消息里面包含着消息的类别,必要的时候还记 ...
- requests -- Python
使用requests方法后,会返回一个response对象,其存储了服务器响应的内容:如下r表示get请求后的响应对象r = requests.get('http://hz.58.com/sale.s ...
- k8s二进制部署 - node节点安装
创建kubelet配置 • set-cluster # 创建需要连接的集群信息,可以创建多个k8s集群信息 [root@hdss7-21 ~]# kubectl config set-cluster ...
- HDU - 4725 The Shortest Path in Nya Graph 【拆点 + dijkstra】
This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just ...
- Leetcode(11)-盛最多水的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线,使得 ...
- nodejs非安装版配置(windows)
nodejs官网下载地址: https://nodejs.org/en/download/ 解压到本地并配置环境变量 在环境变量path中新增 D:\develop\node 查看是否配置成功 至此n ...
- XSS脚本汇总
(1)普通的XSS JavaScript注入<SCRIPT SRC=http://***/XSS/xss.js></SCRIPT> (2)IMG标签XSS使用JavaScrip ...
- js inheritance all in one
js inheritance all in one prototype & proto constructor Object.definepropety Object.create() js ...