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

下載本文檔

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

文檔簡介

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

2、并用此密碼對要發(fā)送的信息進(jìn)行加密,形成密文;5.Alice 用 Bob 的公鑰對剛才隨機(jī)產(chǎn)生的加密密鑰進(jìn)行加密,將加密后的密鑰連同密文一起傳送給Bob;6.Bob 收到 Alice 傳送來的密文和加密過的密鑰,先用自己的私鑰對加密的密鑰進(jìn)行解密,得到 Alice隨機(jī)產(chǎn)生的加密密鑰;7.Bob 然后用隨機(jī)密鑰對收到的密文進(jìn)行解密,得到明文的數(shù)字信息,然后將隨機(jī)密鑰拋棄;8.Bob 用 Alice 的公鑰對 Alice 的數(shù)字簽名進(jìn)行解密,得到信息摘要;9.Bob 用相同的哈希算法對收到的明文再進(jìn)行一次哈希運(yùn)算,得到一個(gè)新的信息摘要;10.Bob 將收到的信息摘要和新產(chǎn)生的信息摘要進(jìn)行比較,如果一

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

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

5、chnorr簽名方案完全一樣。選定這些參數(shù)以后,每個(gè)用戶選擇私鑰并產(chǎn)生公鑰。私鑰必須是隨機(jī)或偽隨機(jī)選擇的、位于到之間的數(shù),由計(jì)算出公鑰。由給定的計(jì)算比較簡單,而由給定的確定則在計(jì)算上是不可行的,因?yàn)檫@就是求的以為底的模的離散對數(shù)。要進(jìn)行簽名,用戶須計(jì)算兩個(gè)量和。和是公鑰、用戶私鑰、消息的碼和附加整數(shù)的函數(shù),其中是隨機(jī)或偽隨機(jī)產(chǎn)生的,且對每次簽名是唯一的。接收端用以上公式進(jìn)行驗(yàn)證。接收方計(jì)算值、它是公鑰、發(fā)送方公鑰、接收到的消息的碼的函數(shù)。若與簽名中的相同,則簽名是有效的。2 DSA數(shù)字簽名實(shí)例假設(shè),并且取,用戶A選擇了作為自己的簽名私鑰,取試計(jì)算消息的簽名并對簽名驗(yàn)證。1 計(jì)算2 計(jì)算用戶A的

6、公鑰3 由于與互素,所以19在模23下的乘法逆元存在,利用歐幾里得算法計(jì)算:4 用戶A計(jì)算消息M的數(shù)字簽名消息M的簽名5 用戶B對簽名進(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 jav

7、a.security.PublicKey; import java.security.SecureRandom; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /* * DSA

8、是一種更高級的驗(yàn)證方式,用作數(shù)字簽名。不單單只有公鑰、私鑰,還有數(shù)字簽名。私鑰加密生成數(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_S

9、EED = "$%*%()(HJG8awfjas7" /默認(rèn)種子 public static final String PUBLIC_KEY = "DSAPublicKey" public static final String PRIVATE_KEY = "DSAPrivateKey" public static void main(String args) throws Exception String str = "!#$!#$#&ZXVDF工大學(xué)子*()_+" byte data = str.get

10、Bytes(); Map<String, Object> keyMap = initKey();/ 構(gòu)建密鑰 PublicKey publicKey = (PublicKey) keyMap.get(PUBLIC_KEY); PrivateKey privateKey = (PrivateKey) keyMap.get(PRIVATE_KEY); System.out.println("私鑰format:" + privateKey.getFormat(); System.out.println("公鑰format:" + publicKey

11、.getFormat(); / 產(chǎn)生簽名 String sign = sign(data, getPrivateKey(keyMap); / 驗(yàn)證簽名 boolean verify1 = verify("aaa".getBytes(), getPublicKey(keyMap), sign); System.err.println("經(jīng)驗(yàn)證 數(shù)據(jù)和簽名匹配:" + verify1); boolean verify = verify(data, getPublicKey(keyMap), sign); System.err.println("經(jīng)驗(yàn)

12、證 數(shù)據(jù)和簽名匹配:" + verify); /* * 生成密鑰 * param seed 種子 * return 密鑰對象 * throws Exception */ public static Map<String, Object> initKey(String seed) throws Exception System.out.println("生成密鑰"); KeyPairGenerator keygen = KeyPairGenerator.getInstance(KEY_ALGORITHM); SecureRandom secureRand

13、om = 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 privateKey = keys.getPrivate(); PublicKey publicKey = keys.getPublic(); Map<String,

14、 Object> map = new HashMap<String, Object>(2); map.put(PUBLIC_KEY, publicKey); map.put(PRIVATE_KEY, privateKey); return map; /* * 生成默認(rèn)密鑰 * return 密鑰對象 * throws Exception */ public static Map<String, Object> initKey() throws Exception return initKey(DEFAULT_SEED); /* * 取得私鑰 * param key

15、Map * return * throws Exception */ public static String getPrivateKey(Map<String, Object> keyMap) throws Exception Key key = (Key) keyMap.get(PRIVATE_KEY); return encryptBASE64(key.getEncoded(); /base64加密私鑰 /* * 取得公鑰 * param keyMap * return * throws Exception */ public static String getPublicK

16、ey(Map<String, Object> keyMap) throws Exception Key key = (Key) keyMap.get(PUBLIC_KEY); return encryptBASE64(key.getEncoded(); /base64加密公鑰 /* * 用私鑰對信息進(jìn)行數(shù)字簽名 * param data 加密數(shù)據(jù) * param privateKey 私鑰-base64加密的 * return * throws Exception */ public static String sign(byte data, String privateKey)

17、throws Exception System.out.println("用私鑰對信息進(jìn)行數(shù)字簽名"); byte keyBytes = decryptBASE64(privateKey); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey priKey = factory.generatePrivate(keySpec);/生成私鑰 /用私鑰對信息進(jìn)行數(shù)

18、字簽名 Signature signature = Signature.getInstance(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 BA

19、SE64Encoder(); String encode = encoder.encode(data); return encode; /* * BASE64Decoder 解密 * param data 要解密的字符串 * return 解密后的byte * throws Exception */ private static byte decryptBASE64(String data) throws Exception 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 Exception */ public static boolean verify(byte data, String publicKey, String sign) throws Exception byte

溫馨提示

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

最新文檔

評論

0/150

提交評論