1、实习二 数字签名与认证的实现实习二 数字签名与认证的实现一、实习目的1理解数字签名的概念和作用;2理解身份认证的基本方式和方法;3掌握Hash函数和数字签名的实现。二、实习要求1实习前认真预习第3章的有关内容;2复习数字签名和身份认证相关内容;3熟悉Java平台的JCE包有关类。三、 实习内容假定两个用户A、B,他们的公私钥对分别是KPUa、KPRa和KPUb、KPRb,分发的消息为M,哈希函数h(x)。请基于RSA算法实现数字签名,阶梯任务如下:以本地两个目录模拟两个用户,实现消息M和签名的模拟分发;实现过程:A将信息M用自己的私钥加密后与M本身一起发送给B,B将签名用A的公钥解密,得出的信
2、息与M对比,如果一致,说明消息就是A发的,因为只有A知道自己的私钥。运行结果:以MD5、SHA-1等哈希函数,实现消息M的摘要,实现M及摘要签名的模拟分发;实现过程:A对消息M用散列函数求出摘要,再用自己的私钥对摘要进行签名,将摘要和摘要的签名一起发送给B,B接受后用A的公钥解密摘要签名,将得出的摘要与发送的摘要对比,判断是否是A发送的。MD5:SHA-1:实现M密文状态下的签名与模拟分发;实现过程:A对消息M用B的公钥进行加密,将密文用散列函数求出摘要,再用自己的私钥对摘要进行签名,将密文摘要和摘要的签名一起发送给B,B接受后用A的公钥解密摘要签名,将得出的摘要与发送的摘要对比,判断是否是A
3、发送的,之后再使用自己的私钥解密得到的密文,最终得到明文消息M。运行结果:采用SSL,建立安全通信过程,实现Socket通信的签名分发;将方案移植到某个web应用中,实现实用的签名分发。4、实验总结 通过这次实验,对于数字签名的方式有了更多了解,认识到非对称密钥体系真的是一个很好的体系,既可以做签名,也可以进行加解密,功能很多。附代码:SKey_RSA.javapackage cn.test.key;import java.io.FileOutputStream;import java.io.ObjectOutputStream;import java.security.KeyPair;imp
4、ort java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;public class SKey_RSA public void key_RSA() throws Exception KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA); kpg.initialize(1024); KeyPair kp = kp
5、g.genKeyPair(); PublicKey pbkey = kp.getPublic(); PrivateKey prkey = kp.getPrivate(); FileOutputStream f1 = new FileOutputStream(Skey_RSA_pub1.dat); ObjectOutputStream oo1 = new ObjectOutputStream(f1); oo1.writeObject(pbkey); FileOutputStream f2 = new FileOutputStream(Skey_RSA_pri1.dat); ObjectOutpu
6、tStream oo2 = new ObjectOutputStream(f2); oo2.writeObject(prkey); oo1.close(); oo2.close(); f1.close(); f2.close(); Rsa_Op.javapackage cn.test.key;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutput
7、Stream;import java.io.InputStreamReader;import java.io.ObjectInputStream;import java.io.OutputStreamWriter;import java.math.BigInteger;import java.security.Key;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;public class Rsa_Op int flag = 0; public byte enc
8、_pub(String s) throws Exception byte b = s.getBytes(UTF8); FileInputStream f = new FileInputStream(Skey_RSA_pub1.dat); ObjectInputStream oi = new ObjectInputStream(f); RSAPublicKey pbk = (RSAPublicKey)oi.readObject(); oi.close(); BigInteger e = pbk.getPublicExponent(); BigInteger n = pbk.getModulus(
9、); BigInteger m = new BigInteger(b); BigInteger m1 = new BigInteger(0); if(pareTo(m1)=-1) m = m.negate(); flag = 1; BigInteger c = m.modPow(e, n); System.out.println(M用公钥加密后的密文:); System.out.println(c=+c); byte re = c.toByteArray(); String cs = c.toString(); BufferedWriter bw = new BufferedWriter(ne
10、w OutputStreamWriter(new FileOutputStream(Enc_pub_RSA1.dat); bw.write(cs, 0, cs.length(); bw.close(); return re; public void enc_pri(String s) throws Exception byte b = s.getBytes(UTF8); FileInputStream f = new FileInputStream(Skey_RSA_pri1.dat); ObjectInputStream oi = new ObjectInputStream(f); RSAP
11、rivateKey prk = (RSAPrivateKey)oi.readObject(); oi.close(); BigInteger e = prk.getPrivateExponent(); BigInteger n = prk.getModulus(); BigInteger m = new BigInteger(b); System.out.println(签名前的M=+m); BigInteger m1 = new BigInteger(0); if(pareTo(m1)=-1) m = m.negate(); flag = 1; BigInteger c = m.modPow
12、(e, n); System.out.println(签名后的M=+c); /System.out.println(将密钥加密后的密文c=+c); String cs = c.toString(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(Enc_pri_RSA1.dat); bw.write(cs, 0, cs.length(); bw.close(); public byte dec_pri() throws Exception BufferedReader br
13、= new BufferedReader(new InputStreamReader(new FileInputStream(Enc_pub_RSA1.dat); String ctext = br.readLine(); br.close(); BigInteger c = new BigInteger(ctext); FileInputStream f = new FileInputStream(Skey_RSA_pri1.dat); ObjectInputStream oi = new ObjectInputStream(f); RSAPrivateKey prk = (RSAPriva
14、teKey)oi.readObject(); BigInteger d = prk.getPrivateExponent(); BigInteger n = prk.getModulus(); BigInteger m = c.modPow(d, n); if(flag = 1) m = m.negate(); flag = 0; System.out.println(将c解密后得: ); System.out.println(m=+m); byte mt = m.toByteArray(); oi.close(); f.close(); return mt; public byte dec_
15、pub() throws Exception BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(Enc_pri_RSA1.dat); String ctext = br.readLine(); br.close(); BigInteger c = new BigInteger(ctext); FileInputStream f = new FileInputStream(Skey_RSA_pub1.dat); ObjectInputStream oi = new ObjectInpu
16、tStream(f); RSAPublicKey pbk = (RSAPublicKey)oi.readObject(); BigInteger d = pbk.getPublicExponent(); BigInteger n = pbk.getModulus(); BigInteger m = c.modPow(d, n); if(flag = 1) m = m.negate(); flag = 0; System.out.println(公钥解密后的M=+m); byte b = m.toByteArray(); oi.close(); f.close(); return b; Sig.
17、java:package cn.test.key;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.ObjectInputStream;import java.security.NoSuchAlgorithmException;import java.security.Signature;import java.security.interfaces.RSAPrivateKey;
18、public class Sig public void sigNoz(String s,Rsa_Op ro) throws Exception SKey_RSA sr = new SKey_RSA(); sr.key_RSA(); ro.enc_pri(s); public void sigWithz(String algorithm,String msg) throws Exception FileInputStream f = new FileInputStream(Skey_RSA_pri1.dat); ObjectInputStream oi = new ObjectInputStr
19、eam(f); RSAPrivateKey prk = (RSAPrivateKey)oi.readObject(); oi.close(); Signature s=Signature.getInstance(algorithm); s.initSign(prk); byte b = msg.getBytes(UTF8); s.update(b); byte b1 = s.sign(); System.out.println(摘要签名:); for(int i=0;ib1.length;i+) System.out.print(b1i+,); FileOutputStream f3=new
20、FileOutputStream(Sign.dat); f3.write(b1); public void sigWithz(String algorithm,byte msg) throws Exception FileInputStream f = new FileInputStream(Skey_RSA_pri1.dat); ObjectInputStream oi = new ObjectInputStream(f); RSAPrivateKey prk = (RSAPrivateKey)oi.readObject(); oi.close(); Signature s=Signatur
21、e.getInstance(algorithm); s.initSign(prk); s.update(msg); byte b1 = s.sign(); System.out.println(密文摘要签名:); for(int i=0;ib1.length;i+) System.out.print(b1i+,); FileOutputStream f3=new FileOutputStream(Sign.dat); f3.write(b1); Dec_Sig.java:package cn.test.key;import java.io.FileInputStream;import java
22、.io.FileNotFoundException;import java.io.ObjectInputStream;import java.security.Signature;import java.security.interfaces.RSAPublicKey;public class Dec_Sig public String dec_SigNoz(Rsa_Op ro) throws Exception byte ss = ro.dec_pub(); String s = new String(ss,UTF8); return s; public boolean dec_SigWit
23、hz(String msg,String algorithm) throws Exception byte data = msg.getBytes(UTF8); FileInputStream f2=new FileInputStream(Sign.dat); int num = f2.available(); byte b = new bytenum; f2.read(b); FileInputStream f = new FileInputStream(Skey_RSA_pub1.dat); ObjectInputStream oi = new ObjectInputStream(f);
24、RSAPublicKey pbk = (RSAPublicKey)oi.readObject(); Signature s=Signature.getInstance(algorithm); s.initVerify(pbk); s.update(data); boolean result = s.verify(b); return result; public boolean dec_SigWithz(byte msg,String algorithm) throws Exception FileInputStream f2=new FileInputStream(Sign.dat); in
25、t num = f2.available(); byte b = new bytenum; f2.read(b); FileInputStream f = new FileInputStream(Skey_RSA_pub1.dat); ObjectInputStream oi = new ObjectInputStream(f); RSAPublicKey pbk = (RSAPublicKey)oi.readObject(); Signature s=Signature.getInstance(algorithm); s.initVerify(pbk); s.update(msg); boo
26、lean result = s.verify(b); return result; Test1.java:package cn.test.key;import java.io.BufferedReader;import java.io.FileReader;public class Test1 public static void main(String args) throws Exception / TODO Auto-generated method stub FileReader f = new FileReader(消息M.txt); BufferedReader br =new B
27、ufferedReader(f); String ss = br.readLine(); Rsa_Op ro =new Rsa_Op(); Sig s = new Sig(); s.sigNoz(ss,ro); Dec_Sig ds = new Dec_Sig(); String decs = ds.dec_SigNoz(ro); System.out.println(签名解密后得到的消息M=+decs); if(ss.equals(decs) System.out.println(验证签名成功!); Test2.java:package cn.test.key;import java.io.
28、BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;public class Test2 public static void main(String args) throws Exception / TODO Auto-generated method stub SKey_RSA sr = new SKey_RSA(); sr.key_RSA(); FileReader f = new FileReader(消息M.txt); BufferedReader br =new Buffered
29、Reader(f); String ss = br.readLine(); Rsa_Op ro =new Rsa_Op(); Sig s = new Sig(); System.out.println(使用SHA-1算法生成摘要); s.sigWithz(SHA1WithRSA, ss); Dec_Sig ds = new Dec_Sig(); boolean ok = ds.dec_SigWithz(ss, SHA1WithRSA); if(ok=true) System.out.println(); System.out.println(验证签名成功!); Test3.java:package cn.test.key;import java.io.BufferedReader;import java.io.FileReader;public class Test3 /* * param args * throws Exception */ pub
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1