DSA的設計實現(xiàn)分析_第1頁
DSA的設計實現(xiàn)分析_第2頁
DSA的設計實現(xiàn)分析_第3頁
DSA的設計實現(xiàn)分析_第4頁
DSA的設計實現(xiàn)分析_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、-. z.*本科生作業(yè)*理工大學計算機與通信學院2017年春季學期 信息平安 課程專 業(yè): 物聯(lián)網工程 *:*:授課教師:郭顯成績:DSA數(shù)字簽名算法設計與實現(xiàn)1數(shù)字簽名概述1.1數(shù)字簽名描述假設現(xiàn)在 Alice 向 Bob 傳送數(shù)字信息,為了保證信息傳送的性、真實性、完整性和不可否認性,需要對傳送的信息進展數(shù)字加密和簽名,其傳送過程為:1.Alice 準備好要傳送的數(shù)字信息明文;2.Alice 對數(shù)字信息進展哈希運算,得到一個信息摘要;3.Alice 用自己的私鑰對信息摘要進展加密得到 Alice 的數(shù)字簽名,并將其附在數(shù)字信息上;4.Alice 隨機產生一個加密密鑰,并用此密碼對要發(fā)送的信

2、息進展加密,形成密文;5.Alice 用 Bob 的公鑰對剛剛隨機產生的加密密鑰進展加密,將加密后的密鑰連同密文一起傳送給Bob;6.Bob 收到 Alice 傳送來的密文和加密過的密鑰,先用自己的私鑰對加密的密鑰進展解密,得到 Alice隨機產生的加密密鑰;7.Bob 然后用隨鑰對收到的密文進展解密,得到明文的數(shù)字信息,然后將隨鑰拋棄;8.Bob 用 Alice 的公鑰對 Alice 的數(shù)字簽名進展解密,得到信息摘要;9.Bob 用一樣的哈希算法對收到的明文再進展一次哈希運算,得到一個新的信息摘要;10.Bob 將收到的信息摘要和新產生的信息摘要進展比擬,如果一致,說明收到的信息沒有被修改正

3、。1.2 DSA算法DSA是建立在求離散對數(shù)之困難性以及ElGamal和Schnorr最初提出的方法之上的。數(shù)字簽名保證信息傳輸?shù)耐暾浴l(fā)送者的身份認證、防止交易中的抵賴發(fā)生。數(shù)字簽名技術是將摘要信息用發(fā)送者的私鑰加密,與原文一起傳送給接收者。接收者只有用發(fā)送者的公鑰才能解密被加密的摘要信息,然后用HASH函數(shù)對收到的原文產生一個摘要信息,與解密的摘要信息比照。如果一樣,則說明收到的信息是完整的,在傳輸過程中沒有被修改,否則說明信息被修改正,因此數(shù)字簽名能夠驗證信息的完整性。數(shù)字簽名是個加密的過程,數(shù)字簽名驗證是個解密的過程。1.3 DSA數(shù)字簽名過程全局公鑰組成為素數(shù),其中,且是64的倍數(shù)

4、,即的位長在512至1024之間并且其增量為64位。為的素因子,其中,即位長為160位。,其中是滿足并且的任何整數(shù)。用戶的私鑰為隨機或偽隨機整數(shù)且用戶的公鑰與用戶每條信息相關的秘密值隨機或偽隨機整數(shù)且簽名簽名驗證檢驗:假設等式成立,則簽名有效備注:為要簽名的消息,為使用求得的的碼,為接收到的1.4 DSA簽名算法的描述從數(shù)字簽名的過程中,我們可以看出,其中的三個公開參數(shù)為一組用戶所共有。選擇一個160位的素數(shù);然后選擇一個長度在512-1024之間且滿足能整除的素數(shù);最后選擇形為的,其中是到之間的整數(shù),使得大于。DSA的公開參數(shù)的選擇與Schnorr簽名方案完全一樣。選定這些參數(shù)以后,每個用戶

5、選擇私鑰并產生公鑰。私鑰必須是隨機或偽隨機選擇的、位于到之間的數(shù),由計算出公鑰。由給定的計算比擬簡單,而由給定確實定則在計算上是不可行的,因為這就是求的以為底的模的離散對數(shù)。要進展簽名,用戶須計算兩個量和。和是公鑰、用戶私鑰、消息的碼和附加整數(shù)的函數(shù),其中是隨機或偽隨機產生的,且對每次簽名是唯一的。接收端用以上公式進展驗證。接收方計算值、它是公鑰、發(fā)送方公鑰、接收到的消息的碼的函數(shù)。假設與簽名中的一樣,則簽名是有效的。2 DSA數(shù)字簽名實例假設,并且取,用戶A選擇了作為自己的簽名私鑰,取試計算消息的簽名并對簽名驗證。計算計算用戶A的公鑰由于與互素,所以19在模23下的乘法逆元存在,利用歐幾里得

6、算法計算:用戶A計算消息M的數(shù)字簽名消息M的簽名用戶B對簽名進展驗證,計算如下:由于,故用戶B認為是用戶A的合法簽名。3 DSA程序代碼設計package Dsa.security; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.sec

7、urity.SecureRandom; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.*509EncodedKeySpec; import java.util.HashMap; import java.util.Map; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /* * DSA是一種更高級的驗證方式,用作數(shù)字簽名。不單單只有公鑰、私鑰,還有數(shù)字簽名。

8、私鑰加密生成數(shù)字簽名,公鑰驗證數(shù)據(jù)及簽名。 * 如果數(shù)據(jù)和簽名不匹配則認為驗證失??!即傳輸中的數(shù)據(jù) 可以不再加密,接收方獲得數(shù)據(jù)后,拿到公鑰與簽名 驗證數(shù)據(jù)是否有效 */ public class DSA public static final String KEY_ALGORITHM = DSA; public static final String SIGNATURE_ALGORITHM = DSA; public static final String DEFAULT_SEED = $%*%()(HJG8awfjas7; /默認種子 public static final String

9、PUBLIC_KEY = DSAPublicKey; public static final String PRIVATE_KEY = DSAPrivateKey; public static void main(String args) throws E*ception String str = !#$!#$#&Z*VDF工大學子*()_+; byte data = str.getBytes(); Map keyMap = initKey();/ 構建密鑰 PublicKey publicKey = (PublicKey) keyMap.get(PUBLIC_KEY); PrivateKey

10、 privateKey = (PrivateKey) keyMap.get(PRIVATE_KEY); System.out.println(私鑰format: + privateKey.getFormat(); System.out.println(公鑰format: + publicKey.getFormat(); / 產生簽名 String sign = sign(data, getPrivateKey(keyMap); / 驗證簽名 boolean verify1 = verify(aaa.getBytes(), getPublicKey(keyMap), sign); System.

11、err.println(經歷證 數(shù)據(jù)和簽名匹配: + verify1); boolean verify = verify(data, getPublicKey(keyMap), sign); System.err.println(經歷證 數(shù)據(jù)和簽名匹配: + verify); /* * 生成密鑰 * param seed 種子 * return 密鑰對象 * throws E*ception */ public static Map initKey(String seed) throws E*ception System.out.println(生成密鑰); KeyPairGenerator

12、keygen = KeyPairGenerator.getInstance(KEY_ALGORITHM); SecureRandom secureRandom = new SecureRandom(); secureRandom.setSeed(seed.getBytes(); /Modulus size must range from 512 to 1024 and be a multiple of 64 keygen.initialize(640, secureRandom); KeyPair keys = keygen.genKeyPair(); PrivateKey privateKe

13、y = keys.getPrivate(); PublicKey publicKey = keys.getPublic(); Map map = new HashMap(2); map.put(PUBLIC_KEY, publicKey); map.put(PRIVATE_KEY, privateKey); return map; /* * 生成默認密鑰 * return 密鑰對象 * throws E*ception */ public static Map initKey() throws E*ception return initKey(DEFAULT_SEED); /* * 取得私鑰

14、* param keyMap * return * throws E*ception */ public static String getPrivateKey(Map keyMap) throws E*ception Key key = (Key) keyMap.get(PRIVATE_KEY); return encryptBASE64(key.getEncoded(); /base64加密私鑰 /* * 取得公鑰 * param keyMap * return * throws E*ception */ public static String getPublicKey(Map keyM

15、ap) throws E*ception Key key = (Key) keyMap.get(PUBLIC_KEY); return encryptBASE64(key.getEncoded(); /base64加密公鑰 /* * 用私鑰對信息進展數(shù)字簽名 * param data 加密數(shù)據(jù) * param privateKey 私鑰-base64加密的 * return * throws E*ception */ public static String sign(byte data, String privateKey) throws E*ception System.out.print

16、ln(用私鑰對信息進展數(shù)字簽名); byte keyBytes = decryptBASE64(privateKey); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey priKey = factory.generatePrivate(keySpec);/生成私鑰 /用私鑰對信息進展數(shù)字簽名 Signature signature = Signature.getInstan

17、ce(SIGNATURE_ALGORITHM); signature.initSign(priKey); signature.update(data); return encryptBASE64(signature.sign(); /* * BASE64Encoder 加密 * param data 要加密的數(shù)據(jù) * return 加密后的字符串 */ private static String encryptBASE64(byte data) BASE64Encoder encoder = new BASE64Encoder(); String encode = encoder.encode

18、(data); return encode; /* * BASE64Decoder 解密 * param data 要解密的字符串 * return 解密后的byte * throws E*ception */ private static byte decryptBASE64(String data) throws E*ception BASE64Decoder decoder = new BASE64Decoder(); byte buffer = decoder.decodeBuffer(data); return buffer; /* * 校驗數(shù)字簽名 * param data 加密數(shù)據(jù) * param publicKey * param sign 數(shù)字簽名 * return * throws E*ception */ public static boolean verify(byte data, String publicKey, String sign) throws E*ception byte keyBytes = d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論