java偶校验计算代码_191120_02 Java常用加密校验转换算法汇总
Java常用加密校验转换算法汇总
作者:邵发
官网:http://afanihao.cn/java
本文是Java学习指南系列教程的官方配套文档。内容介绍Java里的常用算法的使用,包含转换Hex / Base64等数据转换算法,CRC32 / MD5 / HMAC-SHA1数据签名和校验算法,DES / AES等对称加密算法。
由于篇幅的限制,本文只对各种算法的使用给出代码示例。如果对原理有不明白的地方,可以参考Java学习指南系列的《项目应用篇》,里面对每一个算法的应用背景和原理有较为详细的解释。本文附带项目源码及相关JAR包。
1.
Hex转换
在Java里,一般性的数据用byte[]表示,即字节数组。由于byte[]本身不可显示,所以为了显示和传递的方便,有时候需要把它转化为十六进制显示。
1.1 byte[] => Hex String
例如,
byte[] code =
{ -5, 0, 10, 99, 20 };
String hex =
Hex.encodeHexString(code, false);
code表示5个字节的数据,将其转成十六进制表字符串为:FB000A6314。在十六进制表示下,每两个字符表示1字节的数据,即FB 00 0A 64 14共五个字节。
1.2 Hex String => byte[]
反转来,也可以
byte[] code2 =
Hex.decodeHex(hex);
解码后得到长度为5字节的数组code2,和原始数据内容是一样的。
Hex是一种数据转换算法,它没有改变数据的值,仅仅是换了一个表示方式。就好比机器猫和多莱梦,说的是同一个事物。
2.
Base64转换
Base64,即64进制的转换。在64进制下,一共有64个基础字符。即,
'A', 'B', 'C', …, 'Y', 'Z',
'a', 'b', 'c', …, 'y', 'z',
'0', '1', '2', …, '8', '9',
'+', '-'
2.1 byte[] => Base64 String
以下示例,把4字节的数据转成Base64的表示,例如。
byte[]
code = { 12, 4 , 9, -2};
String
str = Base64.encodeBase64String(code);
转换的结果为:DAQJ/g==,虽然结果看起来有点奇怪,但这只是一个表示方式,数据的内容没有发生变化。
2.2 Base64 String => byte[]
反过来,也可以把Base64表示的字符串,再解码为字节数据。例如。
byte[]
code2 = Base64.decodeBase64(str);
解码之后,得到的字节数组和原始内容是一致的。
3.
MD5校验
业界用于校验的算法有多种,比如:
Parity:奇偶校验
ECC :错误校验与纠正
Checksum :和校验
CRC32:循环冗余校验
MD5 :消息摘要
SHA1 :安全哈希
其中,MD5和SHA1是Java项目里使用比较多的校验算法。
所谓校验算法,用于在传输过程中的完整性的校验。比如,A给B发送一个大文件,B在接收到之后惴惴不安,因为他不能确定这么大一个文件在传输过程中没有错误发生(比如某个字节传错了)。B怎么才能够确认这个文件的完整性呢?需采用校验算法。
MD5的基本使用公式:Code = MD5 ( Data)
其中Data为输入的一段数据,经过MD5运算之后,得到16字节的结果,称为MD5码。
特点:
1无论Data有多长,输出的MD5码总是16字节
2如果Data不同,则输出的MD5码也不相同。(极大概率不同)
3.1示例:求MD5校验码
//待处理的数据,任意长度
byte[]
data = { 12, 8, 9, -1, 87, 0, -47, 99, 14, 54 };
//创建算法实例,MD5或SHA1
MessageDigest
md = MessageDigest.getInstance("MD5");
md.update(data);
byte[]
code = md.digest();
//转成HEX显示(参考上一章)
String
result = Hex.encodeHexString(code, false);
需要注意的是,MD5算法的输出结果是一个长为16字节的byte[],通常需要转成十六进制的字符串显示。所以我们通常看到的MD5值是由32字符表示的。
3.2对字符串求MD5
在Java项目中,通常需要对字符串求MD5码。示例如下。
//待处理的字符串
String
text = "阿发你好/afanihao.cn";
//转成字节数据
byte[]
data = text.getBytes("UTF-8");
//求消息摘要
MessageDigest
md = MessageDigest.getInstance("MD5");
md.update(data);
byte[]
code = md.digest();
//转成HEX显示
String
result = Hex.encodeHexString(code, false);
System.out.println("校验码: " + result);
使用MD5算法,也可以对一个很大的文件求MD5码。示例代码略。
4.
SHA1校验
SHA1也是一种校验算法,比MD5更强,输出20字节的校验码。它的使用方法和MD5一样,只需要把算法的名字改成SHA1就行了。
byte[]
data = { 12, 8, 9, -1, 87, 0, -47, 99, 14, 54 };
MessageDigest
md = MessageDigest.getInstance("SHA1");
md.update(data);
byte[]
code = md.digest();
String
result = Hex.encodeHexString(code, false);
5.
CRC32校验
CRC32也是一种校验算法,生成4字节的校验码。它在Java领域使用得不多,稍微了解一下即可。
5.1示例:根据byte[]生成CRC32校验码
//待处理的数据,任意长度
byte[]
data = { 12, 8, 9, -1, 87, 0, -47, 99, 14, 54 };
//创建算法实例
CRC32
crc = new CRC32();
crc.update(
data );
long
value = crc.getValue();
//转成HEX显示(参考上一章)
String
result = Long.toHexString(value);
System.out.println("校验码: " + result);
6.
HMAC-SHA1签名
所谓签名,也是一种校验算法,只是这个校验码是无法伪造的。签名算法用于保证数据的真实现性。
例如,
Code = HMAC-SHA1
( Data, Key )
其中,Data为输入的数据,Key为指定的密钥。在经过HMAC-SHA1运算后,得到一个20字节的校验码。
这个校验码是无法伪造的,只有持有Key的人,才能生成相同的校验码。在传递的过程,传输双方都知晓这个密钥,才能得到相同的校验码。
6.1示例:HMAC-SHA1签名
//数据
byte[]
data = { 12, 8, 9, -1, 87, 0, -47, 99, 14, 54 };
//密钥
String
key = "test2019";
//
HMAC-SHA1算法
Key
keySpec = new SecretKeySpec(key.getBytes(), "HMACSHA1");
Mac
mac = Mac.getInstance("HMACSHA1");
mac.init(keySpec);
//更新数据
mac.update(data);
//取得最终结果
byte[]
code = mac.doFinal();
String
result = Hex.encodeHexString(code, false);
System.out.println("签名: " + result);
6.2 HmacSha1Util工具类
在Java项目里,常见对String的签名操作,为此封装出一个工具类HmacSha1Util。示例用法如下:
String text = "afanihao.cn |阿发你好| Java学习指南";
String key = "your_key_2019";
String result = HmacSha1Util(text , key);
7.
DES加密
下面介绍两种常见的加密算法:DES和AES。其中,DES出现的较早,而AES是它的升级替代品。
什么叫加密?加密意味着秘密,只有持有秘钥者可以解读。
(1)加密后的数据可以解密,还原为原始数据
(2)只有持有秘钥者可以解密
加密算法的一般公式为:
Cipher
= Encrypt( Plain, Key )
其中,Plain为原文,Key为密钥。经加密算法运算后,得到密钥。
反过来,还可以解密,公式为:
Plain
= Decrypt ( Cipher, Key)
这个加密和加密的过程是对称的(互逆的),来回使用的是同一处密钥,所以称为对称加密算法。
7.1示例:DES加密
public static
byte[] encrypt(byte[] plain, byte[] key) throws Exception
{
//使用PKCS5补齐方式
Cipher c = Cipher.getInstance("DES/ECB/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "DES");
c.init(Cipher.ENCRYPT_MODE, keySpec);
//加密
byte [] output = c.doFinal(plain);
return output;
}
其中,plain为原文,key是密角,返回值为密文。
在Java项目中,密钥通常为String,需要自己转成byte[]。对于DES来说,要求密钥长度为8个字节。
7.2示例:DES解密
public static
byte[] decrypt(byte[] cipher, byte[] key) throws Exception
{
//使用PKCS5补齐方式
Cipher c = Cipher.getInstance("DES/ECB/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "DES");
c.init(Cipher.DECRYPT_MODE, keySpec);
byte [] output = c.doFinal(cipher);
return output;
}
同样地,在实际项目中处理的往往是String,而结果也往往要转成HEX形式表示。所以要自己添加额外的处理,自己要稍微封装一下再使用。
8.
AES加密
AES是用于取代DES的更高级更强的加密算法,但用法基本是类同的。AES加密密钥长度为16字节,每16字节一组进行加密。
8.1示例:AES加密
public static
byte[] encrypt(byte[] plain, byte[] key) throws Exception
{
//
AES
Cipher
c = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec
keySpec = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE,
keySpec);
//加密
byte[]
output = c.doFinal(plain);
return
output;
}
8.2示例:AES解密
public static
byte[] decrypt(byte[] cipher, byte[] key) throws Exception
{
//
AES
Cipher
c = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec
keySpec = new SecretKeySpec(key, "AES");
c.init(Cipher.DECRYPT_MODE,
keySpec);
byte[]
output = c.doFinal(cipher);
return
output;
}
其中,在准备密钥的时候,需保证密钥长度不少于16字节。
8.3 AESUtil工具类
由于在Java项目中要处理的信息一般是String,所以对上述AES算法做一个简单的封装,得到AESUtil工具类。
示例用法如下:
String
key = "your_key_2910";
String
plain = "阿发你好|
afanihao.cn | Java学习指南系列教程";
String
cipher = AESUtil.encrypt(plain, key); //加密
String
plain2 = AESUtil.decrypt(cipher, key); //解密
这样在项目中调用就非常的简单了,只需要自己指定一下密钥,就可以进行加密解密了。
以上介绍了几种常见算法的使用,如果有对应用背景、原理和项目使用不太清楚的地方,可以参考Java学习指南系列教程的《项目应用篇》。本篇演示所用的项目源码和JAR包在此处可以获取。
java偶校验计算代码_191120_02 Java常用加密校验转换算法汇总相关推荐
- java身份证验证代码IdcardUtils.java分享
原文:java身份证验证代码IdcardUtils.java分享 源代码下载地址:http://www.zuidaima.com/share/1843444783778816.htm import j ...
- Java常用加密解密核心算法
加密算法 最近面试被问到了一些常见的加密解密算法,特此整理记录. 加密算法我们整体可以分为:可逆加密算法和不可逆加密算法.可逆加密算法又可以分为:对称加密算法和非对称加密算法. 一.不可逆加密算法 常 ...
- 复习Java小球游戏代码分享Java面试题MySQL中常用的锁生活【记录一个咸鱼大学生三个月的奋进生活】021
记录一个咸鱼大学生三个月的奋进生活021 复习Java小球游戏 游戏界面的代码 小球运动线程的代码 运行游戏的代码 运行结果 代码分享 学习Java面试题(MySQL中常用的锁) 照片分享 复习Jav ...
- 常用加密与解密算法示例代码
一.System.Security.Cryptography 命名空间 System.Security.Cryptography 命名空间提供加密服务,包括安全编码和解码的数据,以及许多其他操作,如哈 ...
- 代码面试最常用的10大算法
摘要:面试也是一门学问,在面试之前做好充分的准备则是成功的必须条件,而程序员在代码面试时,常会遇到编写算法的相关问题,比如排序.二叉树遍历等等. 在程序员的职业生涯中,算法亦算是一门基础课程,尤其是在 ...
- java数据加密解密代码_java使用RSA加密方式实现数据加密解密的代码
RSA的应用 RSA是一种非对称加密算法.现在,很多登陆表单的密码的都采用RSA加密,例如京东中的登陆使用公钥对密码进行加密 java使用RSA加密方式实现数据加密解密,需要首先产生私钥和公钥 测试代 ...
- java幻灯片播放代码_简单常用的幻灯片播放实现代码
幻灯片自动播放图片是当前网站比较流行的一个展示方式.在网上我们能找到各种特效丰富的幻灯片插件和代码.这里项目需要,我自己做了一个简单的,就不详细讲解了,代码很简单.直接看效果图和代码吧. 所有代码 p ...
- 用JAVA调用天气预报代码,网站上常用的天气预报代码调用大全
考虑到平时会用到各种形式的天气显示形式,所以将平时在网上搜集的和自己整理的天气代码放在这里 供参考(由于大部分效果使用的是框架调用别人的代码,所以当别人的网站修改了代码的时候有的效果可 能显示不出来需 ...
- java 年计算_用Java计算leap年
这是家庭作业,我已经获得了成绩,但是我没有在代码中实现leap年.这是一个简单的程序,可以根据用户输入显示一个月内的数字.我唯一不知道的是一种实现implement年的方法,这种writing年将在2 ...
最新文章
- 使用OpenVINO ToolKit 实时推断
- 控制显示隐藏_iOS13隐藏了5个超实用新功能:让iPhone的使用体验更好
- python累加求和_python中的变量和数据类型(一)
- Gengine规则引擎
- leetcode404. 左叶子之和
- SAP License:如何获取采购订单一次性供应商的地址信息
- 如何在面试中发现优秀程序员
- 评侯捷的《深入浅出MFC》和李久进的《MFC深入浅出》
- 附录一 常见概率分布及相关公式
- 3种内网穿透方式连接家用宽带服务器
- 这个是我18年整理的,之前在我的电子笔记,现在感觉还是需要分享写写博客大家互相学习更好
- Android 发送短信
- jvm的内存分布,参数配置 和 GC处理机制
- Excel应用技巧:不让别人修改你的Excel表
- 想搭建一个专属于你的网站吗??新手向超详细攻略
- Agisoft Metashape 照片高程改正 附python源码
- 移动MM首届手机软件设计及创意大赛决赛取得圆满成功
- 技术 | 从一个钱包被盗的案例,探讨Web3的安全指南
- 知识备忘phpcms 简单解析一 数据表字段
- GoAhead2.5源代码分析之7-form请求处理(form.c)
热门文章
- Android Studio 单工程、多工程级联依赖下的aar的引用
- MFC动态改变图形控件picture control位置
- iceberg+Spark3.0-sql测试
- Apache 配置与应用
- java对gzip格式进行压缩与解压缩
- 如何将抓取下来的unicode字符串转换为中文
- 波动方程,拉梅常数和赫姆霍兹方程
- 【Docker篇】Docker的基本组成,底层原理分析
- 天网和瑞星杀毒软件冲突,电脑出现假死机
- 「论文翻译」Predicting gene-disease associations via graph embedding and graph convolutional networks