一、实习目的1.理解数字签名的概念和作用;2.理解身份认证的基本方式和方法;3.掌握Hash函数和数字签名的实现。
二、实习要求1.实习前认真预习第3章的有关内容;2.复习数字签名和身份认证相关内容;3.熟悉Java平台的JCE包有关类。
三、实习内容假定两个用户A、B,他们的公私钥对分别是K PUa、K PRa和K PUb、K PRb,,分发的消息为M,哈希函数h(x)。
请基于RSA算法实现数字签名,阶梯任务如下:①以本地两个目录模拟两个用户,实现消息M和签名的模拟分发;②以MD5、SHA-1等哈希函数,实现消息M的摘要,实现M及摘要签名的模拟分发;③实现M密文状态下的签名与模拟分发;④采用SSL,建立安全通信过程,实现Socket通信的签名分发;⑤将方案移植到某个web应用中,实现实用的签名分发。
四、实验过程1.数字签名概述数字签名是指使用密码算法,对待发的数据(报文或票证等)进行加密处理,生成一段数据摘要信息附在原文上一起发送。
这种信息类似于现实中的签名或印章,接收方对其进行验证,判断原文真伪。
数字签名可以提供完整性保护和不可否认服务。
其中,完整性保护主要针对解决篡改问题,不可否认服务主要针对解决抵赖性问题。
一般说来,传统数字签名的过程中,主要先采用单向散列算法,对原文信息进行加密压缩形成消息摘要,原文的任何变化都会使消息摘要发生改变;然后,对消息摘要用非对称加密算法(如RSA )进行加密。
在验证阶段,收方将信息用单向加密算法计算出消息摘要,然后将收到的消息摘要进行解密,比较两个消息摘要来判断信息是否可靠。
2.数字签名过程(1)要签名的报文作为一个散列函数的输入,产生一个定长的安全散列码,一般称为消息摘要。
(2)使用发方的私有密钥对这个消息摘要进行加密就形成签名。
将报文和签名传送出去。
(3)收方接受报文并根据报文产生一个消息摘要,同时使用发方的公开密钥对签名进行解密。
(4)如果计算得出的消息摘要和解密后的签名互相匹配,那么签名就是有效的。
(5)因为只有发方知道密钥,因此只有发方才能产生有效的签名。
发送方私钥加密发送方接收方1. 数字签名基本过程3.数字签名的实现数字签名过程中,在产生签名阶段,发送方至少要进行以下的计算:(1) 由消息 M 利用单向散列函数产生消息摘要 H(M);(2) 将产生的消息摘要 H(M)用发方的私有密钥进行加密。
在验证签名阶段,接收方也要进行以下的计算:(1) 由消息 M 利用单向散列函数产生消息摘要 H(M);(2) 将收到的消息摘要 H(M)用发送方公开密钥进行解密;(3) 两者进行比较,不一致则发出否决消息,否则接受信息。
用RSA 实现数字签名1.发送方生成一个公钥一个私钥,分别保存为文件:public.key 和 private.key ;任给一个信息文件 info.txt ,发送方用自己的 private.key 生成数字签名(已加密),将签名存放于 signature.sgn ;接收方用发送方的 public.key 验证数字签名。
FileOutputStream fos_public = new FileOutputStream("public.key");ObjectOutputStream oos_public =new ObjectOutputStream(fos_public );FileOutputStream fos_private = new FileOutputStream("private.key");ObjectOutputStream oos_private = new ObjectOutputStream(fos_private );// 形成RSA 公钥对 KeyPairGenerator keyGen = KeyPairGenerator.getInstance ("RSA");keyGen .initialize(1024);// 初始化密钥空间2. 生成两个文件:private.key 和 public.key 。
3. 对信息文件 info.txt ,发送方用自己的 private.key 生成数字签名,将签名存放于 signature.sgnFile file_info = new File("info.txt");FileInputStream fis_info = new FileInputStream(file_info );int fileInfoLength = (int )file_info .length();byte [] infoBytes = new byte [fileInfoLength ];fis_info.read(infoBytes);fis_info.close();//发送方读入私钥FileInputStream fis_private = new FileInputStream("private.key");ObjectInputStream ois_private = new ObjectInputStream(fis_private);PrivateKey privateKey = (PrivateKey)ois_private.readObject();fis_private.close();ois_private.close();//生成签名实例化Signature 指定用RSA和SHA算法Signature sig=Signature.getInstance("SHA1WithRSA");//用私钥来初始化数字签名对象sig.initSign(privateKey);//对msgBytes实施签名sig.update(infoBytes);4. 生成签名文件:signature.sgn。
5. 接收方用发送方的public.key 验证数字签名File file_info = new File("info.txt");FileInputStream fis_info = new FileInputStream(file_info);int fileInfoLength = (int)file_info.length();byte[] infoBytes = new byte[fileInfoLength];fis_info.read(infoBytes);fis_info.close();// 读入发送方公钥FileInputStream fis_public = new FileInputStream("public.key");ObjectInputStream ois_public = new ObjectInputStream(fis_public);PublicKey publicKey = (PublicKey)ois_public.readObject();fis_public.close();ois_public.close();// 读入签名文件File file_signature = new File("signature.sgn");FileInputStream fis_signature = new FileInputStream(file_signature);int fileSignatureLength = (int)file_signature.length();byte[] signatureBytes = new byte[fileSignatureLength];fis_signature.read(signatureBytes);fis_signature.close();// 使用公鈅验证Signature sig=Signature.getInstance("SHA1WithRSA");sig.initVerify(publicKey);sig.update(infoBytes);if(sig.verify(signatureBytes)){System.out.println("成功收到文件");}else{System.out.println("文件被篡改");}4.测试结果修改info后传送给接受者5.遇到的问题Signature sig=Signature.getInstance("SHA1");生成签名,实例化Signature时,程序抛出异常。
实际上在消息进行Hash摘要后需要用RSA 算法用发送方的私钥进行加密,java支持Signature sig=Signature.getInstance("SHA1WithRSA");6.实验总结数字签名又称电子签章,是非对称密钥密码技术的一种逆向应用,属于数字认证技术的一种。
数字签名是指用户用自己的私钥对原始信源数据的hash摘要进行运算后得到加密数据的应用过程。
附加在数据单元的一些数据或者对数据单元进行的变换,允许数据单元的接收方用于确认数据单元的来源和完整性并保护数据,防止被人进行伪造。
需要签名的文件数据长度不限制,但计算散列时需要固定长度的输入和输出,用到Hash函数,输入大小是任意的,输出大小是固定的的,而且两个不同的输入导致输出结果相同的概率微乎其微。
身份认证是指在两方或者多方参与的信息交互中,参与者中的一方对其余各方身份的判断与确认,其主要目的是防止伪装。
在网络应用中,凡是要解决伪造、抵赖、冒充、篡改与身份鉴别的问题,都可用数字签名来处理。