我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SM3和SM4密钥

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SM3和SM4密钥

一. 概述

国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,目前主要使用公开的SM2SM3SM4三类算法,分别是非对称算法哈希算法对称算法

SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。

SM4算法:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。

二. 实现

(1) SM3

参数为要加密的内容和秘钥;

import java.io.UnsupportedEncodingException;import org.bouncycastle.crypto.digests.SM3Digest;import org.bouncycastle.crypto.macs.HMac;import org.bouncycastle.crypto.params.KeyParameter;import sun.misc.BASE64Encoder;public class SM3Util {public static String getSignatureBySM3(String message, String secret) {    String signature = null;    KeyParameter keyParameter;    try {        keyParameter = new KeyParameter(secret.getBytes("UTF-8"));        SM3Digest digest = new SM3Digest();        HMac mac = new HMac(digest);        mac.init(keyParameter);        mac.update(message.getBytes("UTF-8"), 0, message.length());        byte[] byteSM3 = new byte[mac.getMacSize()];        mac.doFinal(byteSM3, 0);        signature = new BASE64Encoder().encode(byteSM3);    } catch (UnsupportedEncodingException e) {        System.out.println("getSignatureBySM3 error :");            e.printStackTrace();    }    return signature;}}

(2) SM4

import java.security.Security;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import org.apache.commons.codec.binary.Hex;import com.huawei.crypto.provider.SMS4KeySpec;import sun.misc.BASE64Decoder;public class SM4Util {static {Security.addProvider(new com.huawei.crypto.provider.HWJCE());  }    public static String decode(String encrypted, String secretKey) throws Exception {        // 加密结果转码        byte[] data = Hex.decodeHex(encrypted.toCharArray());        // 用户密钥处理        SecretKey key = getKey(secretKey);        // 解密        Cipher cipher = Cipher.getInstance("SMS4");        cipher.init(Cipher.DECRYPT_MODE, key);        byte[] reclaimedBytes = cipher.doFinal(data);        // 将解密结果输出        return new String(reclaimedBytes, "utf-8");    }        public static String encode(String source, String secretKey)            throws Exception {        // 字符串转byte[]        byte[] data = source.getBytes("utf-8");        // 密钥处理        SecretKey key = getKey(secretKey);        // 加密        Cipher cipher = Cipher.getInstance("SMS4");        cipher.init(Cipher.ENCRYPT_MODE, key);        byte[] encryptedBytes = cipher.doFinal(data);        // 将加密结果转16进制输出        return Hex.encodeHexString(encryptedBytes);    }        private static SecretKey getKey(String secretKey) throws Exception {        byte[] keyBytes = new BASE64Decoder().decodeBuffer(secretKey);        SMS4KeySpec sms4KeySpec = new SMS4KeySpec(keyBytes);        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("SMS4");        return keyFactory.generateSecret(sms4KeySpec);    }    }

来源地址:https://blog.csdn.net/Swofford/article/details/129507950

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SM3和SM4密钥

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

2023-09-06

vue普通加密及国密SM2、SM3和sm4的使用例子

在我的项目中,甲方要求系统登录时对密码进行加密后再传给后端,指定使用国密SM3,下面这篇文章主要给大家介绍了关于vue普通加密及国密SM2、SM3和sm4使用的相关资料,需要的朋友可以参考下
2022-12-14

使用 Java Bouncy Castle实现国密算法SM4、SM3以及SM2的加密

国密算法的实现借助了Java库函数 Bouncy Castle,加密库安装使用教程请参考链接 SM4 简介 SM4,又称为商密算法,是一种分组密码算法,于2012年由中国密码技术研究中心(中国密码学会成员)发布,目前已成为我国国家密码算法,
2023-08-18

vue项目使用md5加密、crypto-js加密、国密sm3及国密sm4的方法

密码或者其他比较重要东西假如使用明文传输中是很危险的,所以就需要前端一些加密协议,对密码、手机号、身份证号等信息进行保护,下面这篇文章主要给大家介绍了关于vue项目中使用md5加密、crypto-js加密、国密sm3及国密sm4的相关资料,需要的朋友可以参考下
2022-12-08

对称密钥和非对称密钥有什么区别

对称密钥和非对称密钥有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。对称密钥和非对称密钥的区别是,对称密钥加解密使用同一个密钥,非对称密钥加解密使用不用密钥;对称密
2023-06-14

如何使用sm4js进行加密和国密sm4总结

近期由于公司项目的需要开始研究国密SM4加密,下面这篇文章主要给大家介绍了关于如何使用sm4js进行加密和国密sm4的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-05-18

Android 获取签名公钥和公钥私钥加解密的方法(推荐)

如下所示:public class GetPublicKey {protected static String getSignInfo(Context mCont
2022-06-06

win8系统如何查看和更改密钥 win8系统查看和更改密钥的图文教程

win8系统查看更改密钥的图文教程:1、对WIN8的一些操作进行选择时,会发现提示我们必须去激活,但是很遗憾,没有在任何界面找到一些图形界面去修改KEY;2、打开左下角的“开始”按钮,输入cmd,找到CMD程序,鼠标
2022-06-04

kubernetes中如何创建TLS证书和密钥

这篇文章将为大家详细讲解有关kubernetes中如何创建TLS证书和密钥,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:前言每个Kubernetes集群都有一个集群根证书颁发机构(CA)。 集群中的组
2023-06-04

Linux ~/.ssh目录详解和密钥对使用

.ssh目录内容 Linux中,每个用户的根目录下都有一个.ssh目录,保存了ssh相关的key和一些记录文件。例如: root@ubuntu:~/.ssh# lsauthorized_keys id_rsa id_rsa.pub k
2023-08-19

怎么使用java生成激活码和密钥

这篇文章主要介绍“怎么使用java生成激活码和密钥”,在日常操作中,相信很多人在怎么使用java生成激活码和密钥问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用java生成激活码和密钥”的疑惑有所帮助!
2023-06-30

Win10已经激活系统密钥及怎么备份和查询?

电脑已经安装Windows10的系统,且通过不同方法,激活了系统,但有的不是通过密钥激活,而是参与Windows Insider计划,激活方式为:Windows 已使用与Microsoft 帐户关联的数字许可证激活(在更新和安全 - 激活中
2023-05-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录