DSA的设计与实现(共9页).doc

上传人:飞****2 文档编号:13853698 上传时间:2022-05-01 格式:DOC 页数:9 大小:223KB
返回 下载 相关 举报
DSA的设计与实现(共9页).doc_第1页
第1页 / 共9页
DSA的设计与实现(共9页).doc_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《DSA的设计与实现(共9页).doc》由会员分享,可在线阅读,更多相关《DSA的设计与实现(共9页).doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上*本科生作业*兰州理工大学计算机与通信学院2017年春季学期 信息安全 课程专 业: 物联网工程 姓 名: 学 号: 授课教师: 郭显 成 绩: DSA数字签名算法设计与实现1数字签名概述1.1数字签名描述假如现在 Alice 向 Bob 传送数字信息,为了保证信息传送的保密性、真实性、完整性和不可否认性,需要对传送的信息进行数字加密和签名,其传送过程为:1.Alice 准备好要传送的数字信息(明文);2.Alice 对数字信息进行哈希运算,得到一个信息摘要;3.Alice 用自己的私钥对信息摘要进行加密得到 Alice 的数字签名,并将其附在数字信息上;4.Alic

2、e 随机产生一个加密密钥,并用此密码对要发送的信息进行加密,形成密文;5.Alice 用 Bob 的公钥对刚才随机产生的加密密钥进行加密,将加密后的密钥连同密文一起传送给Bob;6.Bob 收到 Alice 传送来的密文和加密过的密钥,先用自己的私钥对加密的密钥进行解密,得到 Alice随机产生的加密密钥;7.Bob 然后用随机密钥对收到的密文进行解密,得到明文的数字信息,然后将随机密钥抛弃;8.Bob 用 Alice 的公钥对 Alice 的数字签名进行解密,得到信息摘要;9.Bob 用相同的哈希算法对收到的明文再进行一次哈希运算,得到一个新的信息摘要;10.Bob 将收到的信息摘要和新产生

3、的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。1.2 DSA算法DSA是建立在求离散对数之困难性以及ElGamal和Schnorr最初提出的方法之上的。数字签名保证信息传输的完整性、发送者的、防止交易中的抵赖发生。是将摘要信息用发送者的私钥加密,与一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用对收到的产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。数字签名是个加密的过程,数字签名验证是个解密的过程。1.3 DSA数字签名过程1 全局公钥组成为素数,

4、其中,且是64的倍数,即的位长在512至1024之间并且其增量为64位。为的素因子,其中,即位长为160位。,其中是满足并且的任何整数。2 用户的私钥为随机或伪随机整数且3 用户的公钥4 与用户每条信息相关的秘密值随机或伪随机整数且5 签名签名6 验证检验:(若等式成立,则签名有效)备注:为要签名的消息,为使用求得的的码,为接收到的1.4 DSA签名算法的描述从数字签名的过程中,我们可以看出,其中的三个公开参数为一组用户所共有。选择一个160位的素数;然后选择一个长度在512-1024之间且满足能整除的素数;最后选择形为的,其中是到之间的整数,使得大于。DSA的公开参数的选择与Schnorr签

5、名方案完全一样。选定这些参数以后,每个用户选择私钥并产生公钥。私钥必须是随机或伪随机选择的、位于到之间的数,由计算出公钥。由给定的计算比较简单,而由给定的确定则在计算上是不可行的,因为这就是求的以为底的模的离散对数。要进行签名,用户须计算两个量和。和是公钥、用户私钥、消息的码和附加整数的函数,其中是随机或伪随机产生的,且对每次签名是唯一的。接收端用以上公式进行验证。接收方计算值、它是公钥、发送方公钥、接收到的消息的码的函数。若与签名中的相同,则签名是有效的。2 DSA数字签名实例假设,并且取,用户A选择了作为自己的签名私钥,取试计算消息的签名并对签名验证。 计算 计算用户A的公钥 由于与互素,

6、所以19在模23下的乘法逆元存在,利用欧几里得算法计算: 用户A计算消息M的数字签名消息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.P

7、ublicKey; 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、用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。 * 如果数据和签名不匹配则认为验证失败!即传输中的数据 可以不再加密,接收方获得数据后,拿到公钥与签名 验证数据是否有效 */ public class DSA public static final String KEY_ALGORITHM = DSA; public static final String SIGNATURE_ALGORITHM = DSA; public static final String DEFAULT_SEED = $%*%()(HJG8awfjas7; /默认种子 pu

9、blic static final String PUBLIC_KEY = DSAPublicKey; public static final String PRIVATE_KEY = DSAPrivateKey; public static void main(String args) throws Exception String str = !#$!#$#&ZXVDF工大学子*()_+; byte data = str.getBytes(); Map keyMap = initKey();/ 构建密钥 PublicKey publicKey = (PublicKey) keyMap.ge

10、t(PUBLIC_KEY); PrivateKey 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(), getPublicKe

11、y(keyMap), sign); System.err.println(经验证 数据和签名匹配: + verify1); boolean verify = verify(data, getPublicKey(keyMap), sign); System.err.println(经验证 数据和签名匹配: + verify); /* * 生成密钥 * param seed 种子 * return 密钥对象 * throws Exception */ public static Map initKey(String seed) throws Exception System.out.println

12、(生成密钥); KeyPairGenerator 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.genKeyPai

13、r(); PrivateKey privateKey = 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 Exception */ public static Map initKey() throws Exception return initKey(

14、DEFAULT_SEED); /* * 取得私钥 * param keyMap * return * throws Exception */ public static String getPrivateKey(Map keyMap) throws Exception Key key = (Key) keyMap.get(PRIVATE_KEY); return encryptBASE64(key.getEncoded(); /base64加密私钥 /* * 取得公钥 * param keyMap * return * throws Exception */ public static Str

15、ing getPublicKey(Map keyMap) throws Exception Key key = (Key) keyMap.get(PUBLIC_KEY); return encryptBASE64(key.getEncoded(); /base64加密公钥 /* * 用私钥对信息进行数字签名 * param data 加密数据 * param privateKey 私钥-base64加密的 * return * throws Exception */ public static String sign(byte data, String privateKey) throws E

16、xception System.out.println(用私钥对信息进行数字签名); byte keyBytes = decryptBASE64(privateKey); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey priKey = factory.generatePrivate(keySpec);/生成私钥 /用私钥对信息进行数字签名 Signature signat

17、ure = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initSign(priKey); signature.update(data); return encryptBASE64(signature.sign(); /* * BASE64Encoder 加密 * param data 要加密的数据 * return 加密后的字符串 */ private static String encryptBASE64(byte data) BASE64Encoder encoder = new BASE64Encoder(); Strin

18、g 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; /*

19、* 校验数字签名 * param data 加密数据 * param publicKey * param sign 数字签名 * return * throws Exception */ public static boolean verify(byte data, String publicKey, String sign) throws Exception byte keyBytes = decryptBASE64(publicKey); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory ke

20、yFactory = KeyFactory.getInstance(KEY_ALGORITHM); PublicKey pubKey = keyFactory.generatePublic(keySpec); Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initVerify(pubKey); signature.update(data); return signature.verify(decryptBASE64(sign); /验证签名 4 DSA数字签名算法的安全性分析安全性基于计算有限域上的离散对数的困难性。目前认为,素数的长度在1024位是相对比较安全的。512位无法保证长时间的安全。签名与随机数有关,相同的消息可以产生不同的签名,故DSA算法是非确定性的签名算法。随机数不能重复使用。已证明若能取得两个相同的签名,则可以计算得到私钥。5 心得体会通过本次作业,我知道了DSA数字签名这一概念。学到了不少新的知识和能力。知道了如何使用数字签名,对源代码有了初步的了解。这对以后数字签名的应用起了比较积极的作用。专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁