您好,欢迎访问三七文档
********************本科生作业********************兰州理工大学计算机与通信学院2017年春季学期信息安全课程专业:物联网工程姓名:学号:授课教师:郭显成绩:DSA数字签名算法设计与实现1数字签名概述1.1数字签名描述假如现在Alice向Bob传送数字信息,为了保证信息传送的保密性、真实性、完整性和不可否认性,需要对传送的信息进行数字加密和签名,其传送过程为:1.Alice准备好要传送的数字信息(明文);2.Alice对数字信息进行哈希运算,得到一个信息摘要;3.Alice用自己的私钥对信息摘要进行加密得到Alice的数字签名,并将其附在数字信息上;4.Alice随机产生一个加密密钥,并用此密码对要发送的信息进行加密,形成密文;5.Alice用Bob的公钥对刚才随机产生的加密密钥进行加密,将加密后的密钥连同密文一起传送给Bob;6.Bob收到Alice传送来的密文和加密过的密钥,先用自己的私钥对加密的密钥进行解密,得到Alice随机产生的加密密钥;7.Bob然后用随机密钥对收到的密文进行解密,得到明文的数字信息,然后将随机密钥抛弃;8.Bob用Alice的公钥对Alice的数字签名进行解密,得到信息摘要;9.Bob用相同的哈希算法对收到的明文再进行一次哈希运算,得到一个新的信息摘要;10.Bob将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。1.2DSA算法DSA是建立在求离散对数之困难性以及ElGamal和Schnorr最初提出的方法之上的。数字签名保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。数字签名是个加密的过程,数字签名验证是个解密的过程。1.3DSA数字签名过程1.全局公钥组成p为素数,其中LLp221,1024512L且L是64的倍数,即L的位长在512至1024之间并且其增量为64位。q为)1(p的素因子,其中16015922q,即位长为160位。phgqpmod/)1(,其中h是满足)1(1ph并且1mod/)1(phqp的任何整数。2.用户的私钥x为随机或伪随机整数且qx03.用户的公钥pgyxmod4.与用户每条信息相关的秘密值k随机或伪随机整数且qk05.签名qpgrkmod)mod(qxrMHksmod)])(([1签名),(sr6.验证qswmod)(1'qwMHumod])(['1qwrumod)('2qpygvuumod]mod)[(21检验:'rv(若等式成立,则签名有效)备注:M为要签名的消息,)(MH为使用1SHA求得的M的Hash码,'M,'r,'s为接收到的srM,,1.4DSA签名算法的描述从数字签名的过程中,我们可以看出,其中的三个公开参数为一组用户所共有。选择一个160位的素数q;然后选择一个长度在512-1024之间且满足q能整除)1(p的素数p;最后选择形为phqpmod/)1(的g,其中h是1到1p之间的整数,使得g大于。DSA的公开参数的选择与Schnorr签名方案完全一样。选定这些参数以后,每个用户选择私钥并产生公钥。私钥x必须是随机或伪随机选择的、位于1到1q之间的数,由pgyxmod计算出公钥。由给定的x计算y比较简单,而由给定的y确定x则在计算上是不可行的,因为这就是求y的以g为底的模p的离散对数。要进行签名,用户须计算两个量r和s。r和s是公钥),,(gqp、用户私钥)(x、消息的Hash码)(MH和附加整数k的函数,其中k是随机或伪随机产生的,且k对每次签名是唯一的。接收端用以上公式进行验证。接收方计算值v、它是公钥),,(gqp、发送方公钥、接收到的消息的Hash码的函数。若v与签名中的r相同,则签名是有效的。2DSA数字签名实例假设47,23pq,并且取17h,用户A选择了10x作为自己的签名私钥,取,15)(,19MHk试计算消息M的签名并对签名验证。①计算747mod17mod23/)147(/)1(phgqp②计算用户A的公钥3247mod7mod10pgyx③由于19k与23q互素,所以19在模23下的乘法逆元存在,利用欧几里得算法计算:1723mod19mod11qk④用户A计算消息M的数字签名1223mod)47mod7(mod)mod(17qpgrk1823mod)121015(17mod))((1qxrMHks消息M的签名)18,12(),(sr⑤用户B对签名进行验证,计算如下:;923mod18mod11qsw;2023mod915mod)(1qwMHu;1623mod912mod2qrwu1223mod)47mod327(mod)]mod[(162021qpygvuu由于rv,故用户B认为是用户A的合法签名。3DSA程序代码设计packageDsa.security;importjava.security.Key;importjava.security.KeyFactory;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.PrivateKey;importjava.security.PublicKey;importjava.security.SecureRandom;importjava.security.Signature;importjava.security.spec.PKCS8EncodedKeySpec;importjava.security.spec.X509EncodedKeySpec;importjava.util.HashMap;importjava.util.Map;importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;/***DSA是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。*如果数据和签名不匹配则认为验证失败!即传输中的数据可以不再加密,接收方获得数据后,拿到公钥与签名验证数据是否有效*/publicclassDSA{publicstaticfinalStringKEY_ALGORITHM=DSA;publicstaticfinalStringSIGNATURE_ALGORITHM=DSA;publicstaticfinalStringDEFAULT_SEED=$%^*%^()(HJG8awfjas7;//默认种子publicstaticfinalStringPUBLIC_KEY=DSAPublicKey;publicstaticfinalStringPRIVATE_KEY=DSAPrivateKey;publicstaticvoidmain(String[]args)throwsException{Stringstr=!@#$!#^$#&ZXVDF工大学子*()_+;byte[]data=str.getBytes();MapString,ObjectkeyMap=initKey();//构建密钥PublicKeypublicKey=(PublicKey)keyMap.get(PUBLIC_KEY);PrivateKeyprivateKey=(PrivateKey)keyMap.get(PRIVATE_KEY);System.out.println(私钥format:+privateKey.getFormat());System.out.println(公钥format:+publicKey.getFormat());//产生签名Stringsign=sign(data,getPrivateKey(keyMap));//验证签名booleanverify1=verify(aaa.getBytes(),getPublicKey(keyMap),sign);System.err.println(经验证数据和签名匹配:+verify1);booleanverify=verify(data,getPublicKey(keyMap),sign);System.err.println(经验证数据和签名匹配:+verify);}/***生成密钥*@paramseed种子*@return密钥对象*@throwsException*/publicstaticMapString,ObjectinitKey(Stringseed)throwsException{System.out.println(生成密钥);KeyPairGeneratorkeygen=KeyPairGenerator.getInstance(KEY_ALGORITHM);SecureRandomsecureRandom=newSecureRandom();secureRandom.setSeed(seed.getBytes());//Modulussizemustrangefrom512to1024andbeamultipleof64keygen.initialize(640,secureRandom);KeyPairkeys=keygen.genKeyPair();PrivateKeyprivateKey=keys.getPrivate();PublicKeypublicKey=keys.getPublic();MapString,Objectmap=newHashMapString,Object(2);map.put(PUBLIC_KEY,publicKey);map.put(PRIVATE_KEY,privateKey);returnmap;}/***生成默认密钥*@return密钥对象*@throwsException*/publicstaticMapString,ObjectinitKey()throwsException{returninitKey(DEFAULT_SEED);}/***取得私钥*@paramkeyMap*@return*@throwsException*/publicstaticStringgetPrivateKey(MapString,ObjectkeyMap)throwsException{Keykey=(Key)keyMap.get(PRIVATE_KEY);returnencryptBASE64(key.getEncoded());//base64加密私钥}/***取得公钥*@paramkeyMap*@return*@throwsException*/publicstaticStringgetPublicKey(MapString,ObjectkeyMap)throwsException{Keykey=(Key)keyMap.get(PUBLIC_KEY);returnencryptBASE64(key.getEncoded());//base64加密公钥}/***用私钥对信息进行数字签名*@paramdata加密数据*@paramprivateKey私钥-base64加密的*@return*@throwsException*/publicstaticStringsign(byte[]data,StringprivateKey)throwsException{System.o
本文标题:DSA的设计与实现
链接地址:https://www.777doc.com/doc-5623837 .html