1. 程式人生 > >用DSA演算法實現數字簽名

用DSA演算法實現數字簽名

下面是一個在JAVA語言中,使用DSA簽名演算法來進行進行數字簽名的一個示例。 DSA(Digital Signature Algorithm)是Schnorr和ElGamal簽名演算法的變種,被美國NIST作為數字簽名標準(DigitalSignature Standard)。 參照JDK文件中關於Signature類的敘述:NIST標準的DSA演算法應該本身就包含了雜湊演算法SHA-1加密演算法DSA Signature.getInstance("DSA")等同於Signature.getInstance("SHA1withDSA"); 如果使用DSA作為數字簽名的加密演算法,則只能使用
SHA1作為訊息雜湊(即訊息摘要)演算法。 如果使用RSA為數字簽名加密演算法,對訊息摘要演算法則會有多種選擇,因此,可以將簽名演算法指定為 MD2withRSAMD5withRSA 或SHA1withRSA 關於使用RSA實現數字簽名請參照《 DSA_Demo.java檔案 import java.security.InvalidKeyException; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.SignatureException; public class DSA_Demo { DSA_Demo() { init(); } private void init() { prepare(); doSenderWork(); doReceiverWork(); } //share by sender and receiver Signature sign; //belong to sender,it visible to sender and receiver
PublicKey publicKey; //belong to sender,it is only visible to sender PrivateKey privateKey; private void prepare() { KeyPairGenerator keyGen=null; try { //例項化一個DSA演算法的公鑰/私鑰對生成器 keyGen=KeyPairGenerator.getInstance("DSA"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } int keysize=1024; //設定公鑰/私鑰對的長度 keyGen.initialize(keysize); //生成一個RSA演算法的公鑰/私鑰 KeyPair keyPair=keyGen.generateKeyPair(); privateKey=keyPair.getPrivate(); publicKey=keyPair.getPublic(); try { //例項化一個DSA簽名演算法的Signature. sign=Signature.getInstance("DSA"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } } void doSenderWork() { String words="This is robin.How are you?This a DSA Signature Demo"; Message msg=new Message(words.getBytes()); try { //設定加密雜湊碼用的私鑰 sign.initSign(privateKey);catch (InvalidKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { //設定雜湊演算法的輸入 sign.update(msg.getBody());catch (SignatureException e) { // TODO Auto-generated catch block e.printStackTrace(); } byte data[]=null; try { //進行雜湊,對產生的雜湊碼進行加密並返回 data=sign.sign();catch (SignatureException e) { // TODO Auto-generated catch block e.printStackTrace(); } //把加密後雜湊(即簽名)加到訊息中 msg.setSignature(data); //傳送訊息 sendMsg(msg); } Message sendingMsg; void sendMsg(Message sendMsg) { sendingMsg=sendMsg; System.out.println("sending Message Signed by DSA"); } void doReceiverWork() { //收到訊息 Message msg=getReceivedMsg(); try { //設定解密雜湊碼用的公鑰。 sign.initVerify(publicKey);catch (InvalidKeyException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { //設定雜湊演算法的輸入 sign.update(msg.getBody());catch (SignatureException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { /*進行雜湊計算,比較計算所得雜湊碼是否和解密的雜湊碼是否一致。  * 一致則驗證成功,否則失敗 */ if(sign.verify(msg.getSignature())) { System.out.println("數字簽名驗證成功!"); } else { System.out.println("數字簽名驗證失敗!"); } } catch (SignatureException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Message getReceivedMsg() { System.out.println("receiving Message"); return sendingMsg; } } class Message { private byte [] body; private byte [] signature; Message(byte data[]) { body=data; } byte[] getBody() { return body; } byte[] getSignature() { return signature; } void setSignature(byte data[]) { signature=data; } }

相關推薦

DSA演算法實現數字簽名

下面是一個在JAVA語言中,使用DSA簽名演算法來進行進行數字簽名的一個示例。 DSA(Digital Signature Algorithm)是Schnorr和ElGamal簽名演算法的變種,

OCX控件打包成CAB並實現數字簽名過程

program sid tdi mst .com this signature 表格 script OCX打包CAB並簽名過程 一、打包cab 制作cab文件時需要將所有的相關文件都包含進去,可以通過Depends(VC自帶的)檢查需要的文件。使用inf文件將

java/訊息摘要演算法&數字簽名

一。訊息摘要演算法 常用摘要演算法:   以下 (HEX)內容:bc指Bouncy Castle  |  cc指:Apache commons Codec 1。訊息摘要演算法MD5及MD族(MD2,MD4)  訊息摘要演算法應用: MD

資料完整性演算法_ElGamal數字簽名方案

ElGama數字簽名方案是五種簽名方案中的一種,我們知道ElGama加密方案是使用使用者的公鑰進行加密,使用使用者的私鑰進行解密。但ElGama數字簽名方案是使用私鑰進行加密,公鑰進行解密。   ElGama方案遵循數字簽名的一般的三個步驟,即 產生公鑰/私鑰對

通過RSA實現數字簽名

一 用RSA生成簽名 在RSA中,被簽名的訊息、金鑰以及最終生成的簽名都是以數字形式表示的。在對文字進行簽名時,需要事先對文字編碼成數字。用RSA生成簽名的過程可用下列公式來表述: 這裡所使用的D和N就是簽名者的私鑰。簽名就是對訊息的D次方求mod N的結果,也就是說

資料結構--C語言--圖的深度優先遍歷,廣度優先遍歷,拓撲排序,prime演算法實現最小生成樹,迪傑斯特拉演算法實現關鍵路徑和關鍵活動的求解,最短路徑

實驗七  圖的深度優先遍歷(選做,驗證性實驗,4學時) 實驗目的 熟悉圖的陣列表示法和鄰接表儲存結構,掌握構造有向圖、無向圖的演算法 ,在掌握以上知識的基礎上,熟悉圖的深度優先遍歷演算法,並實現。 實驗內容 (1)圖的陣列表示法定義及

java 實現數字簽名自動補零

方法一: for 迴圈判斷位數; 補零個數是,進行總長度減去數字長度。 方法二: 善用String.format 方法 如: public static void main(String[

5.5分水嶺演算法實現影象分割

<img src="https://img-blog.csdn.net/20160409220852681?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0

原生js實現數字自相加

</pre><pre name="code" class="javascript"> <div> <input type="text" id="num"

一列數字的規則如下;1,1,2,3,5,8,13,21,34........ 求第30位數字是多少,遞規和非遞迴兩種方法演算法實現

斐波納契數列(Fibonacci Sequence),又稱黃金分割數列。在數學上,斐波納契數列以如下被以遞迴的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,現在我從演算法的角度,利用遞迴和非

SM2演算法第二十五篇:ECDSA數字簽名演算法原理與實現

---------------------------------------------轉載原因------------------------------------------------- 這邊部落格中有關 EC_KEY_set_private_key和EC_KEY_set_public_key

數字簽名加密演算法(RSA、DSA、ECDSA)

RSA的例子: import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.securi

數字簽名--DSA實現

其實DSA的實現和RSA差不多,只是改了改介面名稱。 注意,我的程式碼只是用jdk實現,並沒有用BC,想學的人可以自己深究一下。 程式碼: package Signature; import java.security.KeyFactory; import java.se

代碼實現簽名

五步 tac ini tin factor develop [] height ike 我們使用Android Studio 運行或測試我們的app 它使用一個默認的debug.keystore進行簽名。 這個默認簽名(keystore)是不需要密碼的,它的默認位置在 $

RSA加密解密及數字簽名Java實現

cto 包括 sign object misc 數據 factory 了解 對稱密鑰 RSA公鑰加密算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在

Java代碼實現文件添加數字簽名、驗證數字簽名

exist h+ exception rda charset stdout sha256 程序 trac Linux下實現加簽、驗簽 1.使用OpenSSL 生成公鑰和密鑰; #用 OpenSSL, Linux 上自帶,常用命令如下: #生成 RSA 私鑰(傳統格式的)

多媒體技術 || 中位切割演算法實現影象減色

實現環境:python 處理一張紅蘋果圖: 先描述一下中位切割演算法吧: 將圖片內的所有畫素加入到同一個區域 對於所有的區域做以下的事: 計算此區域內所有畫素的 RGB 三元素最大值與最小值的差。 選出相差最大的那個顏色(R 或 G 或 B)

區塊鏈教程Fabric1.0原始碼分析ECDSA橢圓曲線數字簽名演算法

  兄弟連區塊鏈教程Fabric1.0原始碼分析ECDSA橢圓曲線數字簽名演算法,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、迴歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鏈真正的技術之上。 Fabric 1.0原始碼筆記 之 ECDS

go編寫區塊鏈系列之5--地址與數字簽名

0 介紹 在上一篇文章我們實現了交易。你被灌輸了這樣一種觀念:在比特幣中沒有賬戶,個人資訊資料不需要也不會被儲存。但是仍然需要一些東西去證明你是一筆交易的輸出的所有者。這是比特幣需要地址的原因。之前我們使用字串去代表使用者地址,現在我們需要引入地址了。 1 地址密碼學 比特幣地址

一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少, 遞迴演算法實現。//斐波那契數列

1 public class MainClass 2 { 3 public static void Main() 4 { 5 Console.WriteLine(Foo(30)); 6 } 7 public static int Foo(int i) 8 {