欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

eclipse實現(xiàn)ECDSA數(shù)字簽名

 更新時間:2020年06月23日 16:47:10   作者:禿頭選拔賽形象大使  
這篇文章主要為大家詳細介紹了eclipse實現(xiàn)ECDSA數(shù)字簽名,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

ECDSA數(shù)字簽名,供大家參考,具體內(nèi)容如下

一,實驗目的

通過使用密碼學庫實現(xiàn)基于橢圓曲線的簽名方案,能夠編寫簡單的實驗代碼進行正確的ECDSA簽名和驗證。

二、 實驗要求

1、熟悉ECDSA算法基本原理;
2、了解如何使用Java簡單實現(xiàn)用ECDSA算法;
3、掌握用ECDSA簽名算法的簡單代碼實驗。

三、開發(fā)環(huán)境

JDK1.8,Java相關(guān)開發(fā)環(huán)境(本實驗采用Windows+eclipse作為實驗環(huán)境)要求參與實驗的同學提前安裝好jdk

四、實驗內(nèi)容

【1-1】 ECDSA簽名和驗證實驗

1.使用如下的函數(shù)進行系統(tǒng)初始化并產(chǎn)生密鑰:

public static void KeyGenerator() throws Exception {
// //初始化簽名
System.out.println("系統(tǒng)正在初始化……");
 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
 keyPairGenerator.initialize(256);
 KeyPair keyPair = keyPairGenerator.generateKeyPair();
 ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic();
 ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate();
//把公鑰和私鑰分別存儲在publicKey.key和privateKey.key文件里
String path = new File("").getCanonicalPath();
out(path + "\\privateKey.key", Base64.getEncoder().encodeToString(ecPrivateKey.getEncoded()));
out(path + "\\publicKey.key",Base64.getEncoder().encodeToString(ecPublicKey.getEncoded()));
 System.out.println("你的公鑰存放在:" + path + "\\publicKey.key");
 System.out.println("你的私鑰存放在:" + path + "\\privateKey.key");
 System.out.println("系統(tǒng)已完成初始化。");
 }

其中,使用public static KeyPairGenerator getInstance(String algorithm);產(chǎn)生密鑰對生成器,這個方法需要一個字符串作為參數(shù),用于說明使用哪個密鑰算法,例如本算法中使用橢圓曲線“EC”。
使用public void initialize(int keysize);初始化密鑰對。參數(shù)keysize用于說明生成的key的長度,理論上說是這個參數(shù)的值越大,加密的數(shù)據(jù)就越難以被破解,但在加密時也越消耗計算資源。
使用keyPairGenerator.generateKeyPair().getPublic();動態(tài)生成公鑰
使用keyPairGenerator.generateKeyPair().getPrivate();動態(tài)生成私鑰

2.使用如下的函數(shù)執(zhí)行簽名過程:

//執(zhí)行簽名過程

public static byte[] SignGen(byte[] ECprivateKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance("EC");
 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ECprivateKey);
 PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
 Signature signature = Signature.getInstance("SHA1withECDSA");
 signature.initSign(privateKey);
 signature.update(data.getBytes());
byte[] result = signature.sign();
return result;
}

其中,使用KeyFactory.getInstance(String algorithm);實例化一個密鑰工廠,這個方法需要一個字符串作為參數(shù),用于說明使用哪個密鑰算法,例如本算法中使用橢圓曲線“EC”。
使用new PKCS8EncodedKeySpec(ECprivateKey) ;和keyFactory.generatePrivate(pkcs8En
codedKeySpec);將私鑰從字節(jié)數(shù)組轉(zhuǎn)換為私鑰
使用Signature.getInstance(String algorithm);指定簽名使用的哈希函數(shù),本算法中使用SHA1
使用signature.initSign(privateKey);和signature.update(data.getBytes());為消息簽名

3.使用如下的函數(shù)實現(xiàn)驗證簽名:

//驗證簽名過程

public static booleanVerifiGen(byte[] ECpublicKey, byte[] result) throws Exception {
 KeyFactory keyFactory = KeyFactory.getInstance("EC");
 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ECpublicKey);
 PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
 Signature signature = Signature.getInstance("SHA1withECDSA");
 signature.initVerify(publicKey);
 signature.update(data.getBytes());
boolean bool = signature.verify(result);
return bool;
}

其中,使用KeyFactory.getInstance(String algorithm);實例化一個密鑰工廠,這個方法需要一個字符串作為參數(shù),用于說明使用哪個密鑰算法,例如本算法中使用橢圓曲線“EC”。
使用new PKCS8EncodedKeySpec(ECpublicKey) ;和keyFactory.generatePrivate(pkcs8En
codedKeySpec);將公鑰從字節(jié)數(shù)組轉(zhuǎn)換為公鑰
使用Signature.getInstance(String algorithm);指定簽名使用的哈希函數(shù),本算法中使用SHA1
使用signature.initVerify(publicKey); 和signature.update(data.getBytes());驗證簽名是否正確
使用signature.verify(result);返回驗證結(jié)果,true orfalse

【1-2】參考代碼

package ECDSA.demo;

import java.io.*;
import java.security.*;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Scanner;

public class ECDSA {
private static String data ;
//初始化系統(tǒng)
public static void KeyGenerator() throws Exception {
 System.out.println("系統(tǒng)正在初始化……");
 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
 keyPairGenerator.initialize(256);
 KeyPair keyPair = keyPairGenerator.generateKeyPair();
 ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic();
 ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate();
//把公鑰和私鑰分別存儲在publicKey.key和privateKey.key文件里
String path = new File("").getCanonicalPath();
out(path + "\\privateKey.key", Base64.getEncoder().encodeToString(ecPrivateKey.getEncoded()));
out(path + "\\publicKey.key",Base64.getEncoder().encodeToString(ecPublicKey.getEncoded()));
 System.out.println("你的公鑰存放在:" + path + "\\publicKey.key");
 System.out.println("你的私鑰存放在:" + path + "\\privateKey.key");
 System.out.println("系統(tǒng)已完成初始化。");
 }
//執(zhí)行簽名過程
public static byte[] SignGen(byte[] ECprivateKey) throws Exception {
 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ECprivateKey);
 KeyFactory keyFactory = KeyFactory.getInstance("EC");
 PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
 Signature signature = Signature.getInstance("SHA1withECDSA");
 signature.initSign(privateKey);
 signature.update(data.getBytes());
byte[] result = signature.sign();
return result;
 }
//驗證簽名過程
public static boolean VerifiGen(byte[] ECpublicKey, byte[] result) throws Exception {
 X509EncodedKeySpec x509encodedkeyspec= new X509EncodedKeySpec(ECpublicKey);
 KeyFactory keyFactory = KeyFactory.getInstance("EC");
 PublicKey publicKey = keyFactory.generatePublic(x509encodedkeyspec);
 Signature signature = Signature.getInstance("SHA1withECDSA");
 signature.initVerify(publicKey);
 signature.update(data.getBytes());
boolean bool = signature.verify(result);
return bool;
 }
//封裝輸出流
public static void out(String path, String val) {
try {
  val = Base64.getEncoder().encodeToString(val.getBytes("utf-8"));
  FileWriter fw = new FileWriter(path);
  BufferedWriter bw = new BufferedWriter(fw);
  PrintWriter outs = new PrintWriter(bw);
  outs.println(val);
  outs.flush();
  outs.close();
 } catch (Exception ex) {
  ex.printStackTrace();
 }
 }

// 從文件中讀取公私鑰
public static byte[] read(String path){
byte[] sk = null;
try {
  File f=new File(path);
  FileReader fr=new FileReader(f);
  BufferedReader br=new BufferedReader(fr);
  String line=null;
  StringBuffer sb=new StringBuffer();
while((line=br.readLine())!=null) {
byte[] b = Base64.getDecoder().decode(line);
  String[] key = new String(b,"utf-8").split(",,,,,,");
  System.out.println("\n");
if(key.length == 1){
   sk = Base64.getDecoder().decode(key[0]);
  }
else{
throw new Exception("文件錯誤");
  }
  }
  br.close();
return sk;
 }
catch(Exception ex)
 {
  ex.printStackTrace();
 }
return sk;
 }

public static void main(String[] args) {
// TODO Auto-generated method stub
try {
KeyGenerator();

  Scanner sc = new Scanner(System.in);
  String str = "";
//輸入要簽名的信息
sc.useDelimiter("\n");
  System.out.print("\n"+"請輸入輸入要簽名的信息按回車結(jié)束:");
if (sc.hasNext()) {
data = sc.next();
  }
//獲取私鑰地址
sc.useDelimiter("\n");
  System.out.print("\n"+"請輸入私鑰地址按回車結(jié)束:");
if (sc.hasNext()) {
  str = sc.next();
  }
//獲取私鑰
byte[] ECprivateKey = read(str.substring(0,str.length()-1));
//產(chǎn)生簽名
byte[] result = SignGen(ECprivateKey);
  System.out.println("數(shù)字簽名的結(jié)果:"+ Base64.getEncoder().encodeToString(result));
new Scanner(System.in);
  sc.useDelimiter("\n");
  System.out.print("\n"+"請輸入公鑰地址按回車結(jié)束:");
if (sc.hasNext()) {
  str = sc.next();
  }
//獲取公鑰
byte[] ECpublicKey = read(str.substring(0,str.length()-1));
boolean bool = VerifiGen(ECpublicKey, result);
if(bool == true){
  System.out.println("數(shù)字簽名的驗證結(jié)果:通過驗證!");
  }
else {
  System.out.println("請檢查地址輸入地址是否有誤或文件內(nèi)容是否被篡改!");
  }
 } catch (Exception ex) {
  System.out.println("請檢查地址輸入地址是否有誤或文件內(nèi)容是否被篡改!");
//  System.out.println(ex);
}
 }
}

【1-3】擴展參考資料

1、 ESCDA算法原理:

ECDSA是ECC與DSA的結(jié)合,簽名算法為ECC。

簽名過程如下:

1、選擇一條橢圓曲線Ep(a,b),和基點G;
2、選擇私有密鑰k(k<n,n為G的階),利用基點G計算公開密鑰K=kG;
3、產(chǎn)生一個隨機整數(shù)r(r<n),計算點R=rG;
4、將原數(shù)據(jù)和點R的坐標值x,y作為參數(shù),計算SHA1做為hash,即Hash=SHA1(原數(shù)據(jù),x,y);
5、計算s≡r - Hash * k (mod n)
6、r和s做為簽名值,如果r和s其中一個為0,重新從第3步開始執(zhí)行

驗證過程如下:

1、接受方在收到消息(m)和簽名值(r,s)后,進行以下運算
2、計算:sG+H(m)P=(x1,y1), r1≡ x1 mod p。
3、驗證等式:r1 ≡ r mod p。
4、如果等式成立,接受簽名,否則簽名無效。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中的gateway自定義過濾器詳解

    Java中的gateway自定義過濾器詳解

    這篇文章主要介紹了Java中的gateway自定義過濾器詳解,過濾器是指gateway在路由過程中(A地址路由到B地址)生效進行過濾操作的,所有首先你得先配一個地址路由,本文提供了部分實現(xiàn)代碼,需要的朋友可以參考下
    2023-11-11
  • Java內(nèi)存溢出場景及解決方案

    Java內(nèi)存溢出場景及解決方案

    內(nèi)存溢出是Java應用開發(fā)中常見的問題,但通過合理的代碼優(yōu)化、內(nèi)存管理以及JVM參數(shù)調(diào)整,我們可以有效地避免和解決這類問題,這篇文章主要介紹了Java內(nèi)存溢出場景及解決辦法,需要的朋友可以參考下
    2024-04-04
  • java中如何截取字符串最后一位

    java中如何截取字符串最后一位

    這篇文章主要介紹了java中如何截取字符串最后一位的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 淺談java中Map的用法

    淺談java中Map的用法

    Map簡介:將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多只能映射到一個值。此接口取代 Dictionary 類,后者完全是一個抽象類,而不是一個接口。
    2015-09-09
  • java驗證用戶是否已經(jīng)登錄 java實現(xiàn)自動登錄

    java驗證用戶是否已經(jīng)登錄 java實現(xiàn)自動登錄

    這篇文章主要介紹了java驗證用戶是否已經(jīng)登錄,java實現(xiàn)自動登錄,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Spring注解驅(qū)動之AOP功能測試

    Spring注解驅(qū)動之AOP功能測試

    這篇文章主要介紹了Spring注解驅(qū)動之AOP功能測試,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 淺談Java虛擬機對內(nèi)部鎖的四種優(yōu)化方式

    淺談Java虛擬機對內(nèi)部鎖的四種優(yōu)化方式

    這篇文章主要介紹了淺談Java虛擬機對內(nèi)部鎖的四種優(yōu)化方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 詳解Java Proxy動態(tài)代理機制

    詳解Java Proxy動態(tài)代理機制

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java動態(tài)代理機制展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 基于java構(gòu)造方法Vector遍歷元素源碼分析

    基于java構(gòu)造方法Vector遍歷元素源碼分析

    本篇文章是關(guān)于ava構(gòu)造方法Vector源碼分析系列文章,本文主要介紹了Vector遍歷元素的源碼分析,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • java 使用線程監(jiān)控文件目錄變化的實現(xiàn)方法

    java 使用線程監(jiān)控文件目錄變化的實現(xiàn)方法

    這篇文章主要介紹了java 使用線程監(jiān)控文件目錄變化的實現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10

最新評論