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. SAP 结构转JSON

    *使用方式 jsonstr = zui2_json=>serialize( data = ls_in compress = abap_true pretty_name = zui2_json=& ...

  2. Hub

    public class StreamHub : Hub { public ChannelReader<string> ReadLogStream() { var channel = Ch ...

  3. WPFGroupBox控件自定义

    先上效果图 直接上代码(直接在Window.Resources里面添加这段代码) <Style TargetType="GroupBox"> <Setter Pr ...

  4. ModuleNotFoundError: No module named 'numpy.testing.nosetester'解决方法

    在import numpy的时候编译器提示这个问题. 问题的原因是numpy版本>1.18,而scipy的版本<=0.19 解决方案: 卸载当前版本scipy(0.19),安装更高版本sc ...

  5. CSOL大灾变移植记录

    在2019年,我玩u3d把玩了一段时间,并制作了一些Demo,其中包括FPSDemo,RPG动作游戏Demo,一些截图如下: 时间到了2020年5月底,我开始玩之前大学研究过的jMonkeyEngin ...

  6. Oracle 数据库升级过程中的主要步骤

    Oracle 数据库升级包括六个主要步骤. Oracle 数据库的升级步骤工作流 步骤 1:准备升级 Oracle 数据库 熟悉 Oracle 数据库新版本的特性. 确定新版本的升级路径. 选择升级方 ...

  7. gash 支付方式

    首先客服人员会提供相应的支付demo代码,可根据此来处理 值得说的是 每次支付成功后 他会主动给你在后台设置的回调地址发送信息  你也要相应的返回对应的信息  发送过来的密文 有时会解密失败 可根据他 ...

  8. ubuntu ssh远程访问出现Permission denied(publickey,password)解决方法

    windows上安装SSH服务设置–>应用–>可选功能–>添加功能–>安装 OpenSSH服务器 和 OpenSSH客户端在左下角搜索栏输入服务,将相关SSH服务设置为自动(延 ...

  9. 数据结构(C语言)_链表

    //单链表按序号查找节点的值 LNode* GetElem(LinkList L, int i) { int j = 1; LNode* p = L->next; if (i == 0) ret ...

  10. STM32中遇到的一些关键字

    3.在STM32编程中遇到的一些关键字 STM32是基于RAM的架构,学习它可以是嵌入式的一个基础部分.因此对于一些关键字也必须了解,在STM32学习过程中,遇到过如下变量,对其有疑问 关键字 功能 ...