最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA加密算法數(shù)字簽名實(shí)現(xiàn)原理詳解

 更新時(shí)間:2020年10月20日 10:57:08   作者:cuisuqiang  
這篇文章主要介紹了JAVA加密算法數(shù)字簽名實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

所謂數(shù)字簽名就是信息發(fā)送者用其私鑰對從所傳報(bào)文中提取出的特征數(shù)據(jù)(或稱數(shù)字指紋)進(jìn)行 RSA 算法操作,以保證發(fā)信人無法抵賴曾發(fā)過該信息(即不可抵賴性),同時(shí)也確保信息報(bào)文在經(jīng)簽名后末被篡改(即完整性)。當(dāng)信息接收者收到報(bào)文后,就可以用發(fā)送者的公鑰對數(shù)字簽名進(jìn)行驗(yàn)證。

在數(shù)字簽名中有重要作用的數(shù)字指紋是通過一類特殊的散列函數(shù)(HASH 函數(shù))生成的,對這些 HASH 函數(shù)的特殊要求是:

1:接受的輸入報(bào)文數(shù)據(jù)沒有長度限制;

2:對任何輸入報(bào)文數(shù)據(jù)生成固定長度的摘要(數(shù)字指紋)輸出

3:從報(bào)文能方便地算出摘要;

4:難以對指定的摘要生成一個報(bào)文,而由該報(bào)文反推算出該指定的摘要;

5:兩個不同的報(bào)文難以生成相同的摘要

代表:DSA

代碼如下

package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
public class DSA {
	public static void main(String[] args) {
		try {
			DSA my = new DSA();
			my.run();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void run() {
		// 數(shù)字簽名生成密鑰
		// 第一步生成密鑰對,如果已經(jīng)生成過 , 本過程就可以跳過
		// 對用戶來講 myprikey.dat 要保存在本地,而 mypubkey.dat 給發(fā)布給其它用戶
		if ((new java.io.File("myprikey.dat")).exists() == false) {
			if (generatekey() == false) {
				System.out.println("生成密鑰對敗");
				return;
			}
		}
		// 第二步 , 此用戶
		// 從文件中讀入私鑰 , 對一個字符串進(jìn)行簽名后保存在一個文件 (myinfo.dat) 中
		// 并且再把 myinfo.dat 發(fā)送出去,為了方便數(shù)字簽名也放進(jìn)了 myifno.dat 文件中 , 當(dāng)然也可分別發(fā)送
		try {
			ObjectInputStream in = new ObjectInputStream(new FileInputStream("myprikey.dat"));
			PrivateKey myprikey = (PrivateKey) in.readObject();
			in.close();
			String myinfo = "這是我的信息"; // 要簽名的信息
			// 用私鑰對信息生成數(shù)字簽名
			Signature signet = Signature.getInstance("DSA");
			signet.initSign(myprikey);
			signet.update(myinfo.getBytes());
			byte[] signed = signet.sign(); // 對信息的數(shù)字簽名
			System.out.println("signed( 簽名內(nèi)容 )=" + byte2hex(signed));
			// 把信息和數(shù)字簽名保存在一個文件中
			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("myinfo.dat"));
			out.writeObject(myinfo);
			out.writeObject(signed);
			out.close();
			System.out.println("簽名并生成文件成功");
		} catch (java.lang.Exception e) {
			e.printStackTrace();
			System.out.println("簽名并生成文件失敗");
		}
		// 第三步 獲得信息檢查
		// 其他人通過公共方式得到此戶的公鑰和文件
		// 其他人用此戶的公鑰 , 對文件進(jìn)行檢查 , 如果成功說明是此用戶發(fā)布的信息 .
		try {
			ObjectInputStream in = new ObjectInputStream(new FileInputStream("mypubkey.dat"));
			PublicKey pubkey = (PublicKey) in.readObject();
			in.close();
			System.out.println(pubkey.getFormat());
			in = new ObjectInputStream(new FileInputStream("myinfo.dat"));
			String info = (String) in.readObject();
			byte[] signed = (byte[]) in.readObject();
			in.close();
			Signature signetcheck = Signature.getInstance("DSA");
			signetcheck.initVerify(pubkey);
			signetcheck.update(info.getBytes());
			if (signetcheck.verify(signed)) {
				System.out.println("info=" + info);
				System.out.println("簽名正常");
			} else
				System.out.println("非簽名正常");
		} catch (java.lang.Exception e) {
			e.printStackTrace();
		}
		;
	}
	// 生成一對文件 myprikey.dat 和 mypubkey.dat 私鑰和公鑰
	// 公鑰要用戶發(fā)送 ( 文件 , 網(wǎng)絡(luò)等方法 ) 給其它用戶 , 私鑰保存在本地
	public boolean generatekey() {
		try {
			KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");
			keygen.initialize(512);
			KeyPair keys = keygen.genKeyPair();
			PublicKey pubkey = keys.getPublic();
			PrivateKey prikey = keys.getPrivate();
			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("myprikey.dat"));
			out.writeObject(prikey);
			out.close();
			System.out.println("寫入對象 prikeys ok");
			out = new ObjectOutputStream(new FileOutputStream("mypubkey.dat"));
			out.writeObject(pubkey);
			out.close();
			System.out.println("寫入對象 pubkeys ok");
			System.out.println("生成密鑰對成功");
			return true;
		} catch (java.lang.Exception e) {
			e.printStackTrace();
			System.out.println("生成密鑰對失敗");
			return false;
		}
	}
	public String byte2hex(byte[] b) {
		String hs = "";
		String stmp = "";
		for (int n = 0; n < b.length; n++) {
			stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
			if (stmp.length() == 1)
				hs = hs + "0" + stmp;
			else
				hs = hs + stmp;
			if (n < b.length - 1)
				hs = hs + ":";
		}
		return hs.toUpperCase();
	}
}

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

相關(guān)文章

  • Tomcat報(bào)錯:HTTP Status 500 (Wrapper cannot find servlet class)解決辦法

    Tomcat報(bào)錯:HTTP Status 500 (Wrapper cannot find servlet class)

    這篇文章主要介紹了Tomcat報(bào)錯:HTTP Status 500 (Wrapper cannot find servlet class)解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • springboot整合activity自動部署及部署文件命名流程

    springboot整合activity自動部署及部署文件命名流程

    這篇文章主要介紹了springboot整合activity自動部署及部署文件命名流程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot @NotBlank錯誤的解決方案

    SpringBoot @NotBlank錯誤的解決方案

    這篇文章主要介紹了SpringBoot @NotBlank錯誤的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot操作Mongodb的實(shí)現(xiàn)示例

    SpringBoot操作Mongodb的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot操作Mongodb的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 解析Java中的Field類和Method類

    解析Java中的Field類和Method類

    這篇文章主要介紹了Java中的Field類和Method類,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-12-12
  • SpringBoot集成SpirePDF實(shí)現(xiàn)文本替換功能

    SpringBoot集成SpirePDF實(shí)現(xiàn)文本替換功能

    SpirePDF是一個用于.NET平臺的高級PDF文檔處理庫,它提供了一套完整的API,允許開發(fā)者創(chuàng)建、編輯、轉(zhuǎn)換、合并、分割和解析PDF文件本文給大家介紹了SpringBoot集成SpirePDF實(shí)現(xiàn)文本替換功能,需要的朋友可以參考下
    2024-09-09
  • Java 使用json-lib處理JSON詳解及實(shí)例代碼

    Java 使用json-lib處理JSON詳解及實(shí)例代碼

    這篇文章主要介紹了Java 使用json-lib處理JSON詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 一文講解如何優(yōu)雅的調(diào)試jar包

    一文講解如何優(yōu)雅的調(diào)試jar包

    在現(xiàn)實(shí)開發(fā)過程中,現(xiàn)場環(huán)境永遠(yuǎn)比開發(fā)環(huán)境復(fù)雜,下面這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅的調(diào)試jar包的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • JavaWeb開發(fā)之Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基礎(chǔ)框架

    JavaWeb開發(fā)之Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JC

    這篇文章主要介紹了JavaWeb開發(fā)之Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基礎(chǔ)框架的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Java設(shè)計(jì)模式之橋接模式

    Java設(shè)計(jì)模式之橋接模式

    這篇文章介紹了Java設(shè)計(jì)模式之橋接模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09

最新評論

北流市| 泾阳县| 广宗县| 天等县| 桑植县| 南宫市| 循化| 池州市| 唐河县| 宜宾市| 韶关市| 汉沽区| 石屏县| 广东省| 泰宁县| 吕梁市| 锦屏县| 平邑县| 巴彦淖尔市| 寿光市| 白水县| 竹溪县| 宁化县| 德钦县| 盖州市| 肇庆市| 洛宁县| 辽中县| 枣阳市| 汉中市| 通道| 泸西县| 南涧| 遵义县| 礼泉县| 临泽县| 靖远县| 安徽省| 修水县| 彰武县| 侯马市|