package cn.mccreefei.service.impl;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.springframework.stereotype.Service;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Arrays;
@Service
public class SM4ServiceImpl {
static {
Security.addProvider(new BouncyCastleProvider());
}
private static final String ENCODING = "UTF-8";
public static final String ALGORITHM_NAME = "SM4";
// 加密算法/分组加密模式/分组填充方式
// PKCS5Padding-以8个字节为一组进行分组加密
// 定义分组加密模式使用:PKCS5Padding
public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";
// 128-32位16进制;256-64位16进制
public static final int DEFAULT_KEY_SIZE = 128;
/**
* 自动生成密钥
*
* @return
* @explain
*/
public static String generateKey() throws Exception {
return new String(Hex.encodeHex(generateKey(DEFAULT_KEY_SIZE),false));
}
/**
* @param keySize
* @return
* @throws Exception
* @explain
*/
public static byte[] generateKey(int keySize) throws Exception {
KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME);
kg.init(keySize, new SecureRandom());
return kg.generateKey().getEncoded();
}
/**
* 生成ECB暗号
*
* @param algorithmName 算法名称
* @param mode 模式
* @param key
* @return
* @throws Exception
* @explain ECB模式(电子密码本模式:Electronic codebook)
*/
private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception {
Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);
Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);
cipher.init(mode, sm4Key);
return cipher;
}
/**
* sm4加密
*
* @param hexKey 16进制密钥(忽略大小写)
* @param paramStr 待加密字符串
* @return 返回16进制的加密字符串
* @explain 加密模式:ECB
* 密文长度不固定,会随着被加密字符串长度的变化而变化
*/
public static String encryptEcb(String hexKey, String paramStr) {
try {
String cipherText = "";
// 16进制字符串-->byte[]
byte[] keyData = ByteUtils.fromHexString(hexKey);
// String-->byte[]
byte[] srcData = paramStr.getBytes(ENCODING);
// 加密后的数组
byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData);
// byte[]-->hexString
cipherText = ByteUtils.toHexString(cipherArray);
return cipherText;
} catch (Exception e) {
return paramStr;
}
}
/**
* 加密模式之Ecb
*
* @param key
* @param data
* @return
* @throws Exception
* @explain
*/
public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception {
Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(data);
}
/**
* sm4解密
*
* @param hexKey 16进制密钥
* @param cipherText 16进制的加密字符串(忽略大小写)
* @return 解密后的字符串
* @throws Exception
* @explain 解密模式:采用ECB
*/
public static String decryptEcb(String hexKey, String cipherText) {
// 用于接收解密后的字符串
String decryptStr = "";
// hexString-->byte[]
byte[] keyData = ByteUtils.fromHexString(hexKey);
// hexString-->byte[]
byte[] cipherData = ByteUtils.fromHexString(cipherText);
// 解密
byte[] srcData = new byte[0];
try {
srcData = decrypt_Ecb_Padding(keyData, cipherData);
// byte[]-->String
decryptStr = new String(srcData, ENCODING);
} catch (Exception e) {
e.printStackTrace();
}
return decryptStr;
}
/**
* 解密
*
* @param key
* @param cipherText
* @return
* @throws Exception
* @explain
*/
public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception {
Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key);
return cipher.doFinal(cipherText);
}
/**
* 校验加密前后的字符串是否为同一数据
*
* @param hexKey 16进制密钥(忽略大小写)
* @param cipherText 16进制加密后的字符串
* @param paramStr 加密前的字符串
* @return 是否为同一数据
* @throws Exception
* @explain
*/
public static boolean verifyEcb(String hexKey, String cipherText, String paramStr) throws Exception {
// 用于接收校验结果
boolean flag = false;
// hexString-->byte[]
byte[] keyData = ByteUtils.fromHexString(hexKey);
// 将16进制字符串转换成数组
byte[] cipherData = ByteUtils.fromHexString(cipherText);
// 解密
byte[] decryptData = decrypt_Ecb_Padding(keyData, cipherData);
// 将原字符串转换成byte[]
byte[] srcData = paramStr.getBytes(ENCODING);
// 判断2个数组是否一致
flag = Arrays.equals(decryptData, srcData);
return flag;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
个人实战积累的成果,基于国密算法的总结,希望可以帮到您 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ 个人实战积累的成果,基于国密算法的总结,希望可以帮到您 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ 个人实战积累的成果,基于国密算法的总结,希望可以帮到您 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ 个人实战积累的成果,基于国密算法的总结,希望可以帮到您 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~
资源推荐
资源详情
资源评论
收起资源包目录
《国密算法》--基于SM4国密算法的在线通讯系统.zip (116个子文件)
sweetalert.css 22KB
login.css 5KB
main.css 1KB
68.gif 39KB
54.gif 34KB
55.gif 33KB
66.gif 31KB
67.gif 29KB
63.gif 28KB
29.gif 27KB
43.gif 25KB
11.gif 24KB
56.gif 24KB
52.gif 23KB
53.gif 15KB
23.gif 15KB
28.gif 14KB
6.gif 14KB
12.gif 14KB
5.gif 14KB
4.gif 14KB
64.gif 14KB
65.gif 14KB
10.gif 13KB
33.gif 13KB
60.gif 13KB
7.gif 13KB
2.gif 12KB
69.gif 12KB
16.gif 12KB
19.gif 12KB
45.gif 12KB
62.gif 12KB
9.gif 11KB
21.gif 11KB
38.gif 11KB
48.gif 11KB
25.gif 11KB
59.gif 11KB
49.gif 10KB
13.gif 10KB
26.gif 9KB
47.gif 9KB
41.gif 9KB
34.gif 8KB
24.gif 8KB
15.gif 8KB
36.gif 8KB
8.gif 8KB
32.gif 8KB
1.gif 8KB
3.gif 7KB
17.gif 7KB
22.gif 7KB
18.gif 6KB
51.gif 6KB
40.gif 6KB
61.gif 6KB
58.gif 6KB
57.gif 6KB
27.gif 6KB
20.gif 6KB
14.gif 5KB
31.gif 5KB
42.gif 5KB
50.gif 4KB
37.gif 4KB
44.gif 4KB
46.gif 4KB
39.gif 4KB
35.gif 4KB
30.gif 2KB
.gitignore 268B
favicon.ico 203KB
SM4ServiceImpl.java 6KB
MessageController.java 5KB
LoginController.java 4KB
MessageRecordDo.java 3KB
WebSocketDisconnectHandler.java 3KB
LoginInfoDo.java 2KB
WebSocketConfig.java 2KB
UserDAOTest.java 2KB
UserServiceImpl.java 1KB
Message.java 1KB
User.java 1KB
ReplyLoginMessage.java 1KB
ParticipantRepository.java 940B
UserDAO.java 899B
UserService.java 875B
ReplyRegistMessage.java 860B
LoginTypeEnum.java 432B
MessageTypeEnum.java 431B
MessageRecordDAO.java 230B
LoginInfoDAO.java 210B
tom2_181065.jpg 3.62MB
tom_853523.jpg 1.47MB
1.jpg 501KB
chris_619283.jpg 260KB
tom_969842.jpg 232KB
tom_918949.jpg 141KB
共 116 条
- 1
- 2
资源评论
季风泯灭的季节
- 粉丝: 636
- 资源: 2920
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于HTML的旅游网页制作源码设计.zip
- 基于HTML的旅游网页制作源码设计.zip
- 大数据揭秘京沪程序员的爱情代码 WIFIPIX(PDF格式).rar
- 大数据实战Demo系统-MaxCompute数据仓库数据转换实践(PDF格式).rar
- 六一儿童节代码祝福六一儿童节代码祝福六一儿童节代码祝福.txt
- sql语句sql语句sql语句sql语句.txt
- ubuntu20.04安装教程ubuntu20.04安装教程.txt
- imgcache.0
- 高分项目基于faster-rcnn知识蒸馏的目标检测模型增量深度学习方法源码.zip
- 基于python和图数据库neo4j构建电影应用(高分毕设项目)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功