當前位置:
首頁 > 知識 > Java加密解密——數字簽名

Java加密解密——數字簽名

數字簽名:

實際上數字簽名又稱作基於PKI的電子簽名, PKI的核心機構是電子認證服務提供者,即通稱的認證機構CA,PKI簽名的核心元素是由CA簽發的數字證書,數字證書就如同日常生活中的身份證一樣,用來標識網上實體的身份,CA就是對網上實體進行認證的第三方機構.數字證書就是CA機構對網上實體進行認證而產生的電子證書,它是數據簽名的基礎技術保障.CA機構對電子證書的有效性,有效期等提供查詢服務.數字證書所包含公鑰用來對使用對應的私鑰加密的數據信息進行驗證.

數字簽名實現的具體原理是:

1、 將報文按雙方約定的HASH演算法計算得到一個固定位數的報文摘要。在數學上保證,只要改動報文中任何一位,重新計算出的報文摘要值就會與原先的值不相符。這樣就保證了報文的不可更改性。(詳見參考資料的"公鑰密碼技術原理"章節)

2、 將該報文摘要值用發送者的私人密鑰加密,然後連同原報文和數字證書(包含公鑰)一起發送給接收者而產生的報文即稱數字簽名。

3、接收方收到數字簽名後,用同樣的HASH演算法對報文計算摘要值,然後與用發送者的公開密鑰進行解密解開的報文摘要值相比較,如相等則說明報文確實來自所稱的發送者。

4、同時通過證書頒發機構CA確認證書的有效性即可確認發送的真實身份。

數字簽名模型分析:

  1. 甲方構造密鑰對(公鑰+私鑰),公布公鑰給乙方。

  2. 甲方使用私鑰對數據進行簽名,然後將」簽名+數據」發送給乙方

  3. 乙方使用公鑰+數據簽名驗證數據

示例:

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.Signature;

import java.security.interfaces.RSAPrivateKey;

import java.security.interfaces.RSAPublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

/**

* 數字簽名

*/

public class TestSign {

/**數字簽名,密鑰演算法**/

public static final String KEY_ALGORITHM="RSA";

/**

* RSA密鑰長度

* 默認1024位

* 密鑰長度必須是64的倍數

* 範圍在512至65536之間

* **/

private static final int KEY_SIZE = 512;

/**數字簽名,簽名/驗證演算法 **/

public static final String SIGNATURE_ALGORITHM = "SHA1withRSA";

public static void main(String[] args) {

try {

//生成密鑰對

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);

keyPairGen.initialize(KEY_SIZE);

KeyPair keyPair = keyPairGen.generateKeyPair();

RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();

RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

String str = "ceshi";

byte[] signature = sign(str.getBytes(),rsaPrivateKey.getEncoded());

boolean result = verify(str.getBytes(), signature,rsaPublicKey.getEncoded());

System.out.println("驗簽結果為:"+result);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* @param data 待簽名數據

* @param key 簽名私鑰

* @return 簽名

* @throws Exception

*/

public static byte[] sign(byte[] data,byte[] key) throws Exception{

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

Signature signture = Signature.getInstance(SIGNATURE_ALGORITHM);

signture.initSign(privateKey);

signture.update(data);

return signture.sign();

}

/**

* @param data 待驗簽數據

* @param sign 簽名數據

* @param publicKey 公鑰

* @return 返回驗簽結果,成功true,失敗false

* @throws Exception

*/

public static boolean verify(byte[] data,byte[] sign,byte[] publicKey) throws Exception{

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKey);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);

Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);

signature.initVerify(pubKey);

signature.update(data);

return signature.verify(sign);

}

}

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 笑月天狼 的精彩文章:

Java加密與解密——非對稱加密
oracle插入時如何自動生成主鍵
TCP/IP協議
Java垃圾回收

TAG:笑月天狼 |

您可能感興趣

7 個數字,解構 Louis Vuitton 打造經典手袋的秘密!
新版Notepad plus plus移除程序代碼數字簽名
Megan Lee:解密新加坡,數字貨幣合法合規化之路
G?知 7 個數字,解構 Louis Vuitton 打造經典手袋的秘密!
遊戲數字媒體公司Momentous宣布接受數字貨幣
G?知? 7 個數字,解構 Louis Vuitton 打造經典手袋的秘密!
教你把iPhone密碼改成四位數字
幣易Coinyee讓加密數字貨幣投資變得更簡單
Excel中羅馬數字和阿拉伯數字轉換函數roman和arabic
Facebook新動作 重啟數字加密貨幣廣告
立即停止使用6位數字iPhone密碼
繼谷歌和Facebook之後 Twitter也將封殺數字加密貨幣廣告
一線 | Facebook重新開放數字加密貨幣廣告
Instagram 或將隱藏「點贊」數字
Python基礎-變數、字元串、數字
Factom申請專利:支持使用多個數字簽名驗證區塊鏈上文件
CoinSquare帶你全面了解加拿大數字貨幣交易所
超級智能本iReader Smart發布掌閱讓書寫邁入數字化
尼爾森收購SuperData Research以更好地跟蹤數字遊戲
無字母數字Webshell之提高篇