Java加密与解密的艺术~MAC算法实现

 

Java 原生

/*** 2009-9-10*/
package org.zlex.chapter06_3_1;import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;/*** MAC加密组件* * @author 梁栋* @version 1.0* @since 1.0*/
public abstract class MACCoder {/*** 初始化HmacMD5密钥* * @return* @throws Exception*/public static byte[] initHmacMD5Key() throws Exception {// 初始化KeyGeneratorKeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");// 产生秘密密钥SecretKey secretKey = keyGenerator.generateKey();// 获得密钥return secretKey.getEncoded();}/*** HmacMD5加密* * @param data*            待加密数据* @param key*            密钥* @return byte[] 消息摘要* * @throws Exception*/public static byte[] encodeHmacMD5(byte[] data, byte[] key)throws Exception {// 还原密钥SecretKey secretKey = new SecretKeySpec(key, "HmacMD5");// 实例化Mac "SslMacMD5"Mac mac = Mac.getInstance("SslMacMD5");//secretKey.getAlgorithm());// 初始化Macmac.init(secretKey);// 执行消息摘要return mac.doFinal(data);}/*** 初始化HmacSHA1密钥* * @return* @throws Exception*/public static byte[] initHmacSHAKey() throws Exception {// 初始化KeyGeneratorKeyGenerator keyGenerator = KeyGenerator.getInstance("HMacTiger");// 产生秘密密钥SecretKey secretKey = keyGenerator.generateKey();// 获得密钥return secretKey.getEncoded();}/*** HmacSHA1加密* * @param data*            待加密数据* @param key*            密钥* @return byte[] 消息摘要* * @throws Exception*/public static byte[] encodeHmacSHA(byte[] data, byte[] key)throws Exception {// 还原密钥SecretKey secretKey = new SecretKeySpec(key, "HMacTiger");// 实例化Mac SslMacMD5Mac mac = Mac.getInstance("SslMacMD5");//secretKey.getAlgorithm());// 初始化Macmac.init(secretKey);// 执行消息摘要return mac.doFinal(data);}//	// 根据所安装的 JCE 仲裁策略文件,返回指定转换的最大密钥长度。
//	public final static int getMaxAllowedKeyLength(String transformation) /*** 初始化HmacSHA256密钥* * @return* @throws Exception*/public static byte[] initHmacSHA256Key() throws Exception {// 初始化KeyGeneratorKeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA256");// 产生秘密密钥SecretKey secretKey = keyGenerator.generateKey();// 获得密钥return secretKey.getEncoded();}/*** HmacSHA256加密* * @param data*            待加密数据* @param key*            密钥* @return byte[] 消息摘要* * @throws Exception*/public static byte[] encodeHmacSHA256(byte[] data, byte[] key)throws Exception {// 还原密钥SecretKey secretKey = new SecretKeySpec(key, "HmacSHA256");// 实例化MacMac mac = Mac.getInstance(secretKey.getAlgorithm());// 初始化Macmac.init(secretKey);// 执行消息摘要return mac.doFinal(data);}/*** 初始化HmacSHA384密钥* * @return* @throws Exception*/public static byte[] initHmacSHA384Key() throws Exception {// 初始化KeyGeneratorKeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA384");// 产生秘密密钥SecretKey secretKey = keyGenerator.generateKey();// 获得密钥return secretKey.getEncoded();}/*** HmacSHA384加密* * @param data*            待加密数据* @param key*            密钥* @return byte[] 消息摘要* * @throws Exception*/public static byte[] encodeHmacSHA384(byte[] data, byte[] key)throws Exception {// 还原密钥SecretKey secretKey = new SecretKeySpec(key, "HmacSHA384");// 实例化MacMac mac = Mac.getInstance(secretKey.getAlgorithm());// 初始化Macmac.init(secretKey);// 执行消息摘要return mac.doFinal(data);}/*** 初始化HmacSHA512密钥* * @return* @throws Exception*/public static byte[] initHmacSHA512Key() throws Exception {// 初始化KeyGeneratorKeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA512");// 产生秘密密钥SecretKey secretKey = keyGenerator.generateKey();// 获得密钥return secretKey.getEncoded();}/*** HmacSHA512加密* * @param data*            待加密数据* @param key*            密钥* @return byte[] 消息摘要* * @throws Exception*/public static byte[] encodeHmacSHA512(byte[] data, byte[] key)throws Exception {// 还原密钥SecretKey secretKey = new SecretKeySpec(key, "HmacSHA512");// 实例化MacMac mac = Mac.getInstance(secretKey.getAlgorithm());// 初始化Macmac.init(secretKey);// 执行消息摘要return mac.doFinal(data);}
}

使用示例

/*** 2009-9-11*/
package org.zlex.chapter06_3_1;import static org.junit.Assert.*;import org.junit.Test;/*** MAC校验* * @author 梁栋* @version 1.0* @since 1.0*/
public class MACCoderTest {/*** 测试HmacMD5* * @throws Exception*/@Testpublic final void testEncodeHmacMD5() throws Exception {String str = "HmacMD5消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacMD5Key();// 获得摘要信息byte[] data1 = MACCoder.encodeHmacMD5(str.getBytes(), key);byte[] data2 = MACCoder.encodeHmacMD5(str.getBytes(), key);// 校验assertArrayEquals(data1, data2);}/*** 测试HmacSHA1* * @throws Exception*/@Testpublic final void testEncodeHmacSHA() throws Exception {String str = "HmacSHA1消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacSHAKey();// 获得摘要信息byte[] data1 = MACCoder.encodeHmacSHA(str.getBytes(), key);byte[] data2 = MACCoder.encodeHmacSHA(str.getBytes(), key);// 校验assertArrayEquals(data1, data2);}/*** 测试HmacSHA256* * @throws Exception*/@Testpublic final void testEncodeHmacSHA256() throws Exception {String str = "HmacSHA256消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacSHA256Key();// 获得摘要信息byte[] data1 = MACCoder.encodeHmacSHA256(str.getBytes(), key);byte[] data2 = MACCoder.encodeHmacSHA256(str.getBytes(), key);// 校验assertArrayEquals(data1, data2);}/*** 测试HmacSHA384* * @throws Exception*/@Testpublic final void testEncodeHmacSHA384() throws Exception {String str = "HmacSHA384消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacSHA384Key();// 获得摘要信息byte[] data1 = MACCoder.encodeHmacSHA384(str.getBytes(), key);byte[] data2 = MACCoder.encodeHmacSHA384(str.getBytes(), key);// 校验assertArrayEquals(data1, data2);}/*** 测试HmacSHA512* * @throws Exception*/@Testpublic final void testEncodeHmacSHA512() throws Exception {String str = "HmacSHA512消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacSHA512Key();// 获得摘要信息byte[] data1 = MACCoder.encodeHmacSHA512(str.getBytes(), key);byte[] data2 = MACCoder.encodeHmacSHA512(str.getBytes(), key);// 校验assertArrayEquals(data1, data2);}}

BouncyCastle 扩展

/*** 2009-9-11*/
package org.zlex.chapter06_3_2;import java.security.Security;import javax.crypto.KeyGenerator;
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;/*** MAC消息摘要组件* * @author 梁栋* @version 1.0* @since 1.0*/
public abstract class MACCoder {/*** 初始化HmacMD2密钥* * @return byte[] 密钥* @throws Exception*/public static byte[] initHmacMD2Key() throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 初始化KeyGeneratorKeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD2");// 产生秘密密钥SecretKey secretKey = keyGenerator.generateKey();// 获得密钥return secretKey.getEncoded();}/*** HmacMD2消息摘要* * @param data*            待做消息摘要处理的数据* @param byte[] 密钥* @return byte[] 消息摘要* @throws Exception*/public static byte[] encodeHmacMD2(byte[] data, byte[] key)throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 还原密钥SecretKey secretKey = new SecretKeySpec(key, "HmacMD2");// 实例化MacMac mac = Mac.getInstance(secretKey.getAlgorithm());// 初始化Macmac.init(secretKey);// 执行消息摘要return mac.doFinal(data);}/*** HmacMD2Hex消息摘要* * @param data*            待做消息摘要处理的数据* @param String*            密钥* @return byte[] 消息摘要* @throws Exception*/public static String encodeHmacMD2Hex(byte[] data, byte[] key)throws Exception {// 执行消息摘要byte[] b = encodeHmacMD2(data, key);// 做十六进制转换return new String(Hex.encode(b));}/*** 初始化HmacMD4密钥* * @return byte[] 密钥* @throws Exception*/public static byte[] initHmacMD4Key() throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 初始化KeyGeneratorKeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD4");// 产生秘密密钥SecretKey secretKey = keyGenerator.generateKey();// 获得密钥return secretKey.getEncoded();}/*** HmacMD4消息摘要* * @param data*            待做消息摘要处理的数据* @param byte[] 密钥* @return byte[] 消息摘要* @throws Exception*/public static byte[] encodeHmacMD4(byte[] data, byte[] key)throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 还原密钥SecretKey secretKey = new SecretKeySpec(key, "HmacMD4");// 实例化MacMac mac = Mac.getInstance(secretKey.getAlgorithm());// 初始化Macmac.init(secretKey);// 执行消息摘要return mac.doFinal(data);}/*** HmacMD4Hex消息摘要* * @param data*            待做消息摘要处理的数据* @param byte[] 密钥* @return String 消息摘要* @throws Exception*/public static String encodeHmacMD4Hex(byte[] data, byte[] key)throws Exception {// 执行消息摘要byte[] b = encodeHmacMD4(data, key);// 做十六进制转换return new String(Hex.encode(b));}/*** 初始化HmacSHA224密钥* * @return byte[] 密钥* @throws Exception*/public static byte[] initHmacSHA224Key() throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 初始化KeyGeneratorKeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA224");// 产生秘密密钥SecretKey secretKey = keyGenerator.generateKey();// 获得密钥return secretKey.getEncoded();}/*** HmacSHA224消息摘要* * @param data*            待做消息摘要处理的数据* @param byte[] 密钥* @return byte[] 消息摘要* @throws Exception*/public static byte[] encodeHmacSHA224(byte[] data, byte[] key)throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 还原密钥SecretKey secretKey = new SecretKeySpec(key, "HmacSHA224");// 实例化MacMac mac = Mac.getInstance(secretKey.getAlgorithm());// 初始化Macmac.init(secretKey);// 执行消息摘要return mac.doFinal(data);}/*** HmacSHA224Hex消息摘要* * @param data*            待做消息摘要处理的数据* @param byte[] 密钥* @return String 消息摘要* @throws Exception*/public static String encodeHmacSHA224Hex(byte[] data, byte[] key)throws Exception {// 执行消息摘要byte[] b = encodeHmacSHA224(data, key);// 做十六进制转换return new String(Hex.encode(b));}
}

使用示例

/*** 2009-9-11*/
package org.zlex.chapter06_3_2;import static org.junit.Assert.*;import org.junit.Test;/*** MAC校验* * @author 梁栋* @version 1.0* @since 1.0*/
public class MACCoderTest {/*** 测试HmacMD2* * @throws Exception*/@Testpublic final void testEncodeHmacMD2() throws Exception {String str = "HmacMD2消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacMD2Key();// 获得摘要信息byte[] data1 = MACCoder.encodeHmacMD2(str.getBytes(), key);byte[] data2 = MACCoder.encodeHmacMD2(str.getBytes(), key);// 校验assertArrayEquals(data1, data2);}/*** 测试HmacMD2Hex* * @throws Exception*/@Testpublic final void testEncodeHmacMD2Hex() throws Exception {String str = "HmacMD2Hex消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacMD2Key();// 获得摘要信息String data1 = MACCoder.encodeHmacMD2Hex(str.getBytes(), key);String data2 = MACCoder.encodeHmacMD2Hex(str.getBytes(), key);System.err.println("原文:\t" + str);System.err.println("HmacMD2Hex-1:\t" + data1);System.err.println("HmacMD2Hex-2:\t" + data2);// 校验assertEquals(data1, data2);}/*** 测试HmacMD4* * @throws Exception*/@Testpublic final void testEncodeHmacMD4() throws Exception {String str = "HmacMD4消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacMD4Key();// 获得摘要信息byte[] data1 = MACCoder.encodeHmacMD4(str.getBytes(), key);byte[] data2 = MACCoder.encodeHmacMD4(str.getBytes(), key);// 校验assertArrayEquals(data1, data2);}/*** 测试HmacMD4Hex* * @throws Exception*/@Testpublic final void testEncodeHmacMD4Hex() throws Exception {String str = "HmacMD4Hex消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacMD4Key();// 获得摘要信息String data1 = MACCoder.encodeHmacMD4Hex(str.getBytes(), key);String data2 = MACCoder.encodeHmacMD4Hex(str.getBytes(), key);System.err.println("原文:\t" + str);System.err.println("HmacMD4Hex-1:\t" + data1);System.err.println("HmacMD4Hex-2:\t" + data2);// 校验assertEquals(data1, data2);}/*** 测试HmacSHA224* * @throws Exception*/@Testpublic final void testEncodeHmacSHA224() throws Exception {String str = "HmacSHA224消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacSHA224Key();// 获得摘要信息byte[] data1 = MACCoder.encodeHmacSHA224(str.getBytes(), key);byte[] data2 = MACCoder.encodeHmacSHA224(str.getBytes(), key);// 校验assertArrayEquals(data1, data2);}/*** 测试HmacSHA224Hex* * @throws Exception*/@Testpublic final void testEncodeHmacSHA224Hex() throws Exception {String str = "HmacSHA224Hex消息摘要";// 初始化密钥byte[] key = MACCoder.initHmacSHA224Key();// 获得摘要信息String data1 = MACCoder.encodeHmacSHA224Hex(str.getBytes(), key);String data2 = MACCoder.encodeHmacSHA224Hex(str.getBytes(), key);System.err.println("原文:\t" + str);System.err.println("HmacSHA224Hex-1:\t" + data1);System.err.println("HmacSHA224Hex-2:\t" + data2);// 校验assertEquals(data1, data2);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql rpm 启动_MySQL安装(rpm)和启动配置

MySQL安装(rpm)和启动配置安装环境:OS:Oracle Linux 5.9安装步骤:1.解压MySql安装包[rootbakdbserver mysql]# tar -xf MySQL-5.5.24-1.rhel5.x86_64.tar[rootbakdbserver mysql]# ll总计 373920-rw-r--r-- 1 root root 191242240 2012-05-2…

量子计算陷入难解困境,未来发展何去何从?

来源:科研圈量子计算机在一些具体任务上的表现很快就能超越传统电子计算机,但是在量子计算真正实现其巨大潜力前,依然需要克服许多基础性的难题。在量子计算的可行性被质疑长达几十年后,全世界范围内忽然掀起了对于量子计算的追逐…

mysql 64位 8.0.11_mysql8.0.11 在windows64安装 步骤

环境:Windows 101一、安装1. 解压zip包到安装目录比如我的安装目录是:D:\Program\MySQL2.配置文件在Windows系统中,配置文件默认是安装目录下的 my.ini 文件,部分配置需要在初始安装时配置,大部分也可以在安装完成后进…

ProxyChains

proxychains-ng:https://github.com/rofl0r/proxychains-ng proxychains:https://github.com/haad/proxychains shadowsocks:https://github.com/shadowsocks/shadowsocks 安装了 shadowsocks 之后,只能网页出去逛逛,…

IDC发布对话式人工智能白皮书|附下载

来源:专知丨公众号近日,全球著名的信息技术、电信行业和消费科技咨询公司IDC(国际数据公司, International Data Corporation)发布了《对话式人工智能白皮书》(下文简称《白皮书》)。《白皮书》…

Java加密与解密的艺术~思维导图

#原图 System.out.println("https://www.processon.com/view/link/61a8323fe401fd49ed41cde0");

一场关于Google不作恶信条的辩论会

2008年11月18日,Intelligence Squared 在纽约 Rockefeller 大学召开了一次关于 Google 不作恶信条(Dontt be evil Motto)的辩论会,这场牛津式辩论会(Oxford-style debate )持续了近两个小时,《纽…

2017美国人工智能和机器学习行业种子投资首次下降

来源:199IT互联网数据中心根据Crunchbase的数据,风险投资对机器学习和人工智能的热情已经开始趋于平静,至少在美国是这样。但这可能并不是一件坏事。尽管人工智能和机器学习成为学术研究的热点领域已经有数十年了,但是尚未成为风险…

Java加密与解密的艺术~AES实现

AES算法成为DES算法的替代者,其实现也成为其他对称加密算法实现的参考模型。 AES 实现 /*** 2009-10-5*/ package org.zlex.chapter07_3;import java.security.Key;import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey;…

利用多核多线程进行程序优化

利用多核多线程进行程序优化2008 年 11 月 17 日 大家也许还记得 2005 年 3 月 C 大师 Herb Sutter 在 Dr.Dobb’s Journal 上发表了一篇名为《免费的午餐已经结束》的文章。文章指出:现在的程序员对效率、伸缩性、吞吐量等一系列性能指标相当忽视,很多性…

DOS 批处理

From: http://www.jb51.net/article/97204.htm From: http://www.92to.com/bangong/2016/04-08/2998914.html 百度文库:目前为止最全的批处理教程 批处理经典入门教程 批处理的本质,是一堆DOS命令按一定顺序排列而形成的集合。 批处理,也称…

python range 步长为负数_Python入门第7课,循环结构学习,for语句range函数的3种用法...

上课前,大陈带领学生们一起回顾和梳理前面学过的知识。体验课,Python与人工智能初体验。第1课,输出语句及赋值语句。第2课,输入语句学习。第3课、第4课,学习条件控制if语句。第5课、第6课,阶段练习及讲解。…

机器学习,就用Python!五大专家详解其优势何在

编译 :AI科技大本营(公众号ID:rgznai100)那么,为什么 Python 语言在机器学习领域会如此受欢迎?Python 领域资深专家 Mike Driscoll 组织了一次访谈会,邀请了五位 Python 专家和机器学习社区人士…

WinCE 5.0 virtual memory space

要深入了解WinCE的memory结构,就不得不在这里先画个virtual memory space的图。这个图是针对WinCE 5.0的。由于WinCE 6的结构做了很大变化,关于WinCE 6的内容将在以后介绍。 关于这个图的来源,有两点要说明。其一,绘制这个图的…

硬件安全 (1) —— SHA-1算法在FPGA上的实现

SHA-1 算法在FPGA上的实现 - 1 背景介绍 散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数…

Java加密与解密的艺术~RSA模型分析

我们仍以甲乙两方收发消息为例。为完成加密消息传递,甲乙双方需要以下操作: 1)、由消息发送方(甲方)构建密钥对。 2)、由消息发送方(甲方)公布公钥至消息接收方(乙方&…

区分关联、依赖和聚集关系

在建立对象模型时,很容易把依赖、关联和聚集关系混淆。当对象A和对象B之间存在依赖、关联或聚集关系时,对象A都有可能调用对象B的方法,这是三种关系之间的相同之处,除此之外,它们有着不同的特征。 1.依赖关…

MarkDown 语法手册

From: https://blog.csdn.net/witnessai1/article/details/52551362 From: http://www.jianshu.com/p/1e402922ee32/ 菜鸟教程:Markdown 教程:https://www.runoob.com/markdown/md-tutorial.html Markdown 语法手册:https://www.zybuluo.com…

硬件安全(1)—— SHA-1算法在FPGA上的实现-2

SHA-1算法在FPGA上的实现-2 在上一篇文章中&#xff0c;我详细介绍了SHA-1算法的计算过程。SHA-1算法主要由消息填充(Message Padding)和哈希计算(Hash Function Engine)两部分组成。消息块标准长度规定为512bits一组。消息填充在实现过程中需要区分长度不足一个消息块( < …

Mysql -uroot -p 登陆不上_mysql的登陆和退出命令格式

mysql登陆的命令格式为&#xff1a;mysql -h [hostip] -u [username] -p [password] [database]1.普通登陆mysql数据库命令格式&#xff1a;mysql -u 用户名 -p 密码&#xff0c;例如: mysql -u root -p root如果在-p后没有提供密码&#xff0c;则会在执行命令后要求用户输入密…