DSA數字簽名算法

1、DSA概述

爲了確保數據傳輸的安全性,不得不採起一系列的安全技術,如加密技術、數字簽名、身份認證、密鑰管理、防火牆、安全協議等。其中數字簽名就是實現網上交易安全的核心技術之一,它能夠保證信息傳輸的保密性、數據交換的完整性、發送信息的不能否認性、交易者身份的肯定性等。html

有關數據類型和數據轉換處理請參考上海尚學堂如下兩篇文章《數據類型及其轉換》、《ajax+json數據處理

DSA(Digital Signature Algorithm,數字簽名算法,用做數字簽名標準的一部分),它是另外一種公開密鑰算法,它不能用做加密,只用做數字簽名。DSA使用公開密鑰,爲接受者驗證數據的完整性和數據發送者的身份。它也可用於由第三方去肯定簽名和所籤數據的真實性。DSA算法的安全性基於解離散對數的困難性,這類簽字標準具備較大的兼容性和適用性,成爲網絡安全體系的基本構件之一。

數字簽名在ISO7498—2標準中定義爲:「附加在數據單元上的一些數據,或是對數據單元所做的密碼變換,這種數據和變換容許數據單元的接收者用以確認數據單元來源和數據單元的完整性,並保護數據,防止被人(例如接收者)進行僞造」。 數字簽名是經過一個單向函數對要傳送的信息進行處理獲得的用以認證信息來源並覈實信息在傳送過程當中是否發生變化的一個字母數字串。數字簽名提供了對信息來源的肯定並能檢測信息是否被篡改。


html5

2、DSA原理




處理過程: (採用雙重加密)
(1)使用SHA編碼將發送文件加密產生128bit的數字摘要;
(2)發送方用本身的專用密鑰對摘要再加密,造成數字簽名;
(3)將原文和加密的摘要同時傳給對方;
(4)接受方用發送方的公共密鑰對摘要解密,同時對收到的文件用SHA編碼加密產生同一摘要;
(5)將解密後的摘要和收到的文件在接受方從新加密產生的摘要相互對比,若是二者一致,則說明在傳送過程當中信息沒有破壞和篡改。不然,則說明信息已經失去安全性和保密性。

java

3、JDK中對於DSA的實現

一、KeyPairGenerator

KeyPairGenerator 類用於生成公鑰和私鑰對。密鑰對生成器是使用 getInstance 工廠方法(返回一個給定類的實例的靜態方法)構造的。
特定算法的密鑰對生成器能夠建立可以與此算法一塊兒使用的公鑰/私鑰對。它還能夠將特定於算法的參數與每一個生成的密鑰關聯。
有兩種生成密鑰對的方式:與算法無關的方式和特定於算法的方式。


下面咱們將按照指定RSA算法去生成祕鑰KeyPairGenerator.getInstance("RSA");
git

二、DSAPublicKey

DSA 公用密鑰的接口
ajax

三、DSAPublicKey

DSA 專用密鑰的接口
算法

四、PKCS8EncodedKeySpec

PKCS8EncodedKeySpec類繼承EncodedKeySpec類,以編碼格式來表示私鑰。
PKCS8EncodedKeySpec類使用PKCS#8標準做爲密鑰規範管理的編碼格式

json

五、Signature

Signature 類用來爲應用程序提供數字簽名算法功能。數字簽名用於確保數字數據的驗證和完整性。

在全部算法當中,數字簽名能夠是 NIST 標準的 DSA,它使用 DSA 和 SHA-1。能夠將使用 SHA-1 消息摘要算法的 DSA 算法指定爲 SHA1withDSA。

安全

4、實現

其中DSA的實現步驟相似於咱們以前學習的RSA數字簽名算法
實現步驟
第一步:初始化化祕鑰組,生成DSA算法的公鑰和私鑰
第二步:執行私鑰簽名, 使用私鑰簽名,生成私鑰簽名
第三步:執行公鑰簽名,生成公鑰簽名
第四步:使用公鑰驗證私鑰簽名
備註:所謂的公鑰與私鑰匙成對出現。 聽從的原則就是「私鑰簽名、公鑰驗證」。

示例代碼以下:
網絡


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.DSAPrivateKey;
import java.security.interfaces.DSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.xml.bind.DatatypeConverter;

public class DSAUtil {

private static String
src
= "hello";

public static void main(String[] args) {
jdkDSA
();
}

public static void jdkDSA() {
// 1. 初始化 祕鑰
try {
KeyPairGenerator generator = KeyPairGenerator.
getInstance
("DSA");
generator.initialize(512);

KeyPair keyPair = generator.generateKeyPair();
DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();
DSAPrivateKey dsaPrivateKey = (DSAPrivateKey) keyPair.getPrivate();

// 2。 執行簽名
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());
KeyFactory factory = KeyFactory.
getInstance
("DSA");
PrivateKey privateKey = factory.generatePrivate(pkcs8EncodedKeySpec);

Signature signature = Signature.
getInstance
("SHA1withDSA");
signature.initSign(privateKey);
signature.update(
src
.getBytes());
byte[] sign = signature.sign();
System.
out
.println(DatatypeConverter.
printHexBinary
(sign));
// 驗證簽名
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded());

factory = KeyFactory.
getInstance
("DSA");
PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec);

signature = Signature.
getInstance
("SHA1withDSA");
signature.initVerify(publicKey);
signature.update(
src
.getBytes());

boolean verify = signature.verify(sign);

System.
out
.println(verify);

} catch (Exception e) {
e.printStackTrace();
}

}

}


5、DSA算法特色

一、DSA是以RSA爲基礎造成的
二、java6提供了DSA的實現,可是java6只提供了SHA1withDSA的實現
三、bouncycastle擴展提供了其餘的DSA實現方式
四、遵循「私鑰簽名,公鑰驗證」的原則
函數

相關文章
相關標籤/搜索