一、

最近看完了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支持的更多相关文章

  1. KEIL4.12中添加ULINK2的支持

    转载自:http://www.amobbs.com/thread-4767650-1-1.html 如果你用KEIL4.12,但却没有Ulink2下载器,只有早先用的Ulink下载器,那么你按照下面三 ...

  2. 一步一步在angular11中添加多语言支持

    1.新建angular 2.添加@angular/localize ng add @angular/localize 3.设置默认locale_id,在app.module.ts中 import { ...

  3. Myeclipse中添加XFire插件支持

    自Myeclipse7.5后貌似默认不启用XFire插件的集成  本人今天使用Myeclipse10.6是发现没有XFire 自己捣鼓捣鼓 已经成功添加XFire 添加步骤 1.打开Myeclipse ...

  4. eclipse中添加jstl标签支持(引入头)

    https://blog.csdn.net/wangyuxuan_java/article/details/8580318

  5. IIS8中添加WCF支持几种方法小结[图文]

    方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少 ...

  6. IIS配置svc(IIS8中添加WCF支持几种方法小结)

    方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少 ...

  7. qemu中使用9p,支持host和guest中共享目录【转】

    转自:https://blog.csdn.net/ayu_ag/article/details/52956351 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...

  8. 在pom包中添加spring-boot-starter-test包引用

    有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...

  9. 为 ASP.NET Core (6.0)服务应用添加ApiKey验证支持

    这个代码段演示了如何为一个ASP.NET Core项目中添加Apikey验证支持. 首先,通过下面的代码创建项目 dotnet new webapi -minimal -o yourwebapi 然后 ...

随机推荐

  1. fzu2198 快来快来数一数

    Accept: 204    Submit: 627 Time Limit: 1000 mSec    Memory Limit : 65536 KB  Problem Description n个六 ...

  2. Codeforces Round #651 (Div. 2) C. Number Game (博弈,数学)

    题意:对于正整数\(n\),每次可以选择使它变为\(n-1\)或者\(n/t\) (\(n\ mod\ t=0\)且\(t\)为奇数),当\(n=1\)时便不可以再取,问先手赢还是后手赢. 题解:首先 ...

  3. 向Pycharm中导入第三方包 && 更改Pycharm上镜像源

    一.Pycharm本身导包 下载成功会这个样子(如下图) 但是有时因为包的版本太高,代码运行出错,此时需要选中右下角的Specify version,然后选择想要的版本即可 如果还出错,那就在命令行下 ...

  4. 牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 B.牛牛摆放花 (贪心)

    题意;将一组数重新排序,使得相邻两个数之间的最大差值最小. 题解:贪心,现将所有数sort一下,然后正向遍历,将数分配到新数组的两端,然后再遍历一次维护一个最大值即可. 代码: class Solut ...

  5. Python基础--核心数据类型

    python的核心数据类型: Number 数字(整数,浮点数,复数,布尔型数) String 字符串 List 列表 Tuple 元组 Dictionary 字典 Set 集合 1. 整数(整型数) ...

  6. HTTP1.0和HTTP1.1以及HTTP2.0的区别

    (1)连接方面 HTTP1.0使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象.每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个对象,严重影响客户机和服务器的性能. H ...

  7. Gym 101174D Dinner Bet(概率DP)题解

    题意:n个球,两个人每人选C个球作为目标,然后放回.每回合有放回的拿出D个球,如果有目标球,就实现了这个目标,直到至少一个人实现了所有目标游戏结束.问结束回合的期望.误差1e-3以内. 思路:概率DP ...

  8. JS Object Deep Copy & 深拷贝 & 浅拷贝

    JS Object Deep Copy & 深拷贝 & 浅拷贝 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...

  9. Linux & terminal color & command line color

    Linux & terminal color & command line color how to change Linux terminal color https://askub ...

  10. 小程序 web-view

    小程序 web-view https://opendocs.alipay.com/mini/component/web-view https://opendocs.alipay.com/mini/ap ...