`

关于数字签名基础知识

阅读更多
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("签名验证失败!!");   
	        }   
	    }   
分享到:
评论

相关推荐

    如何对驱动进行数字签名和禁用数字签名强制

    以上提到的步骤和方法涵盖了数字签名的基础知识、禁用签名强制的操作流程以及针对特定产品的安装注意事项。这些知识点对于从事IT开发、系统管理或对安全有高要求的用户来说是非常重要的。正确地理解和执行这些操作,...

    数字签名证书生成器IDSignMSO

    在使用IDSignMSO之前,用户需要了解数字证书的基础知识,包括公钥和私钥的概念,以及如何妥善保管私钥,因为私钥泄露将导致签名失去效力。同时,确保选择一个受信任的CA来签署证书,以提高软件的信誉度。 总结来说...

    计算机课程设计rsa数字签名实现

    【RSA数字签名实现详解】 RSA数字签名是一种广泛应用于网络安全中的加密技术,它是基于RSA公钥...通过这个MATLAB项目,你不仅能够提升编程技能,还能巩固对密码学基础知识的理解,为未来从事相关工作打下坚实的基础。

    练习数字签名代码

    1. `DES.cpp` 和 `DES.h`:这可能涉及到数据加密标准(DES)的实现,虽然不是直接与数字签名相关,但DES是早期广泛使用的对称加密算法,可以作为理解加密基础的参考。 2. `TestHashsign.cpp`:这个名字暗示它可能是...

    加密 RSA 数字签名 数字证书 实例

    在IT领域,加密、RSA数字签名以及数字证书是网络安全中至关重要的概念,它们共同构建了互联网上安全通信的基础。下面将详细阐述这些知识点,并结合"EncryptMethod"这一压缩包文件中的可能内容进行分析。 首先,加密...

    ~小熊数字签名添加器~

    下面将详细阐述数字签名的概念、功能以及免杀技术的相关知识。 首先,数字签名并不是我们日常生活中笔迹的电子化,而是通过加密算法在数据上附加的一种特殊信息,用于验证数据的完整性和发送者的身份。它结合了公钥...

    基于rsa数字签名c++实现

    RSA数字签名是一种在C++中实现的广泛应用的公钥加密...通过理解这些基础知识并结合适当的库,我们可以构建出能够安全有效地进行数字签名和验证的软件。在进行开发时,务必注意遵循最佳实践,确保系统的安全性和可靠性。

    Elgamal数字签名

    以下是一些关于Elgamal数字签名的关键知识点: 1. **公钥与私钥**: - Elgamal签名算法使用一对密钥:公钥和私钥。任何人都可以使用公钥对数据进行加密,但只有持有对应私钥的用户才能解密。在签名过程中,私钥...

    57.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)1

    【网络安全自学篇】PE文件逆向之什么是数字签名及Sign...对于网络安全初学者,了解这些基础知识可以帮助理解软件安全机制,从而更好地进行防护。通过阅读相关文献和实践操作,可以进一步提升对网络安全的理解和技能。

    零知识数字签名方案中HASH值长度的研究

    本文探讨了在零知识证明基础上构建的数字签名方案中HASH值长度的问题。这类方案通常声称使用较短的HASH值(例如64比特或72比特)就能实现较高的安全性(2^64或2^72)。然而,研究指出,在考虑到由签名者发起的生日...

    数字签名软件

    下面将详细阐述数字签名的相关知识点。 1. **数字签名的概念** 数字签名并非指我们日常生活中手写的签名,而是通过一种加密算法,将发送者的私钥应用于消息的哈希值上,生成的一段特殊数据。接收者可以通过发送者...

    公钥私钥加密解密数字证书数字签名详解.docx

    #### 一、基础知识概述 在探讨公钥私钥加密解密、数字证书以及数字签名之前,我们需要先理解几个核心概念。 **1. 密钥对:** - 在非对称加密技术中,存在两种密钥——私钥和公钥。私钥由密钥对的所有者持有且必须...

    最新数字签名证书生成器

    数字签名是一种用于验证电子文档完整性和发送者身份的技术,它在信息安全领域扮演着至关重要的角色。数字签名证书生成器是一款工具,旨在帮助用户创建个性化的、安全的数字签名证书,适用于那些希望确保电子邮件、...

    数字签名克隆

    1. **公钥基础设施(PKI)**:这是实现数字签名的基础框架,包括证书颁发机构(CA)、证书注册机构(RA)、证书存储和撤销列表(CRL)等组件,确保公钥的可靠分发和管理。 2. **哈希函数**:在数字签名过程中,数据...

    PDF数字签名(ITEXT+keytool)

    PDF数字签名是确保PDF文档完整性和来源可信的重要技术,它基于公钥基础设施(PKI)。在本项目中,我们使用了Java的ITEXT库来处理PDF文档,以及keytool工具来生成数字证书。以下是关于这些知识点的详细说明: 1. **...

    常见加解密及数字签名Demo

    在IT领域,加解密和数字签名是网络安全与数据保护的核心技术。...总之,加解密和数字签名是信息安全的基础,而"EncriptSample"提供的示例将有助于开发者在实践中掌握这些技术,为构建安全的网络环境添砖加瓦。

    一个简易的数字签名系统

    标题 "一个简易的数字签名系统" 提到的核心概念是数字签名,它在信息安全领域中扮演着至关重要的角色。数字签名是一种用于验证数据完整性和发送者身份的技术,它结合了密码学中的散列函数(如MD5)和非对称加密算法...

    数字证书签名工具(含源码)

    在数字签名过程中,发送者使用私钥对数据的哈希值进行加密,形成数字签名,接收者则使用发送者的公钥解密这个签名,并重新计算原始数据的哈希值进行对比,以确认数据未被篡改且发送者身份可靠。 在提供的文件名列表...

    看图片 读故事:轻松理解数字签名和数字证书 pdf

    《看图片 读故事:轻松理解数字签名和数字证书》一文通过生动的故事和直观的图像,深入浅出地解析了数字签名与数字证书的概念及其工作原理,为读者提供了清晰的思维导图,帮助理解这一复杂的IT安全领域知识。...

Global site tag (gtag.js) - Google Analytics