1. 程式人生 > >國密SM2,SM3,SM4在BC上的實現(一)

國密SM2,SM3,SM4在BC上的實現(一)

SM2,SM3,SM4演算法的實現在網路上實現有不少,但是實現只是加解密,簽名等,如果說要生成國密數字證書就麻煩了,還有最近銀行的專案上需要用ITEXT對pdf進行國密跟RSA證書數字簽名,這個用SM2單獨的簽名是不能實現的,因為ITEXT簽名是基於BC框架的,這裡就是在BC框架上新增SM2,SM4演算法,以及SM3摘要演算法,在這裡跟大家分享一下。
BC框架是基於JCA,JCE來實現的,關於JCA,JCE這裡就不詳述了。既然我們要新增這幾種演算法,我們要實現那幾步呢?
1,實現MAC
2,實現SM2,SM3,SM4演算法
3,SM2,SM4演算法的金鑰(KeyPairGenerator)
4,加解密(Cipher);
5,簽名(Signature);
6,數字證書(Certificate)
話不多說,先上幾張效果圖。
一 ,SM2加解密
結果圖

 public static String SM2_Cipher(boolean all,String enData) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        StringBuilder sb = new StringBuilder();
        byte[] sourceData = enData.getBytes();
        KeyPair keyPair = generateKeyPair(all?sb:null);
Cipher cp1 = Cipher.getInstance("SM2"); sb.append("public key = "); sb.append(bytesToHexString(keyPair.getPublic().getEncoded())); sb.append("\nprivate key = "); sb.append(bytesToHexString(keyPair.getPrivate().getEncoded())); cp1.init(1, keyPair.getPublic
()); byte[] encrypted = cp1.doFinal(sourceData); sb.append("\nEncrypted: "); sb.append(bytesToHexString(encrypted)); Cipher cp2 = Cipher.getInstance("SM2"); cp2.init(2, keyPair.getPrivate()); byte[] decrypted = cp2.doFinal(encrypted); sb.append("\nDecrypted: "); sb.append(bytesToHexString(decrypted)); sb.append("\nDecryptString: "); sb.append(new String(decrypted)); boolean equ = Arrays.equals(decrypted, sourceData); sb.append("\nEncrypt/Decrypt ").append(equ?"Passed.":"Failed."); return sb.toString(); }
    public static KeyPair generateKeyPair(StringBuilder sb) throws NoSuchAlgorithmException {
        addProvider((StringBuilder)null);
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("SM2");
        return kpg.generateKeyPair();
    }

二,SM4加解密
SM4加解密

public static String SM4_Cipher(boolean all,String enData) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        StringBuilder sb = new StringBuilder();
        byte[] sourceData = enData.getBytes();
        byte[] sorData_16 = new byte[16];
        System.arraycopy(sourceData,0,sorData_16,0,sourceData.length);
        addProvider(all?sb:null);
        KeyGenerator kg = KeyGenerator.getInstance("SM4");
        kg.init(new SecureRandom());
        SecretKey keye = kg.generateKey();
        byte[] sm4k = keye.getEncoded();
        sb.append("\nKey:");
        sb.append(bytesToHexString(sm4k));
        SecretKeySpec keyd = new SecretKeySpec(sm4k, "SM4");
        Cipher cp1 = Cipher.getInstance("SM4");
        cp1.init(1, keye);
        byte[] encrypted = cp1.doFinal(sorData_16);
        sb.append("\nEncrypted: ");
        sb.append(bytesToHexString(encrypted));
        Cipher cp2 = Cipher.getInstance("SM4");
        cp2.init(2, keyd);
        byte[] decrypted = cp2.doFinal(encrypted);
        sb.append("\nDecrypted: ");
        sb.append(bytesToHexString(decrypted));
        sb.append("\nDecryptString: ");
        sb.append(new String(decrypted));
        if(Arrays.equals(sorData_16, decrypted)) {
            sb.append("\nSM4 Ok.");
        }

        return sb.toString();
    }

三,SM2證書以及簽名
這裡寫圖片描述

“`
public static String testSM2() throws NoSuchAlgorithmException, OperatorCreationException, CertificateException, CertIOException, CertException {
StringBuilder sb = new StringBuilder();
SecureRandom apRandom = new SecureRandom();
NameBuilder nb = new NameBuilder(RDN.INSTANCE);
nb.addRDN(RDN.E, “[email protected]”);
nb.addRDN(RDN.CN, “gongkan”);
nb.addRDN(RDN.T, “CEO”);
nb.addRDN(RDN.OU, “unipad”);
nb.addRDN(RDN.O, “科技園”);
nb.addRDN(RDN.L, “深圳”);
nb.addRDN(RDN.ST, “廣東”);
BigInteger serial = (new BigInteger(31, apRandom)).abs();
Date notBefore = new Date();
Date notAfter = new Date(notBefore.getTime() + 259200000L);
KeyPair keyPair = genSM2KeyPair();
PublicKey publicKey = keyPair.getPublic();
X500Principal me = nb.toName();
X509v3CertBuilder x3b = new X509v3CertBuilder(me, serial, notBefore, notAfter, me, publicKey);
x3b.addExtension(Extension.basicConstraints, true, new BasicConstraints(false));
x3b.addExtension(Extension.keyUsage, false, new KeyUsage(184));
x3b.addExtension(Extension.extendedKeyUsage, false, new ExtendedKeyUsage(new KeyPurposeId[]{KeyPurposeId.id_kp_emailProtection, KeyPurposeId.id_kp_clientAuth}));
PrivateKey privateKey = keyPair.getPrivate();
ContentSigner signer = (new SM2SignerBuilder(“1234567812345678”)).build(privateKey);
X509CertificateHolder xchd = x3b.build(signer);
X509CertificateConverter xcvt = (new X509CertificateConverter()).setProvider(“SM”);
X509Certificate cert = xcvt.getCertificate(xchd);
CertificateFactory factory = CertificateFactory.getInstance(“X509/SM2”);
X509Certificate cer = (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(cert.getEncoded()));
sb.append(cer);
sb.append(“\nVerify Certificate “);

    try {
        cer.verify(publicKey);
        sb.append("Passed.");
    } catch (GeneralSecurityException var18) {
        var18.printStackTrace();
        sb.append("Failed.");
    }

    return sb.toString();
}

四,專案結構圖
這裡寫圖片描述

相關推薦

SM2,SM3,SM4在BC實現

SM2,SM3,SM4演算法的實現在網路上實現有不少,但是實現只是加解密,簽名等,如果說要生成國密數字證書就麻煩了,還有最近銀行的專案上需要用ITEXT對pdf進行國密跟RSA證書數字簽名,這個用SM2單獨的簽名是不能實現的,因為ITEXT簽名是基於BC框架的,

OpenSSL 1.1.1 新特性: 全面支援SM2/SM3/SM4加密演算法

OpenSSL專案最近6個月添加了許多新特性, 包括對中國SM2/SM3/SM4演算法的支援: 參考: 中國國家密碼管理局制定的商業密碼演算法標準 《GM/T 0006-2012 密碼應用標識規範》定義國密演算法OID標識 《GB/T 32907-2016

JavaWeb(實現文件傳)

submit tps pack 字符 title puts 安全 實現 servlet 通過Servlet來實現文件上傳的功能 實現用戶將文件上傳到服務裏的功能 文件上傳功能解釋: 當用戶在前端網頁點擊文件上傳後,javaWeb的servlet會獲得用戶所提交的文件並且

Android在標準linux基礎對休眠喚醒的實現【轉】

說明: 1. Based on linux 2.6.32 and android 2.2,only support SDR(mem). 2. 參考文章: 一、新增特性介紹 實際上,android仍然是利用了標準linux的休眠喚醒系統,只不過添加了一些使用

異步線程池的實現-------具體實現方法

fun format 測試 路徑 線程池。 用戶體驗 deb tar clas 本篇是這個內容的第一篇,主要是寫:遇到的問題,和自己摸索實現的方法。後面還會有一篇是總結性地寫線程池的相關內容(偏理論的)。 一、背景介紹 朋友的項目開發到一定程度之後,又遇到

多種排序算法的思路和簡單代碼的實現

insert i++ 前後端 分享 size quicksort 執行 判斷 clas 就自己簡單的理解了一些排序算法(JAVA)思路和代碼分享給大家:歡迎大家進行交流。 直接插入排序,折半插入排序,冒泡排序,快速排序 1 public class Sort { 2

Dji Mobile SDK 基礎實現

n-1 app lba ger print ttl touch事件 釋放 bsp Dji Mobile SDK 基礎實現(一) 本文簡要介紹如何通過調用DJI Mobile SDK,實現獲取和釋放無人機的控制權限、模擬遙控器按鈕控制無人機的飛行、獲取無人機的回傳視頻、獲取無

實現自定義查詢的數據庫設計及實現

bre 名稱 審批流程 work 數據庫名 需要 自定義查詢 perm 枚舉 需求 先說一下需求:實現用戶自定義的查詢,用戶可以自定義要查詢的列、自定義條件條件、自定義排序。除了查詢使用外,還可以使用於各個需要根據條件進行約束的業務,如權限; 本設計和實現,很大部分是通過數

硬件傳輸模塊系列之藍牙模塊無線

名稱 支持 藍牙連接 關閉 輸入 配對 藍牙 沒有 串口 藍牙模塊HC-06 知識點一:藍牙狀態 led指示藍牙連接狀態,閃爍表示沒有藍牙連接,常亮表藍牙已連接並打開串口(端口) 知識點二:相關參數 輸入電壓3.6v-6V,未配對時電流30mA,配對成功後為10mA。 未建

視頻流GPU解碼的實現-基本概念

bsp 視頻流 class 概念 logs log 視頻 .com 認識 這段時間在實現Gpu的視頻流解碼,遇到了很多的問題。 要想實現ffempg的GPU化,必須要要對ffempg的解碼cou流程有基本的認識才能改造 我在http://www.cnblogs.com/

MVVM模式解析和在WPF中的實現

開發 特點 還需 如果 情況下 依次 顯示 尋找 這也 MVVM模式簡介 MVVM是Model、View、ViewModel的簡寫,這種模式的引入就是使用ViewModel來降低View和Model的耦合,說是降低View和Model的耦合。也可以說是是降低界面和邏輯的耦合

hadoop雲盤client的設計與實現

white 下一跳 -c 文件 。。 edi track ++ ava 近期在hadoop雲盤client項目。在做這個項目曾經對hadoop是一點都不了解呀,在網

基於樹莓派Raspberry Pi平臺的MQ-2煙霧報警系統以及結合Zabbix監控的實現

Raspberry Pi Zabbix和嵌入式系統的結合 Python3 樹莓派和MQ-2氣體檢測 一、前期準備 達成目標:   利用Rapberry Pi 驅動MQ-2煙霧報警模塊,對信息進行采集和提取,而後Zabbix監控系統來收集和處理信息采集到的信息。

基於樹莓派Raspberry Pi平臺的智能家居實現----繼電器模塊,DHT11模塊

Raspberry 繼電器模塊 DHT11溫濕度模塊 智能家居 前言:    ??其實做這個智能家居系統我還是因為學校的畢業設計,距離上篇文章發布已經過去了20多天了,之前想著只是做一個煙霧報警,然後通過Zabbix進行報警,但是通過這20多天的設計,我發現實現報警的功能其

Android項目實戰十六:QQ空間實現—— 展示說說中的評論內容並有相應點擊事件

con toast short demo append 集合 obj parent 自帶 原文:Android項目實戰(十六):QQ空間實現(一)—— 展示說說中的評論內容並有相應點擊事件大家都玩QQ空間客戶端,對於每一個說說,我們都可以評論,那麽,對於某一條評論:

KVM虛擬化的四種簡單網絡模型介紹及實現

_for only 應該 code eth tun x86_64 信息 dock KVM中的四種簡單網絡模型,分別如下:1、隔離模型:虛擬機之間組建網絡,該模式無法與宿主機通信,無法與其他網絡通信,相當於虛擬機只是連接到一臺交換機上。2、路由模型:相當於虛擬機連接到一臺路由

Algorand算法實現

span agreement 科學 anti 文章 技術 給定 節點 雲上 判斷節點是potential leader的條件: H(Sig(r, 1, Br-1)) <= 1 / size(PKr-k) size(PKr-k)為第r-k輪中網絡中參與區塊共識的

資料結構實現:動態陣列C++版

資料結構實現(一):動態陣列(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.2 刪除操作 2.3 修改操作 2.4 查詢操作 2.5 其他操作 3. 演算法複雜度分析

iOS研發助手DoraemonKit技術實現

一、前言 一個比較成熟的App,經歷了多個版本的迭代之後,為了方便調式和測試,往往會積累一些工具來應付這些場景。最近我們組就開源了一款適用於iOS App線下開發、測試、驗收階段,內建在App中的工具集合。使用DoraemonKit,你無需連線電腦,就可以對於App的資訊進行快速的檢視。一鍵接入、使用方便,

Java關於傳統的excel匯出的實現

匯出的excel如下: 如果沒有特殊的格式啥的要求,此方法已經滿足,如果遇到標題或者定製的那種內容,就需要改造此方法!注意一下,這個方法只適合簡單的匯出使用。如果那種定製模板的匯出,在下一篇文章中我會有給出方法! 第一,控制層(controller層)的程式碼如下: /** * 列