一、

最近看完了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. hdu 6860 Fluctuation Limit 双向贪心

    题意: 给你n个区间[li,ri],和一个整数k,你从每一个区间内选出来一个数,把从第i个区间内选出来数放在第i个位置,这样会构成一个长度为n的序列,你需要保证序列中任意两个相邻的数之差的绝对值要小于 ...

  2. 梨子带你刷burp练兵场(burp Academy) - 服务器篇 - Sql注入 - SQL injection UNION attack, determining the number of columns returned by the query

    目录 SQL injection UNION attack, determining the number of columns returned by the query SQL injection ...

  3. scu-4445

    Right turn frog is trapped in a maze. The maze is infinitely large and divided into grids. It also c ...

  4. 51nod-1065 最小正子段和 【贪心 + 思维】

    N个整数组成的序列a[1],a[2],a[3],-,a[n],从中选出一个子序列(a[i],a[i+1],-a[j]),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的. 例如 ...

  5. 关于虚继承的sizeof问题

    首先关于虚继承和普通继承的知识,我总结一下: 1.普通继承时,无论派生类是否定义新的虚函数,基类和派生类总是共享一个虚函数表,不需要另加指向虚函数的指针,派生类只是将虚函数表中的元素改成了派生类的地址 ...

  6. 数据分析常用库(numpy,pandas,matplotlib,scipy)

    概述 numpy numpy(numeric python)是 python 的一个开源数值计算库,主要用于数组和矩阵计算.底层是 C 语言,运行效率远高于纯 python 代码.numpy主要包含2 ...

  7. Celery&Flower文档笔记

    1.Celery # tasks.py from celery import Celery app = Celery('tasks', broker='redis://localhost:6379', ...

  8. Sentry & React

    Sentry & React https://docs.sentry.io/platforms/javascript/guides/react/ https://docs.sentry.io/ ...

  9. DRM & 音视频 & 防盗链

    DRM & 音视频 & 防盗链 DRM Digital Rights Management / 数字版权管理 https://en.wikipedia.org/wiki/Digital ...

  10. GitHub SSH key

    GitHub SSH key https://help.github.com/en/github/authenticating-to-github steps HTTPS clone !== SSH ...