DSA的设计与实现_第1页
DSA的设计与实现_第2页
DSA的设计与实现_第3页
DSA的设计与实现_第4页
DSA的设计与实现_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、并用此密码对要发送的信息进行加密,形成密文;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最初提出的方法之上的。数字签名保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。数字签名是个加密的过程,数字签名验证是个解密的过程。1.3 DSA数字签名过程1 全局公

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

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

6、公钥3 由于与互素,所以19在模23下的乘法逆元存在,利用欧几里得算法计算:4 用户A计算消息M的数字签名消息M的签名5 用户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 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、是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。 * 如果数据和签名不匹配则认为验证失败!即传输中的数据 可以不再加密,接收方获得数据后,拿到公钥与签名 验证数据是否有效 */ 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" /默认种子 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工大学子*()_+" byte data = str.get

10、Bytes(); Map<String, Object> keyMap = initKey();/ 构建密钥 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(); / 产生签名 String sign = sign(data, getPrivateKey(keyMap); / 验证签名 boolean verify1 = verify("aaa".getBytes(), getPublicKey(keyMap), sign); System.err.println("经验证 数据和签名匹配:" + verify1); boolean verify = verify(data, getPublicKey(keyMap), sign); System.err.println("经验

12、证 数据和签名匹配:" + 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; /* * 生成默认密钥 * 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加密公钥 /* * 用私钥对信息进行数字签名 * param data 加密数据 * param privateKey 私钥-base64加密的 * return * throws Exception */ public static String sign(byte data, String privateKey)

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

18、字签名 Signature signature = 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 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; /* * 校验数字签名 * param data 加密数据 * param publicKey * param sign 数字签名 * 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论