当前位置:   article > 正文

Java实现SM2前后端加解密_前后端 sm2 加解密,2024最新中高阶网络安全面试题总结_java sm2加解密

java sm2加解密

function sm2EncryptPwd(data) {

var publicKey = ‘04XXXXXXXXXXXXXXXXXXXXXXXXXXXCB42F6044B1BA8640B42AE038252F3490F02029E37B91D6E0796DE0B3D67166CDD971E556EF1D6B54ED350031817DED6B0C40’;

return sm2Encrypt(data, publicKey, 1);

}

公钥用后端的生成公私钥对方法生成,请勿使用文章提到的公私钥对。

例如login.js使用了加密,即

login.js,调用加密函数

var encryptedPwd = sm2EncryptPwd(pwd);

3.后端Java解密

引用依赖库 bcprov-jdk15on-1.68.jar

org.bouncycastle

bcprov-jdk15on

1.68

login.java

私钥附上对应的值

pwd = new String(SM2Utils.decrypt(pwd, sm2PrivKey));

Sm2Utils.java

package com.sgsg.basic.encrypt.util;

import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.signers.SM2Signer;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.jce.spec.ECPrivateKeySpec;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.util.encoders.Hex;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.spec.ECGenParameterSpec;
import java.util.Base64;

/**

  • SM2工具类
  • @author van
    */
    public class SM2Utils {

/**

  • 生成 SM2 公私钥对
  • @return
  • @throws NoSuchAlgorithmException
  • @throws InvalidAlgorithmParameterException
    */
    public static KeyPair geneSM2KeyPair() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
    final ECGenParameterSpec sm2Spec = new ECGenParameterSpec(“sm2p256v1”);
    // 获取一个椭圆曲线类型的密钥对生成器
    final KeyPairGenerator kpg = KeyPairGenerator.getInstance(“EC”, new BouncyCastleProvider());
    // 产生随机数
    SecureRandom secureRandom = new SecureRandom();
    // 使用SM2参数初始化生成器
    kpg.initialize(sm2Spec, secureRandom);
    // 获取密钥对
    KeyPair keyPair = kpg.generateKeyPair();
    return keyPair;
    }

/**

  • 生产hex秘钥对
    /
    public static void geneSM2HexKeyPair(){
    try {
    KeyPair keyPair = geneSM2KeyPair();
    PrivateKey privateKey = keyPair.getPrivate();
    PublicKey publicKey = keyPair.getPublic();
    System.out.println(“======== EC X Y keyPair “);
    System.out.println(privateKey);
    System.out.println(publicKey);
    System.out.println(”
    hex keyPair ");
    System.out.println("hex priKey: " + getPriKeyHexString(privateKey));
    System.out.println(“hex pubKey: " + getPubKeyHexString(publicKey));
    System.out.println(”
    base64 keyPair ");
    System.out.println("base64 priKey: " + new String(Base64.getEncoder().encode(privateKey.getEncoded())));
    System.out.println(“base64 pubKey: " + new String(Base64.getEncoder().encode(publicKey.getEncoded())));
    System.out.println(”
    generate finished ========”);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    /
    *
  • 获取私钥(16进制字符串,头部不带00长度共64)
  • @param privateKey 私钥PrivateKey型
  • @return
    /
    public static String getPriKeyHexString(PrivateKey privateKey) {
    // OK
    // BCECPrivateKey s=(BCECPrivateKey)privateKey;
    // String priKeyHexString = Hex.toHexString(s.getD().toByteArray());
    // if(null!= priKeyHexString && priKeyHexString.length()==66 && “00”.equals(priKeyHexString.substring(0,2))){
    // return priKeyHexString.substring(2);
    // }
    // OK
    BCECPrivateKey key = (BCECPrivateKey) privateKey;
    BigInteger intPrivateKey = key.getD();
    String priKeyHexString = intPrivateKey.toString(16);
    return priKeyHexString;
    }
    /
    *
  • 获取私钥 base64字符串
  • @param privateKey 私钥PrivateKey型
  • @return
    */
    public static String getPriKeyBase64String(PrivateKey privateKey) {
    return new String(Base64.getEncoder().encode(privateKey.getEncoded()));
    }

/**

  • 获取公钥(16进制字符串,头部带04长度共130)
  • @param publicKey 公钥PublicKey型
  • @return
    /
    public static String getPubKeyHexString(PublicKey publicKey) {
    BCECPublicKey key = (BCECPublicKey) publicKey;
    return Hex.toHexString(key.getQ().getEncoded(false));
    }
    /
    *
  • 获取公钥 base64字符串
  • @param publicKey 公钥PublicKey型
  • @return
    */
    public static String getPubKeyBase64String(PublicKey publicKey) {
    return new String(Base64.getEncoder().encode(publicKey.getEncoded()));
    }

/**

  • SM2加密算法
  • @param publicKey 公钥
  • @param data 明文数据
  • @return
    */
    public static String encrypt(String data, PublicKey publicKey) {
    return encrypt(data.getBytes(StandardCharsets.UTF_8), publicKey);
    }

/**

  • @param data
  • @param publicKey
  • @return
  • @author
  • @version 1.0
  • 2023年4月12日下午4:41:24
    */
    public static String encrypt(byte[] data, PublicKey publicKey) {
    BCECPublicKey key = (BCECPublicKey) publicKey;
    return encrypt(data, Hex.toHexString(key.getQ().getEncoded(false)));
    }

/**

  • @param data
  • @param pubKeyHexString
  • @return
  • @author
  • @version 1.0
  • 2023年4月12日下午4:46:37
    */
    public static String encrypt(String data, String pubKeyHexString) {
    return encrypt(data.getBytes(StandardCharsets.UTF_8), pubKeyHexString);
    }

/**

  • SM2加密算法
  • @param pubKeyHexString 公钥(16进制字符串)
  • @param data 明文数据
  • @return hex字符串

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/589355
推荐阅读
相关标签