keshe

发送方a

代码:

package org.example;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import org.apache.commons.codec.binary.Base64;
import java.security.KeyPair;
import cn.superfw.crypto.gmsm.sm2.SM2EngineExtend;
import cn.superfw.crypto.gmsm.sm2.SM2KeyPair;
import cn.superfw.crypto.gmsm.sm3.*;
import cn.superfw.crypto.gmsm.sm4.*; /**
* <pre>
* hutool SmUtil
* </pre>
*
* @author loopy_y
* @since 2022/5/15
*/
public class Main{ public static void main(String[] args) {
// test1();
test2();
// test3();
test4();
// test5();
// test6();
System.out.println("======== 摘要加密算法SM4S,开始 ========");
String key = "A85CA99B75A2CAE27A659F50260C822E";
String input = "20201310hzx 20201303zyb 20201327ljm";
//
// System.out.println("Key:" + key);
// System.out.println("原文:" + input);
//
// System.out.println(); // System.out.println("ECB模式");
//
String output = SM4.encrypt(key, input);
// System.out.println("加密:" + output);
// System.out.println("解密:" + SM4.decrypt(key, output));
//
// System.out.println(); System.out.println("密钥为:A85CA99B75A2CAE27A659F50260C822E");
String iv = "12345678123456781234567812345678";
output = SM4.encrypt(key, input, iv);
System.out.println("加密:" + output);
System.out.println("解密:" + SM4.decrypt(key, output, iv));
} public static void test2() {
System.out.println("======== SM2使用自定义密钥对加密或解密,开始 ========"); String text = "A85CA99B75A2CAE27A659F50260C822E"; KeyPair pair = SecureUtil.generateKeyPair("SM2");
byte[] privateKey = pair.getPrivate().getEncoded();
System.out.println("私钥:"+ Base64.encodeBase64String(privateKey));
byte[] publicKey = pair.getPublic().getEncoded();
System.out.println("公钥:"+ Base64.encodeBase64String(publicKey)); SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
// 公钥加密,私钥解密
String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
System.out.println("密文:" + encryptStr);
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
System.out.println("明文:" + decryptStr); System.out.println("======== SM2使用自定义密钥生成的密钥对加密或解密,结束 ========");
}
public static void test4() {
System.out.println("======== 摘要加密算法SM3,开始 ========"); String text = "20201310hzx 20201303zyb 20201327ljm";
System.out.println("text:" + text);
String digestHex = SmUtil.sm3(text);
System.out.println("digestHex:" + digestHex); } // public static void test3() {
// System.out.println("======== SM2签名和验签,开始 ========");
//
// String content = "20201310hzx";
// final SM2 sm2 = SmUtil.sm2();
// String sign = sm2.signHex(HexUtil.encodeHexStr(content));
// System.out.println("sign:" + sign);
//
// boolean verify = sm2.verifyHex(HexUtil.encodeHexStr(content), sign);
// System.out.println("校验结果为:" + verify);
//
// System.out.println("======== SM2签名和验签,结束 ========");
// } public static void test5() {
// System.out.println("======== 对称加密SM4,开始 ========");
//
// String content = "20201310hzx";
// SymmetricCrypto sm4 = SmUtil.sm4();
//
// String encryptHex = sm4.encryptHex(content);
// System.out.println("密文:" + encryptHex);
// String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
// System.out.println("明文:" + decryptStr);
//
// System.out.println("======== 对称加密SM4,结束 ========"); String key = SM4.generateKey();
String input = "国密商密";
String output = SM4.encrypt(key, input);
System.out.println("CBC模式");
String iv = "12345678123456781234567812345678";
output = SM4.encrypt(key, input);
System.out.println("加密:" + output);
System.out.println("解密:" + SM4.decrypt(key, output, iv));
} /***
* 分开的:私钥签名,公钥验签
*/
// public static void test6(){
// System.out.println("======== 私钥签名公钥验签,开始 ========");
// String txt = "20201310hzx";
//
// String privateKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgfVNnk3eKogEiEAvYinFGZev31dT4gQqcEAAidzIKhC2gCgYIKoEcz1UBgi2hRANCAATolVEVuON8S9aOpnogLTzXzo0Dx58LMFjex7XPPcPtSmuq1Rh/ZM2qbYdZyzdnca8eCeR+cg+44rb/TyPRlH23";
// String publicKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE6JVRFbjjfEvWjqZ6IC08186NA8efCzBY3se1zz3D7UprqtUYf2TNqm2HWcs3Z3GvHgnkfnIPuOK2/08j0ZR9tw==";
//
// SM2 sm2Sign = SmUtil.sm2(privateKey, null);
// byte[] sign = sm2Sign.sign(txt.getBytes(), null);
// System.out.println("sign:" + Base64.encodeBase64String(sign));
//
// SM2 sm2 = SmUtil.sm2(null, publicKey);
// boolean verify = sm2.verify(txt.getBytes(), sign);
// System.out.print("verify:" + verify);
// System.out.println("======== 私钥签名公钥验签,结束 ========");
// }
// public static void test1() {
// System.out.println("======== SM2使用随机生成的密钥对加密或解密,开始 ========");
//
// String text = "20201310hzx";
// SM2 sm2 = SmUtil.sm2();
// // 公钥加密,私钥解密
// String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
// System.out.println("密文:" + encryptStr);
// String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
// System.out.println("明文:" + decryptStr);
//
// System.out.println("======== SM2使用随机生成的密钥对加密或解密,结束 ========");
// }
}

接收方b:

代码:

package org.example;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.superfw.crypto.gmsm.sm2.SM2EngineExtend;
import cn.superfw.crypto.gmsm.sm2.SM2KeyPair;
import cn.superfw.crypto.gmsm.sm3.*;
import cn.superfw.crypto.gmsm.sm4.*;
import org.apache.commons.codec.binary.Base64; import java.security.KeyPair; public class Main {
public static void main(String[] args) {
// String str = "20201310hzx";
//
// // 以非压缩公钥模式生成SM2秘钥对(通常), 对方是其他语言(比如GO语言)实现时也能支持
// // 压缩模式仅限于数据交互的双方都使用BC库的情况
// SM2KeyPair sm2Keys = SM2.generateSm2Keys(false);
//
// String pubKey = sm2Keys.getPublicKey();
// String prvKey = sm2Keys.getPrivateKey();
//
// System.out.println("Private Key: " + prvKey);
// System.out.println("Public Key: " + pubKey);
//
// System.out.println("\n加密解密测试");
// // 加解密测试(C1C2C3模式)
// System.out.println("----- C1C2C3模式 -----");
// try {
// System.out.println("加密前:" + str);
// String enData = SM2.encrypt(pubKey, str, SM2EngineExtend.CIPHER_MODE_BC);
// System.out.println("加密后:" + enData);
// String deData = SM2.decrypt(prvKey, enData, SM2EngineExtend.CIPHER_MODE_BC);
// System.out.println("解密后:" + deData);
// } catch (Exception e) {
// e.printStackTrace();
// System.out.println("加解密测试错误");
// }
//
// // 加解密测试(C1C3C2模式)
// System.out.println("----- C1C3C2模式 -----");
// try {
// System.out.println("加密前:" + str);
// String enData = SM2.encrypt(pubKey, str, SM2EngineExtend.CIPHER_MODE_NORM);
// System.out.println("加密后:" + enData);
// String deData = SM2.decrypt(prvKey, enData, SM2EngineExtend.CIPHER_MODE_NORM);
// System.out.println("解密后:" + deData);
// } catch (Exception e) {
// e.printStackTrace();
// System.out.println("加解密测试错误");
// }
//
// System.out.println("\n签名验签测试");
// // 签名和验签测试
// try {
// System.out.println("数据:" + str);
// String signStr = SM2.sign(prvKey, str);
// System.out.println("签名:" + signStr);
// boolean verify = SM2.verify(pubKey, str, signStr);
// System.out.println("验签结果:" + verify);
// } catch (Exception e) {
// e.printStackTrace();
// System.out.println("签名和验签测试错误");
// }
//
// System.out.println("SM3 国密商密:"+ SM3.digest("国密商密"));
//
//String key = SM4.generateKey();
// String key = "12345678945687";
String key = "A85CA99B75A2CAE27A659F50260C822E";
String input = "20201310hzx 20201303zyb 20201327ljm";
//
// System.out.println("Key:" + key);
// System.out.println("原文:" + input);
//
// System.out.println(); // System.out.println("ECB模式");
//
String output = SM4.encrypt(key, input);
// System.out.println("加密:" + output);
// System.out.println("解密:" + SM4.decrypt(key, output));
//
// System.out.println(); // System.out.println("CBC模式");
String iv = "12345678123456781234567812345678";
output = "31899368C959A79CE03813E7F62DFA349F4BE1B5A6BFCBF44218BB96E44D5825FC3949D49CD0CA94C3B80259EDAC4C67";
// output = SM4.encrypt(key, input, iv);
System.out.println("收到密文:" + output);
System.out.println("解密:" + SM4.decrypt(key, output, iv)); System.out.println("======== 摘要加密算法SM3,开始 ========");
String text = "20201310hzx 20201303zyb 20201327ljm";
System.out.println("text:" + text);
String digestHex = SmUtil.sm3(text);
System.out.println("digestHex:" + digestHex);
System.out.println("收到摘要:: f83fb8fcd8a7cb1cb0957d44fff554f1019997602c33d6371d02aa5c4d80da19");
System.out.println("======== SM2解密,开始 ========"); String text1 = "A85CA99B75A2CAE27A659F50260C822E";
KeyPair pair = SecureUtil.generateKeyPair("SM2");
//
String privateKey1 = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg1u3KJYl1jOvZ9/267ugByqR+119LjG1V/ItphTeTjkqgCgYIKoEcz1UBgi2hRANCAAStZ1XXrZk3BX2j0sCyK93NGXyTn0yOi8U5NOiyBpNmJZexEKiKzCecvDmSXsg0R/fDwIjdTztIdaLJealomLb";
byte[] privateKey = Base64.decodeBase64(privateKey1);
System.out.println("私钥:"+ privateKey1);
String publicKey1 ="MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAErWdV162ZNwV9o9LAsivdzRl8k59MjovFOTTosgaTZiWXsRCoiswnnLw5kl7INEf3w8CI3U87SHWiyXmpaJi28w==";
byte[] publicKey = Base64.decodeBase64(publicKey1);
System.out.println("公钥:"+ publicKey1);
SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
String encryptStr = "042A02F981A0C0D2B3D8BA2A8D4144A450FE2BFEF70EEF8CD16979962545F38452B0C3AC57D0953B6D268FFCBE75C57E8E01E1CAC187092060E375A5B923EE3897DBA5654BD633943684C278DF82347628382BC322A3C24A9C410225BC2B43945E23A6ED7DD1415A6B3D2D795834841B74ECA8878922B5DA03A8496186F64DF";
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
System.out.println("明文:" + "A85CA99B75A2CAE27A659F50260C822E");
System.out.println("使用sm4的密钥:" + "A85CA99B75A2CAE27A659F50260C822E"); }
}

keshe的更多相关文章

  1. 通信原理课程设计Javaswing技术计算出PCM编码——猎八哥FLY

    package keshe; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; ...

  2. Java课程设计--学生成绩管理系统

    一.团队名称: 团队成员 林艺薇 201721123032 网络1712 黄毓颖 201721123033 网络1712 唐川 201721123034 网络1712 梁才玉 201721123038 ...

  3. 球体的双目视觉定位(matlab,附代码)

    球体的双目视觉定位(matlab,附代码) 标签(空格分隔): 机器视觉 引言 双目视觉定位是我们的一个课程设计,最近刚做完,拿出来与大家分享一下,实验的目的是在拍摄的照片中识别球体,并求出该球体到相 ...

  4. 一个超实用的python爬虫功能使用 requests BeautifulSoup

    一个简单的数据爬取的示例 import os,re import requests import random import time from bs4 import BeautifulSoup us ...

随机推荐

  1. Finance财务软件(如何运行该软件)

    下载软件 首先,去gitHub下载该项目的release,尽量下载最新版本:https://github.com/edwardorchis/finance/releases.国内也可以在码云下载htt ...

  2. DataStructures 01 日期抽象类设计与实现

    1.思维导图以及学习体会 1.1 思维导图 1.2 学习体会 比较大的一个感概就是学习数据结构必须要一步一步来,前期切不可跳过思考过程, 最好的办法还是每一步慢慢分析,写在纸上,初期就要慢慢分析慢慢来 ...

  3. swoole的使用场景

    一.TCP服务器 二.UDP服务器 三.HTTP服务器 四.WebSocket服务器 五.物联网服务器 六.执行异步任务 七.协程

  4. holiday05

    第五天 cat cat会一次性显示所有的内容,适合查看 内容较少 的文本文件 选项 含义 -b 对非空输出行编号 -n 对输出的所有行编号 more more每次只显示一页内容,适合于查看 内容较多 ...

  5. Kubernetes--创建Ingress资源

    创建Ingress资源 Ingress资源是基于HTTP虚拟主机或URL的转发规则,它在资源配置清单的spec字段中嵌套了rules.backend和tls等字段进行定义.下面的示例中定义了一个Ing ...

  6. python菜鸟学习: 10. 函数的基本用法

    # -*- coding: utf-8 -*-# 回参函数def test01(): return 0# 以元组返回参数def test02(): return 1, [1, 2, 3, 4, 5], ...

  7. Jmeter添加Base64Img函数支持图片转换为Base64编码

    将JmeterBase64-1.0-SNAPSHOT放置到\lib\ext下即可: 直接使用即可. 制作方式: Jar包通过IntelliJ IDEA创建maven工程后,导出package:

  8. Java基础|03.基础语法(2)

    Java安全|03.Java基础语法(2) 00x1 单例模式 定义: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一 ...

  9. 【编程】Python3 使用自定义编码字符表解密Base64数据

    前言 Python提供了"base64"模块用于编码.解码Base64数据.但是并不是所有的Base64数据都会使用默认的字符表进行编码,所以这里对Python下实现自定义编码字符 ...

  10. qt中的一些对话框(个人备忘录)

    一.标准对话框 1.对于颜色对话框 void MyWidget::on_pushButton_clicked() { QColorDialog dialog(Qt::red,this); dialog ...