【网络安全基础】数字签名原理及应用

数字签名原理及应用

1、实验要求

(1)总结数字签名的原理;
(2)利用RSA实现数字签名;
(3)实现一个读取a.txt文件内容进行签名,把签名信息写入b.txt;
(4)选做作业,利用前面所给的RSACryptography1.java、RSACryptography2.java、RSACryptography3.java、RSACryptography4.java中的任意一个实现数字签名。

2、实现方法
Eclipse中用Java语言实现。

3、实验过程及结果
(1)总结数字签名的原理;

数字签名是一种确保数据完整性和原始性的方法。数字签名可以提供有力的证据,表明自从数据被签名以来数据尚未发生更改,并且它可以确认对数据签名的人或实体的身份。数字签名实现了“完整性”和“认可性”这两项重要的安全功能,而这是实施安全电子商务的基本要求。
当数据以明文或未加密形式分发时,通常使用数字签名。在这种情况下,由于消息本身的敏感性无法保证加密,因此必须确保数据仍然保持其原来的格式,并且不是由冒名者发送的。因为在分布式计算环境中,网络上具有适当访问权的任何人,无论是否被授权都可以很容易读取或改变明文文本。
数字签名主要是为了证明发件人身份,就像我们来看到的某文件签名一样。但现在要说的签名是采取电子数字签名的方式。这种签名还可以防止别人仿签,因为经过加密过的签名会变得面目全非,别人根本不可能看到真正的签名样子。在第9.5.2节介绍了在文件传输和邮件发送中利用文件加密方式来阻止非法用户打开的原理,其实仅用了文件加密方式还不足以保证邮件传输的真正安全,因为邮件内容还可能被非法用户替换,尽管这些非法用户不能查看原邮件中的真正内容。这就涉及到如何确保自己收到的邮件就是自己希望的用户发来的问题了,此时就需要用到数字签名技术。但是在邮件传输中,通常又不是单独使用文件加密或者数字签名,而是一起结合起来使用,它们两者一起作用就可取到非常好的安全保护了。下面仍以第9.5.2节实例为例进行介绍,不同的只是在此封邮件发送中同时采用了文件加密和数字签名,实施双重保护。具体步骤如下。
n Alice与Bob互换公钥。 n Alice用自己的私钥对TXT文件进行数字签名。 n
Alice用Bob的公钥对TXT文件进行加密。 n
Alice把经过数字签名和加密的文件TXT,通过邮件或其他传输途径,如QQ、MSN等)传给Bob。 n
Bob在收到签名并加密的邮件后首先用Bob自己的私钥进行文件加密的解密,然后再用Alice的公钥进行数字签名解密。
同样,在这个过程中Cinda也可以获取Bob、Alice的公钥和签名并加密的标书文件TXT。同时因无Bob的私钥而无法打开邮件。同时由于Alice在发送文件前已用自己的私钥进行了数字签名,所以当Bob在收到邮件后完全可以证实自己收到的就是Alice发来的邮件,而不可能是其他用户的。试想如果Cinda非法用户想要改变邮件,冒充Alice向Bob发送邮件,因Cinda没有Alice的私钥,所以在用其他用户的私钥进行数字签名时就不可能再以Alice的公钥来解密数字签名了。

(2)利用RSA实现数字签名;
源代码:

import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class RSA_SIGN {
   
    //要签名和验证的签名内容
    private static String src = "hello world";   
    public static void main(String[] args) {
   
        jdkRSA();
    }
    
    public static void jdkRSA(){
          
    	RSA_SIGN cxyzl_RSA = new RSA_SIGN();
        try {
   
            //1.初始化密钥,产生公钥私钥对
            Object[] keyPairArr = cxyzl_RSA.initSecretkey();
            RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPairArr[0];
            RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPairArr[1];
            System.out.println("公钥:"+rsaPublicKey);
            System.out.println("私钥:"+rsaPrivateKey);           
            //2.执行签名
            byte[] result = cxyzl_RSA.executeSignature(rsaPrivateKey);
            System.out.println("签名:"+result);            
            //3.验证签名
            boolean bool = cxyzl_RSA.verifySignature(rsaPublicKey,result);
            System.out
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值