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

國密算法-SM2

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

????????國密算法是國家密碼局制定標(biāo)準(zhǔn)的一系列算法,包括SM1、SM2、SM3、SM4等。其中,SM1是采用硬件實現(xiàn)的,不予討論;SM2是非對稱加密算法;SM3是摘要算法;SM4是對稱加密算法。本篇貼出SM2?Java版本實現(xiàn)生成公私鑰及加解密、簽名驗簽代碼,供大家一起討論學(xué)習(xí),所有的代碼實現(xiàn)都是基于BC庫來做的。
????????BC庫是實現(xiàn)加解密算法的基礎(chǔ)庫,我們首先要在代碼里引入BC庫

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

? ? ? ? 下面是整個工具類,實現(xiàn)密鑰生成,加解密及簽名驗簽功能文章來源地址http://www.zghlxwxcb.cn/news/detail-503778.html

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.SM2Engine;
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.util.ECUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.security.*;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.KeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class Sm2Utils {

    private static Logger log = LoggerFactory.getLogger(Sm2Utils.class);

    /**
     * SM2算法生成密鑰對
     *
     * @return 密鑰對信息
     */
    public static KeyPair generateSm2KeyPair() {
        try {
            final ECGenParameterSpec sm2Spec = new ECGenParameterSpec("prime256v1");
            final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());
            SecureRandom random = new SecureRandom();
            kpg.initialize(sm2Spec, random);
            KeyPair keyPair = kpg.generateKeyPair();
            return keyPair;
        } catch (Exception e) {
            log.error("generate sm2 key pail failed:", e.getMessage(), e);
            throw  new RuntimeException("生成密鑰對失敗");
        }
    }

    /**
     * sm2公鑰加密
     *
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
        KeySpec keySpec = new X509EncodedKeySpec(key);
        PublicKey publicKey = KeyFactory.getInstance("EC", new BouncyCastleProvider()).generatePublic(keySpec);
        ECPublicKeyParameters parameters = (ECPublicKeyParameters) ECUtil.generatePublicKeyParameter(publicKey);
        CipherParameters pubKeyParameters = new ParametersWithRandom(parameters);
        SM2Engine engine = new SM2Engine(SM2Engine.Mode.C1C2C3);
        engine.init(true, pubKeyParameters);
        return engine.processBlock(data, 0, data.length);
    }


    /**
     * sm2私鑰解密
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
        KeySpec keySpec = new PKCS8EncodedKeySpec(key);
        KeyFactory keyfactory = KeyFactory.getInstance("EC", new BouncyCastleProvider());
        PrivateKey privateKey = keyfactory.generatePrivate(keySpec);
        CipherParameters privateKeyParameters = ECUtil.generatePrivateKeyParameter(privateKey);
        SM2Engine engine = new SM2Engine(SM2Engine.Mode.C1C2C3);
        engine.init(false, privateKeyParameters);
        byte[] byteDate = engine.processBlock(data, 0, data.length);
        return byteDate;
    }

    /**
     * 私鑰簽名
     * @param data
     * @param key
     * @return
     * @throws Exception
     */

    public static byte[] sign(byte[] data, byte[] key) throws Exception {
        SM2Signer signer = new SM2Signer();
        KeySpec keySpec = new PKCS8EncodedKeySpec(key);
        KeyFactory keyfactory = KeyFactory.getInstance("EC", new BouncyCastleProvider());
        PrivateKey privateKey =  keyfactory.generatePrivate(keySpec);
        ECPrivateKeyParameters keyParameters = (ECPrivateKeyParameters) ECUtil.generatePrivateKeyParameter(privateKey);
        CipherParameters param = new ParametersWithRandom(keyParameters);
        signer.init(true, param);
        signer.update(data, 0, data.length);
        return signer.generateSignature();
    }

    /**
     * 公鑰驗簽
     * @param data
     * @param sign
     * @param key
     * @return
     * @throws Exception
     */
    public static boolean verify(byte[] data, byte[] sign, byte[] key) throws Exception {
        SM2Signer signer = new SM2Signer();
        KeySpec keySpec = new X509EncodedKeySpec(key);
        PublicKey publicKey = KeyFactory.getInstance("EC", new BouncyCastleProvider()).generatePublic(keySpec);
        CipherParameters param =  ECUtil.generatePublicKeyParameter(publicKey);
        signer.init(false, param);
        signer.update(data, 0, data.length);
        return signer.verifySignature(sign);
    }


    public static void main(String[] args) throws Exception {
        KeyPair keyPair = generateSm2KeyPair();//生成密鑰
        String publicKey = Base64.encodeBase64String(keyPair.getPublic().getEncoded());
        String privateKey = Base64.encodeBase64String(keyPair.getPrivate().getEncoded());
        System.out.println("sm2公鑰=" + publicKey);
        System.out.println("sm2私鑰=" + privateKey);
        String plaintext = "test";//明文
        String signature = Base64.encodeBase64String((sign(plaintext.getBytes("utf-8"),keyPair.getPrivate().getEncoded())));
        String ciphertext = Base64.encodeBase64String(encrypt(plaintext.getBytes("utf-8"), Base64.decodeBase64(publicKey)));
        System.out.println("ciphertext: " + ciphertext);
        System.out.println("signature: " + signature);
        boolean result = verify(plaintext.getBytes("utf-8"),Base64.decodeBase64(signature),keyPair.getPublic().getEncoded());
        plaintext = new String(decrypt(Base64.decodeBase64(ciphertext), Base64.decodeBase64(privateKey)), "utf-8");
        System.out.println("plaintext: " + plaintext);
        System.out.println("verify result: " + result);
    }

}

到了這里,關(guān)于國密算法-SM2的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Delphi SM2/SM4國密算法

    Delphi SM2/SM4國密算法

    ? ? 最近忙個醫(yī)保平臺的項目,涉及SM2/SM4的簽名,驗簽,加密,解密的業(yè)務(wù)操作過程。畢竟現(xiàn)在用Delpih的人不是很多,懂這方面的技術(shù)的人也更少,能涉及密碼算法的少之更少,網(wǎng)上也能搜到一些開源的代碼,也由于使用的人少,未加通過業(yè)務(wù)系統(tǒng)來驗證,所以存在不少Bu

    2024年02月11日
    瀏覽(19)
  • 國密算法SM2、SM3的使用

    1. SM2是非對稱加密算法 ????????它是基于橢圓曲線密碼的公鑰密碼算法標(biāo)準(zhǔn),其秘鑰長度256bit,包含數(shù)字簽名、密鑰交換和公鑰加密,用于替換RSA/DH/ECDSA/ECDH等國際算法??梢詽M足電子認(rèn)證服務(wù)系統(tǒng)等應(yīng)用需求,由國家密碼管理局于2010年12月17號發(fā)布。 2.SM3是一種密碼雜湊

    2024年02月06日
    瀏覽(20)
  • 國密算法(SM2)java語言的實現(xiàn):利用bcprov庫來實現(xiàn)SM2算法,非對稱算法

    隨著密碼技術(shù)和計算機技術(shù)的發(fā)展,目前常用的1024位RSA算法面臨嚴(yán)重的安全威脅,我們國家密碼管理部門經(jīng)過研究,決定采用SM2橢圓曲線算法替換RSA算法。 SM2是非對稱加密算法; SM2是基于橢圓曲線密碼的公鑰密碼算法標(biāo)準(zhǔn); SM2是國密算法,用于替換RSA/DH/ECDSA/ECDH等國際算法

    2024年02月03日
    瀏覽(18)
  • vue前端國密SM2, SM4 算法實現(xiàn)

    整體加密邏輯是,首先生成16位key值 用SM2 公鑰加密該key值,后端用sm2私鑰 解密出key值,然后采用sm4方法根據(jù)key值對返回值進(jìn)行加密,前端采用sm4 對后端返回結(jié)果進(jìn)行解密進(jìn)行前端展示 目前主要常用的國密算法有sm-crypto,gm-crypto,gm-crypt(SM4) 1、安裝 sm-crypto 2、包裝加解密

    2024年02月12日
    瀏覽(55)
  • 國密算法概述、及算法的集成應(yīng)用(sm2、sm3、sm4)

    國密算法概述、及算法的集成應(yīng)用(sm2、sm3、sm4)

    由于項目的需求,需要集成國密加解密,于是對國密又溫故知新了一遍。同時整理了一下國密的一些算法。 本文主要從國密相關(guān)算法的簡介、應(yīng)用系統(tǒng)的集成、工具類的封裝等方面入手,對國密進(jìn)行深入的學(xué)習(xí)。 為了保障商用密碼的安全性,國家密碼局制定了一系列密碼標(biāo)

    2024年02月14日
    瀏覽(29)
  • 國密算法SM2 密鑰對的生成

    ????????橢圓曲線密碼編碼學(xué)(ECC)是一種理論性很強的學(xué)科。后來隨著計算科學(xué)和密碼學(xué)的發(fā)展,被應(yīng)用到了公鑰密碼體制這個領(lǐng)域中。橢圓曲線密碼體制最早是由Kobiliz和Millr于185年提出的,是迄今為止安全性最高的一種算法,它的安全性是基于有限域橢圓曲線離散對數(shù)(Elipt

    2023年04月08日
    瀏覽(17)
  • Go實現(xiàn)國密算法SM2、SM3、SM4

    SM2橢圓曲線公鑰密碼算法 Public key cryptographic algorithm SM2 based on elliptic curves 遵循的SM2標(biāo)準(zhǔn)號為: GM/T 0003.1-2012、GM/T 0003.2-2012、GM/T 0003.3-2012、GM/T 0003.4-2012、GM/T 0003.5-2012、GM/T 0009-2012、GM/T 0010-2012 依賴包: github.com/tjfoc/gmsm/sm2 SM3密碼雜湊算法 - SM3 cryptographic hash algorithm 遵循的SM

    2024年02月15日
    瀏覽(23)
  • 基于hutool 封裝國密sm2,sm4 加解密算法

    基于hutool 封裝國密sm2,sm4 加解密算法 1. 加入依賴包 2. 編碼

    2024年02月13日
    瀏覽(24)
  • 國密算法SM2的優(yōu)勢、原理和應(yīng)用場景

    在數(shù)字化時代,信息安全成為關(guān)注的焦點。密碼算法是信息安全的核心,而國密算法SM2是一種國產(chǎn)密碼算法,已經(jīng)廣泛應(yīng)用于電子認(rèn)證、電子簽名、數(shù)據(jù)加密等領(lǐng)域。本文將深入介紹SM2算法的優(yōu)勢、原理和應(yīng)用場景,并探討如何利用FuncGPT(慧函數(shù))生成的SM2庫構(gòu)建安全的應(yīng)用

    2024年02月10日
    瀏覽(45)
  • 國密算法SM2實現(xiàn)基于hutool工具類

    首先引入maven 直接上代碼

    2024年02月11日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包