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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

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

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

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

6、算法計(jì)算:用戶A計(jì)算消息M的數(shù)字簽名消息M的簽名用戶B對(duì)簽名進(jìn)展驗(yàn)證,計(jì)算如下:由于,故用戶B認(rèn)為是用戶A的合法簽名。3 DSA程序代碼設(shè)計(jì)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是一種更高級(jí)的驗(yàn)證方式,用作數(shù)字簽名。不單單只有公鑰、私鑰,還有數(shù)字簽名。

8、私鑰加密生成數(shù)字簽名,公鑰驗(yàn)證數(shù)據(jù)及簽名。 * 如果數(shù)據(jù)和簽名不匹配則認(rèn)為驗(yàn)證失敗!即傳輸中的數(shù)據(jù) 可以不再加密,接收方獲得數(shù)據(jù)后,拿到公鑰與簽名 驗(yàn)證數(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; /默認(rèn)種子 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工大學(xué)子*()_+; byte data = str.getBytes(); Map keyMap = initKey();/ 構(gòu)建密鑰 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(); / 產(chǎn)生簽名 String sign = sign(data, getPrivateKey(keyMap); / 驗(yàn)證簽名 boolean verify1 = verify(aaa.getBytes(), getPublicKey(keyMap), sign); System.

11、err.println(經(jīng)歷證 數(shù)據(jù)和簽名匹配: + verify1); boolean verify = verify(data, getPublicKey(keyMap), sign); System.err.println(經(jīng)歷證 數(shù)據(jù)和簽名匹配: + verify); /* * 生成密鑰 * param seed 種子 * return 密鑰對(duì)象 * 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; /* * 生成默認(rèn)密鑰 * return 密鑰對(duì)象 * 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加密公鑰 /* * 用私鑰對(duì)信息進(jìn)展數(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(用私鑰對(duì)信息進(jìn)展數(shù)字簽名); byte keyBytes = decryptBASE64(privateKey); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey priKey = factory.generatePrivate(keySpec);/生成私鑰 /用私鑰對(duì)信息進(jìn)展數(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; /* * 校驗(yàn)數(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論