使用国密算法SM2加密数据进行前后台传输

使用国密算法SM2加密数据进行前后台传输

引用jar包

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.60</version>
</dependency>

工具类

package com.waving.test;

import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.math.ec.ECPoint;

import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Base64;

public class SM2Main {
    public static void main(String[] args) throws Exception{
        String password = "04068521d007785e02a02f4d51eab175040f371a69ee8f14ec41418d05dc533c0ba15305006011ae2a9524c0c684f1b2e332087c43af4d52986770047cfc204e302f62b91559708556b5afe45c5cd66db76877b536ca070020334ea5519eefe5718f77e016e06ec50e27d0089be3b41335aef50338";
        String privateKey = "5206da9df203603af3d4aa25f6b6df08dfa636249609407f6ea8d069d9e2dc2b";
        String result = getPassword(password, privateKey);
        System.out.println("result = " + result);
        //generatePublicKey();

    }

    public static String generatePublicKey() throws Exception {
        X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
        ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());
        ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
        keyPairGenerator.init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG")));
        AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();
        //私钥,16进制格式,自己保存,格式如a2081b5b81fbea0b6b973a3ab6dbbbc65b1164488bf22d8ae2ff0b8260f64853
        BigInteger privatekey = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD();
        String privateKeyHex = privatekey.toString(16);
        System.out.println("privateKeyHex = " + privateKeyHex);
        //公钥,16进制格式,由后端生成
        ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ();
        String publicKeyHex = org.bouncycastle.util.encoders.Hex.toHexString(ecPoint.getEncoded(false));
        System.out.println("publicKeyHex = " + publicKeyHex);
        return publicKeyHex;
    }

    public static String getPassword(String password, String privateKey) {
        String data = null;
        try {
            BigInteger privateKeyD = new BigInteger(privateKey, 16);
            byte[] cipherDataByte = org.bouncycastle.util.encoders.Hex.decode(password);
            X9ECParameters sm2EcParameters = GMNamedCurves.getByName("sm2p256v1");
            ECDomainParameters domainParameters = new ECDomainParameters(sm2EcParameters.getCurve(), sm2EcParameters.getG(), sm2EcParameters.getN());
            ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters);
            // 用私钥解密
            SM2Engine sm2Engine = new SM2Engine();
            sm2Engine.init(false, privateKeyParameters);
            byte[] arrayOfBytes = Base64.getDecoder().decode(sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length));
            java.lang.String s = new java.lang.String(arrayOfBytes);
            data = new String(s);
        } catch (InvalidCipherTextException e) {
            e.printStackTrace();
        }
        return data;
    }
}

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>sm2测试</title>
    <script src="js/crypto-js.js"></script>
    <script src="js/sm2.js"></script>
    <script>
        function encrypt() {
            // 公钥
            var publicKey = "042528117c8b05f06b1a9da658811e169156801d23b77792b6e461de327157bf5a0c1477ad266883b99be6ec049a51b141fa94864d87b9c8724d86f5247f26b298";
            var encrypt = sm2Encrypt("waving is best", publicKey, 0);
            console.log(encrypt);
        }
    </script>
</head>
<body onload="encrypt()">
    <button onload="encrypt()">haha</button>
</body>
</html>

主要的是要这个sm2.js文件,可去gitHub这个项目里下载这个js,附https://github.com/biparadox/gm_sm2_master

附注

sm2加密算法为非对称加密算法,它会生成公钥与私钥,私钥保存在后台配置文件中,前端拿着私钥对数据进行加密,然后传给后端,后端将加密数据保存在数据库,当真实想要的时候再进行解密

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 国密算法SM2是中国自主研发的一种基于椭圆曲线密码学的公钥加密算法,是对RSA和ECC的一种补充和完善。SM2算法具有安全、高效、灵活等特点,性能更优,且可以在国家保密需求下有良好应用。SM2算法可用于数字签名、密钥交换和加密等密码学应用,是最适合在中国国内使用加密算法之一。 在线SM2算法服务可以为用户提供方便的加密服务,同时保障信息安全。通过在线SM2算法服务,用户可以轻松实现加密数据、签名和验签等操作,同时可以避免因不正确使用SM2算法而造成信息泄露等安全问题。在线SM2算法服务还可以提供密钥交换功能,确保数据传输过程中的隐私和完整性。 总之,国密算法SM2在线服务是一种安全、可靠的加密解决方案,可以帮助用户保护数据的隐私和完整性,同时可以为用户提供方便的加密服务,推动信息安全保护水平的提升和数字化进程的发展。 ### 回答2: 国密算法SM2是我国自主研发的公钥密码算法,它是适用于数字签名、密钥交换和加密等多种场景的密码算法SM2算法采用基于椭圆曲线的密码学算法,与传统的RSA、DSA、ECC等相比,具有更高的安全性和更快的速度,且能够在轻量级设备上运行,适用范围广泛。 国密算法SM2在线服务提供了SM2算法的相关功能,包括ECIES加密、ECDSA签名、公私钥生成、密钥派生等一系列操作。借助在线服务,用户可以直接在线使用SM2算法进行数据加密、签名和验证等操作,而无需安装和配置任何软件,十分方便快捷。 SM2在线服务也为企业和开发者提供了一种简单易用、高效安全的密码编程接口,可以轻松地嵌入到自己的应用中,提供更加丰富的数据保护方案。同时,SM2在线服务还提供了一系列应用案例和详细的文档资料,帮助用户更好的了解和使用SM2算法。 总之,国密算法SM2在线服务是一款基于SM2算法的在线密码工具,提供了丰富的功能和编程接口,便于用户轻松实现数据加密、签名和验证等操作,适用于各种应用场景,是一款非常有价值的密码工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值