国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

適用于前后端公用的SM2國密加密傳輸, JAVA + VUE

這篇具有很好參考價值的文章主要介紹了適用于前后端公用的SM2國密加密傳輸, JAVA + VUE。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

由于等保和多個系統(tǒng)間的數(shù)據(jù)傳輸加密, 寫了一個共有的前端與后端, 后端與后端,的通用算法SM2簡單加密,? 不需要驗簽, 幾行代碼搞定.?

引包, 測試好幾遍, 這個包適合jdk1.8使用

1、后端代碼示例

引包,

        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk18on</artifactId>
            <version>1.72</version>
        </dependency>

沒有意外就應該直接能用下面代碼了

import org.bouncycastle.asn1.gm.GMNamedCurves;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.*;
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.math.ec.ECPoint;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Test;

import java.math.BigInteger;
import java.security.*;
import java.security.spec.ECGenParameterSpec;


/**
 * 簡單的sm2
 */
public class SimpSM2Util {

    /**
     * SM2加密算法
     * @param publicKey     公鑰
     * @param data          明文數(shù)據(jù)
     * @return
     */
    public static String encrypt(String publicKey, String data) {
        // 獲取一條SM2曲線參數(shù)
        X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
        // 構造ECC算法參數(shù),曲線方程、橢圓曲線G點、大整數(shù)N
        ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());
        //提取公鑰點
        ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(Hex.decode(publicKey));
        // 公鑰前面的02或者03表示是壓縮公鑰,04表示未壓縮公鑰, 04的時候,可以去掉前面的04
        ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters);

        SM2Engine sm2Engine = new SM2Engine(SM2Engine.Mode.C1C3C2);
        // 設置sm2為加密模式
        sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom()));

        byte[] arrayOfBytes = null;
        try {
            byte[] in = data.getBytes();
            arrayOfBytes = sm2Engine.processBlock(in, 0, in.length);
        } catch (Exception e) {
            System.out.println("SM2加密時出現(xiàn)異常:"+e.getMessage());
        }
        return Hex.toHexString(arrayOfBytes);

    }

    /**
     * SM2解密算法
     * @param privateKey        私鑰
     * @param cipherData        密文數(shù)據(jù)
     * @return
     */
    public static String decrypt(String privateKey, String cipherData) {
        // 使用BC庫加解密時密文以04開頭,傳入的密文前面沒有04則補上
        if (!cipherData.startsWith("04")){
            cipherData = "04" + cipherData;
        }
        byte[] cipherDataByte = Hex.decode(cipherData);
        BigInteger privateKeyD = new BigInteger(privateKey, 16);
        //獲取一條SM2曲線參數(shù)
        X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
        //構造domain參數(shù)
        ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());
        ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters);

        SM2Engine sm2Engine = new SM2Engine(SM2Engine.Mode.C1C3C2);
        // 設置sm2為解密模式
        sm2Engine.init(false, privateKeyParameters);

        String result = "";
        try {
            byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length);
            return new String(arrayOfBytes);
        } catch (Exception e) {
            System.out.println("SM2解密時出現(xiàn)異常:"+e.getMessage());
        }
        return result;
    }

    /*@Test  
    // 生成密鑰
    public void createKey() throws Exception{
        //String M="encryption standard111111111111111111111111111111";
        SimpSM2Util sm2 = new SimpSM2Util();
        ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");
        // 獲取一個橢圓曲線類型的密鑰對生成器
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());
        // 使用SM2參數(shù)初始化生成器
        kpg.initialize(sm2Spec);
        // 獲取密鑰對
        KeyPair keyPair = kpg.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        BCECPublicKey p=(BCECPublicKey)publicKey;
        System.out.println("publicKey:"+Hex.toHexString(p.getQ().getEncoded(false)));

        PrivateKey privateKey = keyPair.getPrivate();
        BCECPrivateKey s=(BCECPrivateKey)privateKey;
        System.out.println("privateKey:"+Hex.toHexString(s.getD().toByteArray()));

    }*/
}

? ? publicKey:04aa909915f87880507e3de515220cc8f82b1c5693f56a0475b3b48ff7448c229734cd724e603000dd78569faa9fbc1eeb93a6d836190a0ee734e2d9e74d804f28
? ? privateKey:00a684d832831d5371d2ff9de6a021a33fb396451e74e0ffe0d415c298b36876fe

加密:? SimpSM2Util.encrypt("共有密鑰", "明文");?

解密:? SimpSM2Util.decrypt("私有密鑰", "密文");

后端代碼使用一個工具類, 可參考


import org.bouncycastle.crypto.engines.SM2Engine;

/**
 * 簡單單例SM2加解密, 配合前端
 */
public class LoSM2 {

    private static String ECNameModel = "sm2p256v1";
    private static SM2Engine.Mode CipherMode = SM2Engine.Mode.C1C3C2;
    private final String privateKey;
    private final String publicKey;

    private LoSM2(String privateKey, String publicKey){
        this.privateKey = privateKey;
        this.publicKey = publicKey;
    }

    private volatile static LoSM2 instance = null;

    public static LoSM2 getInstance(){
        if(instance == null){
            throw new RuntimeException("請InitKey初始化密鑰!!!");
        }
        return instance;
    }

    /**
     * SM2初始密鑰(私鑰,公鑰)
     * @param privateKey
     * @param publicKey
     * @return
     */
    public static LoSM2 InitKey(String privateKey, String publicKey) {
        if(instance == null){
            synchronized(LoSM2.class){
                if(instance == null){
                    instance = new LoSM2(privateKey, publicKey);
                }
            }
        }
        return instance;
    }

    private static class SM2SimpSelfLoader {
        private static final LoSM2 instance = InitKey("", "");
    }

    private static boolean IsInitKey(){
        if(instance == null) {
            throw new RuntimeException("請InitKey初始化密鑰!!!");
        }else {
            return true;
        }
    }

    /**
     * SM2加密
     * @param cleartext          明文數(shù)據(jù)
     */
    public String encrypt(String cleartext) {
        if(!IsInitKey())
            return "";
        return SimpSM2Util.encrypt(instance.publicKey, cleartext);        
    }

    /**
     * SM2解密
     * @param cipherData        密文數(shù)據(jù)
     */
    public static String decrypt(String cipherData) {
        if(!IsInitKey())
            return "";
        return SimpSM2Util.decrypt(instance.privateKey, cipherData);
    }

}

2、前端代碼示例

安裝sm-crypto包:? ?npm install --save?sm-crypto

前端加解密更簡單,? 引包后就能用

let txt='簡單加密不要驗簽'  //要加密的字段
const sm2 = require('sm-crypto').sm2
const cipherMode = 1;// 1 - C1C3C2,0 - C1C2C3,默認為1
var publicKey =  "04aa909915f87880507e3de515220cc8f82b1c5693f56a0475b3b48ff7448c229734cd724e603000dd78569faa9fbc1eeb93a6d836190a0ee734e2d9e74d804f28";
// 加密結果            
let encryptData = sm2.doEncrypt(txt, publicKey, cipherMode);
// 解密
sm2.doDecrypt(txt, privateKey, cipherMode);

適合簡單的傳輸加密

3、避坑指南

在引用?bcprov-jdk18on 包的時候, 有可能存在版本沖突, 或本地安全問題,? 這個是我在返回切換工程遇到的問題?

可以嘗試把?bcprov-jdk18on-1.72.jar 加入mvn的import的sdks里面

java sm2,前端,后端,隨筆,java,vue,安全

還可以試試?mvn idea:module

或者試試? mvn: idea:idea文章來源地址http://www.zghlxwxcb.cn/news/detail-592598.html

到了這里,關于適用于前后端公用的SM2國密加密傳輸, JAVA + VUE的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 使用 Java Bouncy Castle實現(xiàn)國密算法SM4、SM3以及SM2的加密

    使用 Java Bouncy Castle實現(xiàn)國密算法SM4、SM3以及SM2的加密

    國密算法的實現(xiàn)借助了Java庫函數(shù) Bouncy Castle,加密庫安裝使用教程請參考鏈接 SM4,又稱為商密算法,是一種分組密碼算法,于2012年由中國密碼技術研究中心(中國密碼學會成員)發(fā)布,目前已成為我國國家密碼算法,并在多個領域得到了廣泛的應用。SM4算法采用了32輪迭代結

    2024年02月16日
    瀏覽(34)
  • 小程序 實現(xiàn) 國密 sm2 加密

    小程序 實現(xiàn) 國密 sm2 加密

    第一步:進入微信小程序項目目錄下,輸入cmd ? ?第二步:加載插件包 第三步:加載成功之后,會參生這個文件夾 ? ? 第四步:然后在對應的js文件中引入miniprogram-sm-crypto/index.js ? 第五步: 加密方式,加密方法 ?

    2024年02月16日
    瀏覽(21)
  • 前端sm2國密加密解密

    1.下載國密包 2.獲取后端的公鑰 注sm-crypto使用BC庫加解密前端密鑰與后端密鑰是兩隊,非常規(guī)的base64密鑰 前端公鑰需要在前面加04占位否則無法解密 3.前端使用公鑰進行加密 生成的加密串加04方便后端解密 4.前端使用私鑰解密

    2024年02月11日
    瀏覽(100)
  • 國密SM2前端加密解密示例

    目錄 一、?安裝sm2依賴 二、編寫代碼 1、data中綁定數(shù)據(jù) 2、公鑰加密 3、私鑰解密 4、按鈕綁定一下,數(shù)據(jù)可見一下 三、完整代碼 要改變的數(shù)據(jù)phone和過程數(shù)據(jù)copyphone,公鑰publicKey和私鑰privateKey 具體生成測試公鑰私鑰可參照SM2加解密 C1為65字節(jié)第1字節(jié)為壓縮標識,這里固定為

    2024年02月03日
    瀏覽(91)
  • vue普通加密以及國密SM2、SM3、sm4的使用

    sm-crypto:https://www.npmjs.com/package/sm-crypto 1. SM2是非對稱加密算法 它是基于橢圓曲線密碼的公鑰密碼算法標準,其秘鑰長度256bit,包含數(shù)字簽名、密鑰交換和公鑰加密,用于替換RSA/DH/ECDSA/ECDH等國際算法。可以滿足電子認證服務系統(tǒng)等應用需求,由國家密碼管理局于2010年12月17號

    2023年04月09日
    瀏覽(24)
  • OpenSSL 3.1.1 ECC 加密、解密、簽名、驗簽(國密 sm2、sm3)

    openssl 3 默認廢棄了 舊版本 (opessl 1.x) 的部分api 導致部分舊ecc 代碼無法使用(可以通過配置編譯選項打開) ,這里展示如何使用新接口用ECC 進行加密解密。 新接口是真的方便,基本上你都不需要懂啥密碼學知識,對我們這種密碼白癡來說太好了 頭文件 生成密鑰對 導出公

    2024年02月05日
    瀏覽(54)
  • 醫(yī)保移動支付加密解密請求工具封裝【國密SM2SM4】

    醫(yī)保移動支付加密解密請求工具封裝【國密SM2SM4】

    醫(yī)保移動支付加密解密請求工具封裝 定點醫(yī)藥機構向地方移動支付中心發(fā)起費用明細上傳、支付下單、醫(yī)保退費等交易時需要發(fā)送密文,由于各大醫(yī)療機構廠商的開發(fā)語各不相同,可能要有java的、c#的、python的、pb的、nodjs的、php的、還可能有Delphi的等。。。。很多開發(fā)語言

    2024年01月21日
    瀏覽(123)
  • 國密SM2算法的加密簽名消息語法封裝解析p7格式signedData

    國密SM2算法的加密簽名消息語法封裝解析p7格式signedData

    前文可參考:SM2算法的加密簽名消息語法規(guī)范(三)如何構造signedData_天對地,雨對風的博客-CSDN博客系列。 這里直接講openssl asn1解析和封裝的部分代碼。 國密?p7格式標準,參考:GMT0010-2012 1、p7 簽名結構: ?編寫結構體GMTSignedData.h 注意:SM2_SignedData_st結構中的sign類型修改為

    2024年02月11日
    瀏覽(27)
  • 國密算法 SM2 公鑰加密 數(shù)字簽名 密鑰交換 全網最高效的開源python代碼

    國密算法 SM2 公鑰加密 數(shù)字簽名 密鑰交換 全網最高效的開源python代碼

    此前發(fā)布過SM2、SM3、SM4、ZUC等文章,以及開源的完整python代碼。近些天看到一篇電子科大蘭同學的碩士畢業(yè)論文(蘭修文. ECC計算算法的優(yōu)化及其在SM2實現(xiàn)中的運用[D]. 成都: 電子科技大學, 2019),文中采用預計算加速SM2橢圓曲線基點點乘,將這個思路用python代碼實現(xiàn)后,實測

    2024年02月09日
    瀏覽(54)
  • JAVA集成國密SM2

    JAVA集成國密SM2

    國密算法概述:https://blog.csdn.net/qq_38254635/article/details/131801527 SM2橢圓曲線公鑰密碼算法 為非對稱加密,基于ECC。該算法已公開。由于該算法基于ECC,故其簽名速度與秘鑰生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一種)安全強度比RSA 2048位高,但運算速度快于RSA。

    2024年02月13日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包