國密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加解密
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層)的程式碼如下: /** * 列