- 浏览: 230073 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 505Set接口的实现类HashSet/TreeSet,它们内部都是 ... -
枚举中valueOf用法
2018-01-14 11:21 4490Enum的特征如下: 1.它不能有public的构造函数,这样 ... -
mybatis源码学习总结-class.getResource方法与claasloader.getResource方法的区别
2018-01-14 10:49 1013Class.getResources(String path) ... -
使用自定义注解搭建简单框架
2017-05-01 00:54 516本文主要介绍如何使用Java运行时级别的注解配合反射来搭建框架 ... -
java注解处理器
2017-04-30 17:43 647注解处理器: Java SE5扩 ... -
理解注解中的@Inherited
2017-04-30 16:06 32353@Inherited: @Inherited 元注解是一 ... -
JAVA注解总结
2017-04-30 12:59 548元注解: 元注解 ... -
java泛型理解2
2017-01-07 22:54 461泛型类型注意细节: 1.泛型类型变量不能是基本数据类型 比如, ... -
JAVA泛型理解
2017-01-07 22:33 471泛型类型的擦除: ArrayList< ... -
逻辑运算与移位运算
2012-11-27 14:56 1264源码:正数的补码与原码相同例+7 源码:00000111 补码 ... -
JJd
2012-05-10 20:02 0//Access-Request报文 创建message ... -
HashMap原理
2012-04-29 17:27 1792概述: HashMap是基于哈希表的Map接口的非同步实现。此 ... -
使用内部类有什么好处
2012-03-17 12:41 1294使用内部类在java编程高级设计中是必须的,它能使你的代码更加 ... -
关于a& 0xff的运算
2011-11-21 11:23 1408byte是一个有符号数可以表示-128~+127,但是作为一个 ... -
java调用Windows命令行
2011-11-20 21:32 1694java来调用windows的命令,一般情况下下面两行代码即可 ... -
parseInt(String s, int radix)用法介绍
2011-11-19 22:13 6278parseInt(String s, int radix) , ... -
深入理解String.getBytes()中编码问题
2011-11-04 15:25 2522查看jdk的源码得知,String.getBytes()的源码 ...
相关推荐
数字签名是密码学基础课件中的一个重要知识点,它在信息安全、身份认证、数据完整性、不可否认性和匿名性等方面都有着重要的应用。数字签名是实现认证的重要工具,可以证明个人的身份,在大型网络安全通信中的密钥...
本论文对基于椭圆曲线和双线性对的数字签名的研究进行了系统的总结和分析,为读者提供了一个全面的了解基于椭圆曲线和双线性对的数字签名的知识体系。 在研究中,我们提出了基于椭圆曲线的代理盲多重签名方案和基于...
群签名是一种数字签名方式,但不需要群中的所有成员对被签名文件进展签名。 9. 商用密码产品:任何单位或者个人都可以使用商用密码产品。错误 商用密码产品是指经批准的密码产品,但是并不是任何单位或者个人都...
介绍PKI基础知识,侧重介绍电子签名和数字信封,内容浅显易懂
Word 基础教程合集一:为宏添加 VBA 项目数字证书签名 本文档讲解了如何为 Word 宏添加 VBA 项目数字证书签名,以提高 Word 宏的安全性和效率。主要分为两个步骤:首先,设置 Word 宏的安全级别为“中”,并编写一...
了解 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的使用方式和原理,提升对Python技术的理解和熟练度。具体而言,我们将掌握...
PKI基础知识培训资料,从密码学基础开始,讲述(非)对称加解密、摘要、组合密码技术(数字签名、数字信封)等密码技术。PKCS7结构规范中的数字签名结构(RSA和国密)以及PKCS1规范文档,X509标准,国密密码算法相关标准。...
逻辑上的措施,即研究开发有效的网络安全技术,例如,安全协议、密码技术、数字签名、防火墙、安全管理、安全审计等。 计算机网络安全基础知识全文共57页,当前为第9页。 三.知识链接: 计算机网络安全是指保持网络...
前文 “[网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)” 分享了数字签名的原理知识,这篇文章将详细解析数字签名,采用Signtool工具对EXE文件进行签名,接着利用Asn1View、PEVie...
逻辑上的措施,即研究开发有效的网络安全技术,例如,安全协议、密码技术、数字签名、防火墙、安全管理、安全审计等。 计算机网络安全基础知识全文共57页,当前为第9页。 三.知识链接: 计算机网络安全是指保持网络...
数字签名技术是实现交易安全的核心技术之一,它的实现基础就是加密技术。以往的书信或文件是根据亲笔签名或印章来证明其真实性的。这就是数字签名所要解决的问题。 数字签名由公钥密码发展而来,它在网络安全,包括...
* 加密技术:介绍加密技术的基本概念,包括对称加密、非对称加密、数字签名等。 6. 人机交互 * 人机交互基础:介绍人机交互的基本概念,包括人机交互模型、人机交互设计等。 * 图形用户界面:介绍图形用户界面的...
- 论文:涵盖了整个Java ASP Web系统的基础知识,设计意图、需求概述、系统结构与设计哲学、相关技术的深入探索等。学生可以从论文中理解项目的全局构想和关键设计决策。 - 设计文档:详细梳理了系统的构建过程,...
详细讲解PKI的应用技术,以及原理。对于数字签名的认识 ,以及数字证书的作用及使用原理。
密码学应用基础概述是信息安全领域的基础知识,旨在保护机密性、完整性、鉴别、不可否认性和授权等安全需求。本文将从密码学应用的基础知识开始,逐步深入探讨密码学应用的各种解决方案和方法。 一、机密性加密技术...
PKI 是一种公钥基础结构,用于身份验证、加密和数字签名等目的。PKI 的应用包括数字证书、加密文件系统、IPsec 等。 11. 证书的颁发流程 证书的颁发流程包括申请、审核、颁发和撤销等步骤。 12. CA 的层次结构 CA ...
引入密钥分配中心,违背了密码学的精髓。数字签名方案问题:能否设计出一种方案,就像手写签名一样,确保数字签名是出自某一特定的人,并且各方对此没有异议。While
Chapter 1: Cryptography Basics对密码学的基础知识进行了介绍,包括密码学的基本概念、密码学的应用、数字签名等内容。密码学的基础知识是理解PKI的基础,而PKI是基于密码学的技术堆栈,因此,了解密码学的基础知识...