文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

SM3和SM4密钥

2023-09-06 17:50

关注

一. 概述

国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,目前主要使用公开的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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯