`

关于数字签名基础知识

阅读更多
1.消息摘要
public class MessageDigestExample {

	public static void main(String[] args) throws Exception {   
        
        String beforeDegist = "asdf";   
        System.out.println("摘要前:"+beforeDegist);     
           
        //初始信息要转换成字节流的形式   
        byte[] plainText = beforeDegist.getBytes("GBK");   
  
        //使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法   
//        MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");   
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");   
           
//        System.out.println("\n" + messageDigest.getProvider().getInfo());   
           
        //开始使用算法   
        messageDigest.update(plainText);   
           
        //输出算法运算结果   \
        
        String afterDegist = new String(messageDigest.digest(),"GBK");   
        System.out.println("摘要后:"+afterDegist);   
    }   

}


2.私钥加密
/**  
	 * 此例子是对一个字符串信息,用一个私钥(key)加密,然后在用该私钥解密,验证是否一致  
	 * 私钥加密,是对称加密  
	 * 使用对称算法。比如:A用一个密钥对一个文件加密,而B读取这个文件的话,则需要和A一样的密钥,双方共享一  
	 * 个私钥(而在web环境下,私钥在传递时容易被侦听)  
	 *   
	 * 附:主要对称算法有:DES(实际密钥只用到56 位)  
	 * AES(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有DESede等  
	 */  

	public static void main(String[] args) throws Exception {   
		  
        String before = "asdf";          
        byte[] plainText = before.getBytes("UTF8");   
           
        //1步**********************************************************************   
        System.out.println("Start generate AES key.");   
        //得到一个使用AES算法的KeyGenerator的实例   
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");   
        //定义密钥长度128位   
        keyGen.init(128);   
        //通过KeyGenerator产生一个key(密钥算法刚才已定义,为AES)   
        Key key = keyGen.generateKey();   
        System.out.println("Finish generating AES key."+key);   
        //2步**********************************************************************   
        //获得一个私钥加密类Cipher,定义Cipher的基本信息:ECB是加密方式,PKCS5Padding是填充方法   
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");   
         
        //3步**********************************************************************   
        //使用私钥加密   
        System.out.println("\n用私钥加密...");   
        //把刚才生成的key当作参数,初始化使用刚才获得的私钥加密类,Cipher.ENCRYPT_MODE意思是加密   
        cipher.init(Cipher.ENCRYPT_MODE, key);   
           
        //私钥加密类Cipher进行加密,加密后返回一个字节流byte[]   
        byte[] cipherText = cipher.doFinal(plainText);   
           
        //以UTF8格式把字节流转化为String   
        String after1 = new String(cipherText, "UTF8");   
        System.out.println("用私钥加密完成:"+after1);   
  
           
        //4步**********************************************************************   
        //使用私钥对刚才加密的信息进行解密,看看是否一致,Cipher.DECRYPT_MODE意思是解密钥   
        System.out.println("\n用私钥解密...");   
        cipher.init(Cipher.DECRYPT_MODE, key);   
           
        //对刚才私钥加密的字节流进行解密,解密后返回一个字节流byte[]   
        byte[] newPlainText = cipher.doFinal(cipherText);   
           
        String after2 = new String(newPlainText, "UTF8");   
        System.out.println("用私钥解密完成:"+after2);   
    }   



3.公钥加密
/**  
	 * 此例子是一个公钥加密例子,Cipher类使用KeyPairGenerator(顾名思义:一对钥匙生成器)生成的公钥和私钥  
	 *   
	 * 公钥加密也叫不对称加密,不对称算法使用一对密钥对,一个公钥,一个私钥,使用公钥加密的数据,只有私钥能  
	 * 解开(可用于加密);同时,使用私钥加密的数据,只有公钥能解开(签名)。但是速度很慢(比私钥加密慢100到  
	 * 1000倍),公钥的主要算法有RSA,还包括Blowfish,Diffie-Helman 等  
	 */  

	public static void main(String[] args) throws Exception {   
        
        String before = "asdf";          
        byte[] plainText = before.getBytes("UTF8");   
           
        //产生一个RSA密钥生成器KeyPairGenerator(顾名思义:一对钥匙生成器)   
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");   
        //定义密钥长度1024位   
        keyGen.initialize(1024);   
        //通过KeyPairGenerator产生密钥,注意:这里的key是一对钥匙!!   
        KeyPair key = keyGen.generateKeyPair();   
  
        //获得一个RSA的Cipher类,使用公钥加密   
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");   
  
        System.out.println("\n用公钥加密...");   
        //Cipher.ENCRYPT_MODE意思是加密,从一对钥匙中得到公钥 key.getPublic()   
        cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());   
        //用公钥进行加密,返回一个字节流   
        byte[] cipherText = cipher.doFinal(plainText);   
        //以UTF8格式把字节流转化为String   
        String after1 = new String(cipherText, "UTF8");   
        System.out.println("用公钥加密完成:"+after1);   
  
           
        //使用私钥解密   
        System.out.println("\n用私钥解密...");   
        //Cipher.DECRYPT_MODE意思是解密,从一对钥匙中得到私钥 key.getPrivate()   
        cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());   
        //用私钥进行解密,返回一个字节流   
        byte[] newPlainText = cipher.doFinal(cipherText);   
  
        String after2 = new String(newPlainText, "UTF8");   
        System.out.println("用私钥解密完成:"+after2);   
    }   




4.数字签名
/**  
	 * 此例子是数字签名的例子,使用RSA私钥对消息摘要(这里指的是原始数据)进行签名,然后使用公钥验证签名    
	 * A通过使用B的公钥加密数据后发给B,B利用B的私钥解密就得到了需要的数据(进过B公钥加密的数据只有B的私钥能够  
	 * 解开,但C可以使用B的公钥加密一份数据发给B,这样一来,问题来了,B收到的数据到 底是A发过来的还是C发过来的呢)  
	 * 由于私钥是唯一的,那么A就可以利用A自己的私钥进行加密,然后B再利用A的公钥来解密,就可以确定:一定是A的消  
	 * 息,数字签名的原理就基于此     
	 * 总结:A想将目标数据传给B,此时A需要准备1和2两部分  
	 * 1:A使用B的公钥将原始信息加密,以起到保密作用  
	 * 2:A使用A的私钥将原始信息的摘要进行签名,以起到接收方B确定是A发过来的作用(A用A的私钥对目标数据的摘要进行签  
	 * 名,然后传给B,同时,C用C的私钥对任意信息进行签名也传给B,B想接受的是A的数据(比如说一个转帐请求),于是B  
	 * 就通过A的公钥对接受到的两个信息进行解密,解开的就是A(A的公钥能且只能解开A的私钥加密的数据))  
	 */  

	 public static void main(String[] args) throws Exception {   
		  
	        String before = "asdf";   
	        byte[] plainText = before.getBytes("UTF8");   
	  
	        //形成RSA公钥对   
	        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");   
	        keyGen.initialize(1024);   
	        KeyPair key = keyGen.generateKeyPair();   
	  
	        //使用私钥签名**********************************************************   
	        Signature sig = Signature.getInstance("SHA1WithRSA");   
	        sig.initSign(key.getPrivate());//sig对象得到私钥   
	        //签名对象得到原始数据   
	        sig.update(plainText);//sig对象得到原始数据(现实中用的是原始数据的摘要,摘要的是单向的,即摘要算法后无法解密)   
	        byte[] signature = sig.sign();//sig对象用私钥对原始数据进行签名,签名后得到签名signature   
	        String after1 = new String(signature, "UTF8");   
	        System.out.println("\n用私钥签名后:"+after1);   
	  
	        //使用公钥验证**********************************************************   
	        sig.initVerify(key.getPublic());//sig对象得到公钥   
	        //签名对象得到原始信息   
	        sig.update(plainText);//sig对象得到原始数据(现实中是摘要)   
	        try {   
	            if (sig.verify(signature)) {//sig对象用公钥解密签名signature得到原始数据(即摘要),一致则true   
	                System.out.println("签名验证正确!!");   
	            } else {   
	                System.out.println("签名验证失败!!");   
	            }   
	        } catch (SignatureException e) {   
	            System.out.println("签名验证失败!!");   
	        }   
	    }   
分享到:
评论

相关推荐

    密码学基础课件:第十五讲 数字签名与PKI.ppt

    数字签名是密码学基础课件中的一个重要知识点,它在信息安全、身份认证、数据完整性、不可否认性和匿名性等方面都有着重要的应用。数字签名是实现认证的重要工具,可以证明个人的身份,在大型网络安全通信中的密钥...

    大数据-算法-基于椭圆曲线和双线性对的数字签名的研究.pdf

    本论文对基于椭圆曲线和双线性对的数字签名的研究进行了系统的总结和分析,为读者提供了一个全面的了解基于椭圆曲线和双线性对的数字签名的知识体系。 在研究中,我们提出了基于椭圆曲线的代理盲多重签名方案和基于...

    密码基础知识试题库+判断.docx

    群签名是一种数字签名方式,但不需要群中的所有成员对被签名文件进展签名。 9. 商用密码产品:任何单位或者个人都可以使用商用密码产品。错误 商用密码产品是指经批准的密码产品,但是并不是任何单位或者个人都...

    电子信封和数字签名资料

    介绍PKI基础知识,侧重介绍电子签名和数字信封,内容浅显易懂

    [Word基础教程合集一]为宏添加VBA项目数字证书签名.docx

    Word 基础教程合集一:为宏添加 VBA 项目数字证书签名 本文档讲解了如何为 Word 宏添加 VBA 项目数字证书签名,以提高 Word 宏的安全性和效率。主要分为两个步骤:首先,设置 Word 宏的安全级别为“中”,并编写一...

    计算机基础知识汇总.pdf

    了解 socket 知识和网络安全(对称加密、非对称加密、Hash、数字签名,以及集成者Https)等概念可以帮助我们更好地理解网络通信的原理。 4. 数据库 数据库是计算机专业的基础知识,包括最基本的SQL、各种范式、...

    计算机网络基础知识

    第2章 数据通信基础知识 2.1 基本概念 2.1.1 信号与通信 2.1.2 模拟通信 2.1.3 数字通信 2.2 数据通信基础理论 2.2.1 信号的频谱和带宽 2.2.2 信道的截止频率与带宽 2.2.3 信道的最大数据传输率 2.3 传输...

    基于python的毕业设计_RSA算法的数字签名生成软件_(项目源码+数据库脚本+文档).zip

    源代码不仅是学习的资源,还可作为技术分享和交流的平台,促进技术互动和知识共享。 在学习过程中,我们将通过分析源代码深入了解Python的使用方式和原理,提升对Python技术的理解和熟练度。具体而言,我们将掌握...

    pki基础知识.zip

    PKI基础知识培训资料,从密码学基础开始,讲述(非)对称加解密、摘要、组合密码技术(数字签名、数字信封)等密码技术。PKCS7结构规范中的数字签名结构(RSA和国密)以及PKCS1规范文档,X509标准,国密密码算法相关标准。...

    计算机网络安全基础知识.pptx

    逻辑上的措施,即研究开发有效的网络安全技术,例如,安全协议、密码技术、数字签名、防火墙、安全管理、安全审计等。 计算机网络安全基础知识全文共57页,当前为第9页。 三.知识链接: 计算机网络安全是指保持网络...

    [网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)

    前文 “[网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)” 分享了数字签名的原理知识,这篇文章将详细解析数字签名,采用Signtool工具对EXE文件进行签名,接着利用Asn1View、PEVie...

    计算机网络安全基础知识.pptx.pptx

    逻辑上的措施,即研究开发有效的网络安全技术,例如,安全协议、密码技术、数字签名、防火墙、安全管理、安全审计等。 计算机网络安全基础知识全文共57页,当前为第9页。 三.知识链接: 计算机网络安全是指保持网络...

    网络安全原理与应用:数字签名.pptx

    数字签名技术是实现交易安全的核心技术之一,它的实现基础就是加密技术。以往的书信或文件是根据亲笔签名或印章来证明其真实性的。这就是数字签名所要解决的问题。 数字签名由公钥密码发展而来,它在网络安全,包括...

    全国计算机等级考试公共基础知识讲义.docx

    * 加密技术:介绍加密技术的基本概念,包括对称加密、非对称加密、数字签名等。 6. 人机交互 * 人机交互基础:介绍人机交互的基本概念,包括人机交互模型、人机交互设计等。 * 图形用户界面:介绍图形用户界面的...

    ASP基于RSA的数字签名的设计与实现(源代码+论文)_new.rar

    - 论文:涵盖了整个Java ASP Web系统的基础知识,设计意图、需求概述、系统结构与设计哲学、相关技术的深入探索等。学生可以从论文中理解项目的全局构想和关键设计决策。 - 设计文档:详细梳理了系统的构建过程,...

    pki及相关基础知识

    详细讲解PKI的应用技术,以及原理。对于数字签名的认识 ,以及数字证书的作用及使用原理。

    密码学应用基础概述.pdf

    密码学应用基础概述是信息安全领域的基础知识,旨在保护机密性、完整性、鉴别、不可否认性和授权等安全需求。本文将从密码学应用的基础知识开始,逐步深入探讨密码学应用的各种解决方案和方法。 一、机密性加密技术...

    项目9配置与管理数字证书服务器.pptx

    PKI 是一种公钥基础结构,用于身份验证、加密和数字签名等目的。PKI 的应用包括数字证书、加密文件系统、IPsec 等。 11. 证书的颁发流程 证书的颁发流程包括申请、审核、颁发和撤销等步骤。 12. CA 的层次结构 CA ...

    CH02-03-安全基础知识1

    引入密钥分配中心,违背了密码学的精髓。数字签名方案问题:能否设计出一种方案,就像手写签名一样,确保数字签名是出自某一特定的人,并且各方对此没有异议。While

    Wiley.Public Key Infrastructure and Implementation and Design.pdf

    Chapter 1: Cryptography Basics对密码学的基础知识进行了介绍,包括密码学的基本概念、密码学的应用、数字签名等内容。密码学的基础知识是理解PKI的基础,而PKI是基于密码学的技术堆栈,因此,了解密码学的基础知识...

Global site tag (gtag.js) - Google Analytics