① 求ECDSA的java代碼
【方案1】
package ECDSA;
import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;
import java.security.*;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class Ecdsa {
private static String src = "hello berber" ;
public static void main(String []args){
jdkECDSA();
}
public static void jdkECDSA(){
// 1.初始化密鑰
try{
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
keyPairGenerator.initialize(256);
KeyPair keyPair = keyPairGenerator.generateKeyPair() ;
ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic() ;
ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate() ;
// 執行簽名
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("EC") ;
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec) ;
Signature signature = Signature.getInstance("SHA1withECDSA");
signature.initSign(privateKey);
signature.update(src.getBytes());
byte []arr = signature.sign();
System.out.println("jdk ecdsa sign :"+ HexBin.encode(arr));
// 驗證簽名
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("EC");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
signature = Signature.getInstance("SHA1withECDSA");
signature.initVerify(publicKey);
signature.update(src.getBytes());
boolean bool = signature.verify(arr);
System.out.println("jdk ecdsa verify:"+bool);
}catch(Exception e){
}
}
}
Java數字簽名——ECDSA演算法
【方案2】
public class MyTest {
/**
* @param args
*/
public static void main(String[] args) {
new MyTest().getSign();
}
void getSign() {
// Get the instance of the Key Generator with "EC" algorithm
try {
KeyPairGenerator g = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec kpgparams = new ECGenParameterSpec("secp256r1");
g.initialize(kpgparams);
KeyPair pair = g.generateKeyPair();
// Instance of signature class with SHA256withECDSA algorithm
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA");
ecdsaSign.initSign(pair.getPrivate());
System.out.println("Private Keys is::" + pair.getPrivate());
System.out.println("Public Keys is::" + pair.getPublic());
String msg = "text ecdsa with sha256";//getSHA256(msg)
ecdsaSign.update((msg + pair.getPrivate().toString())
.getBytes("UTF-8"));
byte[] signature = ecdsaSign.sign();
System.out.println("Signature is::"
+ new BigInteger(1, signature).toString(16));
// Validation
ecdsaSign.initVerify(pair.getPublic());
ecdsaSign.update(signature);
if (ecdsaSign.verify(signature))
System.out.println("valid");
else
System.out.println("invalid!!!!");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}}
java – 使用secp256r1曲線和SHA256演算法生
怎麼驗證生成的Ecdsa簽名是正確的呢,可以看下這篇文章:RSA,ECC,Ecdsa,國密SM2的簽名,驗簽,加密
② RSA數字簽名是什麼
在數字簽名技術出現之前,曾經出現過一種「數字化簽名」技術,簡單地說就是在手寫板上簽名,然後將圖像傳輸到電子文檔中,這種「數字化簽名」可以被剪切, 然後粘貼到任意文檔上,這樣非法復制變得非常容易,所以這種簽名的方式是不安全的。數字簽名技術與數字化簽名技術是兩種截然不同的安全技術,數字簽名與用 戶的姓名和手寫簽名形式毫無關系,它實際使用了信息發送者的私有密鑰變換所需傳輸的信息。對於不同的文檔信息,發送者的數字簽名並不相同。沒有私有密鑰, 任何人都無法完成非法復制。從這個意義上來說,「數字簽名」是通過一個單向函數對要傳送的報文進行處理得到的,用以認證報文來源並核實報文是否發生變化的 一個字母數字串。JAVA異常機制指南
原理
該技術在具體工作時,首先發送方對信息施以數學變換,所得的信息與原信息惟一對應;在接收方進行逆變換,得到原始信息。只要數學變換方法優良,變換後的信息在傳輸中就具有很強的安全性,很難被破譯、篡改。這一個過程稱為加密,對應的反變換過程稱為解密。
現在有兩類不同的加密技術,一類是對稱加密,雙方具有共享的密鑰,只有在雙方都知道密鑰的情況下才能使用,通常應用於孤立的環境之中,比如在使用自動取款 機(ATM)時,用戶需要輸入用戶識別號碼(PIN),銀行確認這個號碼後,雙方在獲得密碼的基礎上進行交易,如果用戶數目過多,超過了可以管理的范圍 時,這種機制並不可靠。
另一類是非對稱加密,也稱為公開密鑰加密,密鑰是由公開密鑰和私有密鑰組成的密鑰對,用私有密鑰進行加密,利用公開密鑰可以進行解密,但是由於公開密鑰無 法推算出私有密鑰,所以公開的密鑰並不會損害私有密鑰的安全,公開密鑰無須保密,可以公開傳播,而私有密鑰必須保密,丟失時需要報告鑒定中心及資料庫。
演算法
數字簽名的演算法很多, 應用最為廣泛的三種是: Hash簽名、DSS簽名和RSA簽名。
1. Hash簽名
Hash簽名不屬於強計算密集型演算法,應用較廣泛。它可以降低伺服器資源的消耗,減輕中央伺服器的負荷。Hash的主要局限是接收方必須持有用戶密鑰的副本以檢驗簽名, 因為雙方都知道生成簽名的密鑰,較容易攻破,存在偽造簽名的可能。
2. DSS和RSA簽名
DSS和RSA採用了公鑰演算法,不存在Hash的局限性。RSA是最流行的一種加密標准,許多產品的內核中都有RSA的軟體和類庫。早在Web飛速發展之 前,RSA數據安全公司就負責數字簽名軟體與Macintosh操作系統的集成,在Apple的協作軟體PowerTalk上還增加了簽名拖放功能,用戶 只要把需要加密的數據拖到相應的圖標上,就完成了電子形式的數字簽名。與DSS不同,RSA既可以用來加密數據,也可以用於身份認證。和Hash簽名相 比,在公鑰系統中,由於生成簽名的密鑰只存儲於用戶的計算機中,安全系數大一些。
功能
數字簽名可以解決否認、偽造、篡改及冒充等問題。具體要求:發送者事後不能否認發送的報文簽名、接收者能夠核實發送者發送的報文簽名、接收者不能偽造發送 者的報文簽名、接收者不能對發送者的報文進行部分篡改、網路中的某一用戶不能冒充另一用戶作為發送者或接收者。數字簽名的應用范圍十分廣泛,在保障電子數 據交換(EDI)的安全性上是一個突破性的進展,凡是需要對用戶的身份進行判斷的情況都可以使用數字簽名,比如加密信件、商務信函、定貨購買系統、遠程金 融交易、自動模式處理等等。
缺憾
數字簽名的引入過程中不可避免地會帶來一些新問題,需要進一步加以解決,數字簽名需要相關法律條文的支持。
1. 需要立法機構對數字簽名技術有足夠的重視,並且在立法上加快腳步,迅速制定有關法律,以充分實現數字簽名具有的特殊鑒別作用,有力地推動電子商務以及其他網上事務的發展。
2. 如果發送方的信息已經進行了數字簽名,那麼接收方就一定要有數字簽名軟體,這就要求軟體具有很高的普及性。
3. 假設某人發送信息後脫離了某個組織,被取消了原有數字簽名的許可權,以往發送的數字簽名在鑒定時只能在取消確認列表中找到原有確認信息,這樣就需要鑒定中心結合時間信息進行鑒定。
4. 基礎設施(鑒定中心、在線存取資料庫等)的費用,是採用公共資金還是在使用期內向用戶收費?如果在使用期內收費,會不會影響到這項技術的全面推廣?
實施
實現數字簽名有很多方法,目前採用較多的是非對稱加密技術和對稱加密技術。雖然這兩種技術實施步驟不盡相同,但大體的工作程序是一樣的。 用戶首先可以下載或者購買數字簽名軟體,然後安裝在個人電腦上。在產生密鑰對後,軟體自動向外界傳送公開密鑰。由於公共密鑰的存儲需要,所以需要建立一個 鑒定中心(CA)完成個人信息及其密鑰的確定工作。鑒定中心是一個政府參與管理的第三方成員,以便保證信息的安全和集中管理。用戶在獲取公開密鑰時,首先 向鑒定中心請求數字確認,鑒定中心確認用戶身份後,發出數字確認,同時鑒定中心向資料庫發送確認信息。然後用戶使用私有密鑰對所傳信息簽名,保證信息的完 整性、真實性,也使發送方無法否認信息的發送,之後發向接收方;接收方接收到信息後,使用公開密鑰確認數字簽名,進入資料庫檢查用戶確認信息的狀況和可信 度;最後資料庫向接收方返回用戶確認狀態信息。不過,在使用這種技術時,簽名者必須注意保護好私有密鑰,因為它是公開密鑰體系安全的重要基礎。如果密鑰丟 失,應該立即報告鑒定中心取消認證,將其列入確認取消列表之中。其次,鑒定中心必須能夠迅速確認用戶的身份及其密鑰的關系。一旦接收到用戶請求,鑒定中心 要立即認證信息的安全性並返回信息。
③ 國密演算法
國密即國家密碼局認定的國產密碼演算法。主要有SM1,SM2,SM3,SM4。密鑰長度和分組長度均為128位。
SM1 為對稱加密。其加密強度與AES相當。該演算法不公開,調用該演算法時,需要通過加密晶元的介面進行調用。
SM2為非對稱加密,基於ECC。該演算法已公開。由於該演算法基於ECC,故其簽名速度與秘鑰生成速度都快於RSA。ECC 256位(SM2採用的就是ECC 256位的一種)安全強度比RSA 2048位高,但運算速度快於RSA。
國家密碼管理局公布的公鑰演算法,其加密強度為256位
SM3 消息摘要。可以用MD5作為對比理解。該演算法已公開。校驗結果為256位。
SM4 無線區域網標準的分組數據演算法。對稱加密,密鑰長度和分組長度均為128位。
由於SM1、SM4加解密的分組大小為128bit,故對消息進行加解密時,若消息長度過長,需要進行分組,要消息長度不足,則要進行填充。
分組密碼演算法(DES和SM4)、將明文數據按固定長度進行分組,然後在同一密鑰控制下逐組進行加密,
公鑰密碼演算法(RSA和SM2)、公開加密演算法本身和公開公鑰,保存私鑰
摘要演算法(SM3 md5) 這個都比較熟悉,用於數字簽名,消息認證,數據完整性,但是sm3安全度比md5高
總得來說國密演算法的安全度比較高,2010年12月推出,也是國家安全戰略,現在銀行都要要求國際演算法改造,要把國際演算法都給去掉
C 語言實現
https://github.com/guan/GmSSL/
Go 語言
https://github.com/tjfoc/gmsm
https://github.com/ZZMarquis/gm
Java 語言
https://github.com/PopezLotado/SM2Java
Go語言實現,調用 gmsm
④ java中使用國密SM4演算法詳解
在探討了加密演算法的基本類型及其區別後,我們將通過Java實現SM4演算法,這是一種用於無線區域網分組數據的標准加密技術,其特點是採用對稱加密,密鑰和分組長度均為128位。
在實際項目中,我們通常可以選擇直接使用第三方工具包如hutool來簡化操作。以下是使用步驟:
然而,自定義密鑰時可能會遇到問題,如某小夥伴遇到的報錯。需要注意的是,128位的密鑰需要轉換為16位元組進行處理。在此過程中,務必確保密鑰的正確轉換。
以上內容由作者向彪-fisco bcos在CSDN博客中詳細闡述,鏈接為:https://blog.csdn.net/ws327443752/article/details/109197127,對於實際項目中的應用,推薦參考這篇文章的指導。