- 浏览: 233804 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (102)
- 开源软件 (1)
- 并发 (14)
- WEB (1)
- NIO (4)
- Socket (5)
- 应用服务器 (4)
- 集群 (0)
- 数据库 (1)
- JAVA基础 (17)
- 开源框架 (2)
- 业务知识 (1)
- JVM (9)
- Windows (1)
- LINUX (0)
- Jquery (0)
- JMS (0)
- Cache (0)
- Oracle (5)
- XML (0)
- EJB (0)
- WebService (0)
- Struts2 (1)
- Hibernate (1)
- Spring (0)
- 设计模式 (4)
- UML (0)
- JS (12)
- 网络爬虫 (0)
- 数据结构与算法 (1)
- EXT (1)
- DIV+CSS (2)
- 安全 (3)
- Android (9)
- LDAP (1)
- Mybatis (1)
最新评论
-
Dom_4j:
...
理解注解中的@Inherited -
s469799470:
demo少个ID
iframe父子页面交互问题 -
errorerror0:
...
iframe父子页面交互问题 -
errorerror0:
iframe父子页面交互问题 -
johnawm:
2012-12-18 wangshibei 写道CountD ...
CountDownLatch的使用
1.消息摘要
2.私钥加密
3.公钥加密
4.数字签名
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("签名验证失败!!"); } }
发表评论
-
深入学习EnumSet
2018-03-25 00:18 530Set接口的实现类HashSet/TreeSet,它们内部都是 ... -
枚举中valueOf用法
2018-01-14 11:21 4547Enum的特征如下: 1.它不能有public的构造函数,这样 ... -
mybatis源码学习总结-class.getResource方法与claasloader.getResource方法的区别
2018-01-14 10:49 1054Class.getResources(String path) ... -
使用自定义注解搭建简单框架
2017-05-01 00:54 553本文主要介绍如何使用Java运行时级别的注解配合反射来搭建框架 ... -
java注解处理器
2017-04-30 17:43 677注解处理器: Java SE5扩 ... -
理解注解中的@Inherited
2017-04-30 16:06 32423@Inherited: @Inherited 元注解是一 ... -
JAVA注解总结
2017-04-30 12:59 589元注解: 元注解 ... -
java泛型理解2
2017-01-07 22:54 490泛型类型注意细节: 1.泛型类型变量不能是基本数据类型 比如, ... -
JAVA泛型理解
2017-01-07 22:33 499泛型类型的擦除: ArrayList< ... -
逻辑运算与移位运算
2012-11-27 14:56 1291源码:正数的补码与原码相同例+7 源码:00000111 补码 ... -
JJd
2012-05-10 20:02 0//Access-Request报文 创建message ... -
HashMap原理
2012-04-29 17:27 1819概述: HashMap是基于哈希表的Map接口的非同步实现。此 ... -
使用内部类有什么好处
2012-03-17 12:41 1339使用内部类在java编程高级设计中是必须的,它能使你的代码更加 ... -
关于a& 0xff的运算
2011-11-21 11:23 1466byte是一个有符号数可以表示-128~+127,但是作为一个 ... -
java调用Windows命令行
2011-11-20 21:32 1745java来调用windows的命令,一般情况下下面两行代码即可 ... -
parseInt(String s, int radix)用法介绍
2011-11-19 22:13 6345parseInt(String s, int radix) , ... -
深入理解String.getBytes()中编码问题
2011-11-04 15:25 2568查看jdk的源码得知,String.getBytes()的源码 ...
相关推荐
以上提到的步骤和方法涵盖了数字签名的基础知识、禁用签名强制的操作流程以及针对特定产品的安装注意事项。这些知识点对于从事IT开发、系统管理或对安全有高要求的用户来说是非常重要的。正确地理解和执行这些操作,...
在使用IDSignMSO之前,用户需要了解数字证书的基础知识,包括公钥和私钥的概念,以及如何妥善保管私钥,因为私钥泄露将导致签名失去效力。同时,确保选择一个受信任的CA来签署证书,以提高软件的信誉度。 总结来说...
【RSA数字签名实现详解】 RSA数字签名是一种广泛应用于网络安全中的加密技术,它是基于RSA公钥...通过这个MATLAB项目,你不仅能够提升编程技能,还能巩固对密码学基础知识的理解,为未来从事相关工作打下坚实的基础。
1. `DES.cpp` 和 `DES.h`:这可能涉及到数据加密标准(DES)的实现,虽然不是直接与数字签名相关,但DES是早期广泛使用的对称加密算法,可以作为理解加密基础的参考。 2. `TestHashsign.cpp`:这个名字暗示它可能是...
在IT领域,加密、RSA数字签名以及数字证书是网络安全中至关重要的概念,它们共同构建了互联网上安全通信的基础。下面将详细阐述这些知识点,并结合"EncryptMethod"这一压缩包文件中的可能内容进行分析。 首先,加密...
下面将详细阐述数字签名的概念、功能以及免杀技术的相关知识。 首先,数字签名并不是我们日常生活中笔迹的电子化,而是通过加密算法在数据上附加的一种特殊信息,用于验证数据的完整性和发送者的身份。它结合了公钥...
RSA数字签名是一种在C++中实现的广泛应用的公钥加密...通过理解这些基础知识并结合适当的库,我们可以构建出能够安全有效地进行数字签名和验证的软件。在进行开发时,务必注意遵循最佳实践,确保系统的安全性和可靠性。
以下是一些关于Elgamal数字签名的关键知识点: 1. **公钥与私钥**: - Elgamal签名算法使用一对密钥:公钥和私钥。任何人都可以使用公钥对数据进行加密,但只有持有对应私钥的用户才能解密。在签名过程中,私钥...
【网络安全自学篇】PE文件逆向之什么是数字签名及Sign...对于网络安全初学者,了解这些基础知识可以帮助理解软件安全机制,从而更好地进行防护。通过阅读相关文献和实践操作,可以进一步提升对网络安全的理解和技能。
本文探讨了在零知识证明基础上构建的数字签名方案中HASH值长度的问题。这类方案通常声称使用较短的HASH值(例如64比特或72比特)就能实现较高的安全性(2^64或2^72)。然而,研究指出,在考虑到由签名者发起的生日...
下面将详细阐述数字签名的相关知识点。 1. **数字签名的概念** 数字签名并非指我们日常生活中手写的签名,而是通过一种加密算法,将发送者的私钥应用于消息的哈希值上,生成的一段特殊数据。接收者可以通过发送者...
#### 一、基础知识概述 在探讨公钥私钥加密解密、数字证书以及数字签名之前,我们需要先理解几个核心概念。 **1. 密钥对:** - 在非对称加密技术中,存在两种密钥——私钥和公钥。私钥由密钥对的所有者持有且必须...
数字签名是一种用于验证电子文档完整性和发送者身份的技术,它在信息安全领域扮演着至关重要的角色。数字签名证书生成器是一款工具,旨在帮助用户创建个性化的、安全的数字签名证书,适用于那些希望确保电子邮件、...
1. **公钥基础设施(PKI)**:这是实现数字签名的基础框架,包括证书颁发机构(CA)、证书注册机构(RA)、证书存储和撤销列表(CRL)等组件,确保公钥的可靠分发和管理。 2. **哈希函数**:在数字签名过程中,数据...
PDF数字签名是确保PDF文档完整性和来源可信的重要技术,它基于公钥基础设施(PKI)。在本项目中,我们使用了Java的ITEXT库来处理PDF文档,以及keytool工具来生成数字证书。以下是关于这些知识点的详细说明: 1. **...
在IT领域,加解密和数字签名是网络安全与数据保护的核心技术。...总之,加解密和数字签名是信息安全的基础,而"EncriptSample"提供的示例将有助于开发者在实践中掌握这些技术,为构建安全的网络环境添砖加瓦。
标题 "一个简易的数字签名系统" 提到的核心概念是数字签名,它在信息安全领域中扮演着至关重要的角色。数字签名是一种用于验证数据完整性和发送者身份的技术,它结合了密码学中的散列函数(如MD5)和非对称加密算法...
在数字签名过程中,发送者使用私钥对数据的哈希值进行加密,形成数字签名,接收者则使用发送者的公钥解密这个签名,并重新计算原始数据的哈希值进行对比,以确认数据未被篡改且发送者身份可靠。 在提供的文件名列表...
《看图片 读故事:轻松理解数字签名和数字证书》一文通过生动的故事和直观的图像,深入浅出地解析了数字签名与数字证书的概念及其工作原理,为读者提供了清晰的思维导图,帮助理解这一复杂的IT安全领域知识。...