同步操作将从 鬼面书生/cat 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
一、介绍
cat:全称Cryptographic Algorithm Tool
主要提供以下加密算法调用:
1.AES
2.DES
3.MD5
4.RSA
5.国密SM3
6.国密SM4
其他算法敬请期待。
二、软件架构及说明
1.本工具包基于纯java编写而成;
2.部分算法密钥对基于bcprov-jdk16的调用生成。
3.部分加密与解密算法来自网上公开的源码,并在此基础上进行整理和优化而来;
4.本加密与解密包均在JDK1.8环境下编译并测试通过,建议所使用JAVA环境不低于JDK1.8;
5.其他高版本的JDK(如JDK9、JDK10、JDK11及以上版本)请自行测试;
三、 安装教程
本工具包无需安装,实际项目使用过程中将本工具源码目录下的release目录中对应版本目录下的jar
包拷至项目lib目录或拷至任意目录并在项目中引用即可;
四、使用说明
1.AES
加密:
AESUtils.ecodes("明文","密码","密钥长度");
解密:
AESUtils.decodes("密文","密码","密钥长度");
加密示例:
String cipherText = AESUtils.ecodes("一片春愁待酒浇,江上舟摇,楼上帘招。秋娘渡与泰娘桥,风又飘飘,雨又萧萧。", "1qaz@SX#EDC4rfv", 256);
System.out.println("加密后密文: " + cipherText);
解密示例:
String clearText = AESUtils.decodes(cipherText, "1qaz@SX#EDC4rfv", 256);
System.out.println("密文解密后的明文:" + clearText);
2.DES
加密:
byte[] encriptMsg = DESUtils.encrypt("明文", "密码");
System.out.println("加密后密文: " + new String(encriptMsg));
加密示例:
//待加密内容
String srcStr = "春宵一刻值千金,花有清香月有阴;歌管楼台声细细,秋千院落夜沉沉!";
// 密码,长度必须是8的倍数
String password = "ABCDEFGH12345678";
byte[] encriptMsg = DESUtils.encrypt(srcStr, password);
String enc = new String(encriptMsg);
System.out.println("DES加密后(byte[]):" + encriptMsg);
System.out.println("DES加密后密文:" + enc);
注意:DES加密后的byte数组转换成字符串后是乱码字符(即上述enc是乱码),且无法反向还原成byte数组;
解密:
byte[] decryResult = DESUtils.decrypt("加密后的byte数组", "密码");
System.out.println("解密后的明文:" + new String(decryResult));
解密示例:
byte[] decryResult = DESUtils.decrypt(encriptMsg, password);
System.out.println("DES利用密码串解密后:" + new String(decryResult));
---------------------------------------------------------------------------------------------------
PS:为了方便管理密文,可将加密后生成的字节数组采用Base64进行二次加密后,密文不再是乱码,方便管理,示例如下:
// 将加密后的byte数组再进行base64加密,生成字符串密文。
String encoded = Base64.getEncoder().encodeToString(encriptMsg);
System.out.println("BASE64对DES加密后的byte数组再次加密后的密文:" + encoded);
在调用DES解密以前,先采集BASE64进行第一次解密,示例如下:
//将上述采用base64加密后生成的字符串进行Base64第一次解密,还原成byte数组(密文),供DES解密用
byte[] decoded = Base64.getDecoder().decode(encoded);
System.out.println("BASE64解密后的字节数组:" + decoded);
System.out.println("BASE64解密后数组转换成的密文:" + new String(decoded));
BASE64解密后数组转换成的密文字符串以后与DES加密后的byte数组转换成字符串后的结果是一样的,还是乱码字符;
将BASE64解密后的字节数组调用DES解密函数进行二次解密:
byte[] _decryResult = DESUtils.decrypt(decoded, password);
System.out.println("Base64解密后的数组decoded利用密码串调用DES解密后:" + new String(_decryResult));
3.MD5
MD5算法为摘要算法,加密过程不可逆,本工具中MD5加密后生成的密文有两种:一种是长度为32位;一种是长度为16位;
默认密文长度为32位,
MD5Utils.Md5("原始信息", 密文长度);
示例如下:
String srcStr = "春宵一刻值千金,花有清香月有阴;歌管楼台声细细,秋千院落夜沉沉!";
System.out.println("原始信息:" + srcStr);
System.out.println("MD5加密后(密文长度16位):" + MD5Utils.Md5(srcStr, 16));
System.out.println("MD5加密后(密文长度32位):" + MD5Utils.Md5(srcStr, 32));
4.RSA
RSA为非对称加密码算法,其密钥对(公钥与私钥)由RSA算法自动生成;
加密与解密过程:
a.调用密钥对生成函数,生成密钥对;
KeyPair keyPair = RSAUtils.generateKeyPair(4196);
b.利用密钥对中的公钥进行加密;
//从密钥对中获取公钥
Key publicKey=keyPair.getPublic();
String encriptMsg = RSAUtils.encrypt("待加密的明文", 公钥publicKey);
encriptMsg即为最终加密后的结果;
c.解密时利用私钥进行解密;
//从密钥对中获取私钥
Key priateKey=keyPair.getPrivate();
String decryptMsg=RSAUtils.decrypt("待解密的密文", 私钥privateKey)
完整示例:
String srcStr = "春宵一刻值千金,花有清香月有阴;歌管楼台声细细,秋千院落夜沉沉!";
//获取非对称密钥
KeyPair keyPair = RSAUtils.generateKeyPair(4196);
//对公钥与私钥进行base64编码,方便密钥对的管理,源代码中的方法为RSAUtils.keyEncrypt(公钥或私钥)
System.out.println("公钥:" +new String(Base64.encodeBase64(keyPair.getPublic().getEncoded())));
System.out.println("私钥:" +new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded())));
//加密:
String encriptMsg = RSAUtils.encrypt(srcStr, keyPair.getPublic());
System.out.println("原始信息:" + srcStr + " 加密后的密文为:"+encriptMsg);
//解密
String decryptMsg= RSAUtils.decrypt(encriptMsg, keyPair.getPrivate());
System.out.println("密文解密明文为:" +decryptMsg);
5.国密SM3
国密SM3算法为杂凑算法,是国家密码局公布并推荐使用的一种单向加密算法,其加密过程不可逆。
本工具包提供带自定义密钥的加密和不带密钥的加密两种加密模式,其中带自定义密钥的加密中,密钥支持中文字符;
两种加密模式加密出来的密文均提供简单的签名验证功能 (即验签,验证密文是否由明文通过指定密钥加密所得),验签
函数 SM3Utils.verify("明文","密钥","密文"),验签函数返回true(验签通过)或false(验签未通过);
两种加密模式使用说明如下:
a.自定义密钥的加密
SM3Utils.encrypt("明文", "密钥字符(可以是中文)");
示例:
//明文
String srcStr = "春宵一刻值千金,花有清香月有阴;歌管楼台声细细,秋千院落夜沉沉!";
//密钥
String key = "春宵";
//加密
String hexStrByKey = SM3Utils.encrypt(srcStr, key);
System.out.println(" 带密钥加密后的密文:" + hexStrByKey);
//验签
boolean veryfy=SM3Utils.verify(srcStr, key, hexStrByKey);
//验签结果
System.out.println("明文(带密钥)与密文验签结果:" + veryfy);
b.不带密钥的加密
SM3Utils.encrypt("明文");
示例:
//明文
String srcStr = "春宵一刻值千金,花有清香月有阴;歌管楼台声细细,秋千院落夜沉沉!";
//加密
String hexStrNoKey = SM3Utils.encrypt(srcStr);
System.out.println(" 不带密钥加密后的密文:" + hexStrNoKey);
//验签结果
System.out.println("明文(不带密钥)与密文验签结果:" + SM3Utils.verify(srcStr, hexStrNoKey));
6.国密SM4
国密SM4是国家密码局公布的无线局域网产品使用的加密算法,算法本身为分组算法,该算法分组长度为128比特,密钥长度为128比特;
加密算法与密钥扩展算法均采用32轮非线性迭代结构,解密算法结构与加密算法结构完全相同,只是密钥轮的使用顺序相反,解密轮密
钥是加密轮密钥的逆序。
本工具包提供带自定义密钥的加密和系统自动生成密钥的加密两种加密模式和简单的验签功能,这两种模式调用的加密过程完全一致,
需要注意的是,当采用自定义密钥加密时,自定义密码必须是大写的32位的16进制密钥(其他长度的密钥和小写密钥可自行测试);
加密过程:
SM4Utils.encryptByEcb("明文", "密钥");
解密过程:
SM4Utils.decryptEcb("密钥", "密文");
验签(验证密文是否由明文通过指定密钥加密所得)过程:
SM4Utils.verifyByEcb("密钥", "密文", "明文");
完整示例:
String srcStr = "春宵一刻值千金,花有清香月有阴;歌管楼台声细细,秋千院落夜沉沉!";
// 自定义的32位16进制密钥
// String key = "86C63180C2806ED1F47B859DE501215B";
// 自动生成密钥
String key = ByteUtils.toHexString(autoGenerateKey(DEFAULT_KEY_SIZE));
// 加密,key可采用自定义的32位16进制密钥,也可以调用autoGenerateKey生成
String cipher = SM4Utils.encryptByEcb(srcStr, key);
System.out.println("自动生成的密钥:" + key);
// 密文输出
System.out.println("加密后的密文:" + cipher);
//验签
System.out.println("校验密文是否为明文加密所得:" + SM4Utils.verifyByEcb(key, cipher, srcStr));
// 解密
srcStr = SM4Utils.decryptEcb(key, cipher);
System.out.println("采用密钥:" + key);
System.out.println("解密后的明文:" + srcStr);
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。