密码学研究-数字签名
引入:
提到签名,大家都不陌生,大家知道,重大的文件一般都要领导签名,来确保这个文件的真实有效。而一些比较重要的合同,比如买房的购房合同,都要盖“骑缝章”,这个骑缝章,就是盖在2页纸中间的印章,它也代表了签名,它用来保证你合同的完整性。所以说,签名在日常生活中非常重要,它主要用来保证了信息的完整性。同样,计算机世界也对这个签名过程进行了模拟,数字签名的概念由此而生。
数字签名的过程:
一般数字签名的过程分为2个,一个是签名过程,一个是验证过程。
数字签名的基本过程如下:
(1)发送方用指定的散列函数作用于原始报文,计算出原始报文的原始摘要。
(2)发送方选用非对称的密钥中的私钥对原始摘要进行加密,得到加密后的原始摘要
(3)发送方构造一个报文(SignedObject对象),将原始报文添加在其中
(4)发送方将第(2)步产生的加密后的原始摘要也添加到第(3)步构建的报文中。
这个报文通过不可信任的网络传输到接收端。
(5)接受端从报文中取出原始报文,用约定的散列函数计算出摘要值,记为D1。
(6)接受端从报文中取出加密后的原始摘要,用公钥解密,还原出摘要值,记为D2。
(7)接收端比较D1和D2的值,如果相同,那么认为这个原始报文是可靠的。
实践:
我们java.security包提供了一组API 来表示数字签名的过程,这个核心类就是Signature类,它提供了一组方法来签名和验证,我们这里就给出这个类的一般用法:
我们先建立一个工具类,这个类是个单例,它主要是提供了一些封装方法来封装签名和验证的过程,因为签名和验证都需要公钥-私钥对,所以它包含了这对钥匙的产生逻辑。
package com.charles.signaturestudy;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;
import java.security.SignatureException;
import java.security.SignedObject;
/**** Description: 这个工具类提供了一组方法来操作Signature类,它主要可以对签名进行一些操作** @author charles.wang* @created Oct 28, 2013 11:11:52 AM**/
public class SignatureUtil {private static SignatureUtil instance = null;//公钥私钥对private KeyPair keyPair = null;//数字签名类private Signature signature = null;/*** 私有构造器,用指定的算法来初始化Signature类* @param algorithm*/private SignatureUtil(String algorithm) {try {// 实例化KeyPairGenerator对象,并且指定算法为DSAKeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 初始化 KeyPairGenerator对象keyPairGenerator.initialize(1024);// 生成Keypair对象keyPair = keyPairGenerator.generateKeyPair();// 实例化Signature对象,这个对象提供一组动作方法类操作签名signature = Signature.getInstance(keyPairGenerator.getAlgorithm());} catch (NoSuchAlgorithmException ex) {keyPair = null;signature = null;}}/*** 单例的工厂方法,用于创建SignatureUtil的实例** @return*/public static SignatureUtil getInstance(String algorithm) {if (instance == null)instance = new SignatureUtil(algorithm);return instance;}/*** 用私钥对指定的原始数据进行签名* @param data 被签名的数据* @return*/public byte[] signWithPrivateKey(byte[] data) {try {// 私钥完成签名,所以这里用私钥初始化用于签名的Signaturesignature.initSign(keyPair.getPrivate());// 更新要签名的原始数据signature.update(data);// 返回签名的内容return signature.sign();} catch (InvalidKeyException ie) {ie.printStackTrace();return null;} catch (SignatureException se) {se.printStackTrace();return null;}}/*** 用公钥对指定的原始数据和签名进行验证* @param data* @param sign* @return*/public boolean verifySignedObjectWithPublicKey(byte[] data, byte[] sign) {try {// 公钥完成验证,所以这里用公钥初始化用于验证的Signaturesignature.initVerify(keyPair.getPublic());// 更新要验证的原始数据signature.update(data);// 验证签名,获得验证结果return signature.verify(sign);} catch (InvalidKeyException ie) {ie.printStackTrace();return false;} catch (SignatureException se) {se.printStackTrace();return false;}}}
然后我们提供了一个演示类,它的过程如下:
先给出原始数据,再用我们的API对其进行数字签名(sign),并且打印出数字签名的内容,然后我们用我们的API来验证(verify)数字签名的有效性。
package com.charles.signaturestudy;
/**** Description: 这个类用来演示数字签名的使用方法** @author charles.wang* @created Oct 28, 2013 10:37:32 AM**/
public class SignatureDemo {public static void main(String [] args) throws Exception{//SignatureUtil是我们开发的一组动作类,它对于Signature类进行了进一步的封装//它提供了我们可以对数字签名完成的一组动作SignatureUtil sigUtil = SignatureUtil.getInstance("DSA");//原始数据对象String content="被测试的原始数据对象";//打印出原始数据System.out.println("原始数据为:"+content);//将原始数据对象转为字节数组byte[] rawData = content.getBytes();System.out.println("\n开始对原始数据签名...");//进行签名,返回签名的内容byte[] sign = sigUtil.signWithPrivateKey(rawData);System.out.println("签名内容(16进制)为:"+byte2hex(sign));System.out.println("\n开始对签名内容验证...");//进行验证,对验证结果进行分析boolean status = sigUtil.verifySignedObjectWithPublicKey(rawData, sign);if(status==true){System.out.println("验证结果,此签名是有效的");}else{System.out.println("验证结果,此签名是无效的");}}/*** 将二进制转为字符串的形式** @param b* @return*/protected static String byte2hex(byte[] b) // 二行制转字符串{// 最终要转化的16进制字符串StringBuilder hexString = new StringBuilder();// 处理每个转化的当前字符串String tmpStr = "";for (int n = 0; n < b.length; n++) {// 将二进制转为16进制tmpStr = (Integer.toHexString(b[n] & 0XFF));// 如果当前转成的字符串只有一位长度的话,则前面补0,然后加上当前转换值if (tmpStr.length() == 1) {hexString.append("0").append(tmpStr);}// 否则,,则直接将当前转换值tmpStr附加在hexString后面elsehexString.append(tmpStr);// 如果没有到byte[]的尾部,则中间用冒号分开,最后一个后面不用加冒号if (n < b.length - 1)hexString.append(":");}return hexString.toString().toUpperCase();}
}
最后,我们运行这个实例程序,然后可以清晰的看出以上的过程:
转载于:https://blog.51cto.com/supercharles888/1316192
密码学研究-数字签名相关推荐
- 在密码学研究方面不断创新突破—— 女密码学家的成功密码
随着信息技术的大规模应用和数字经济的加速发展,密码学的重要性日益凸显.近年来,一位土生土长的中国女密码学家备受瞩目,她就是荣获2019年未来科学大奖的首位女科学家,清华大学和山东大学双聘教授王小云. ...
- 计算机信息安全密码学研究,密码学是对信息安全各方面的研究,能够解决所有信息安全的问题。() - 试题答案网问答...
相关题目与解析 密码学作为信息安全的关键技术,其安全目标主要包括三个非常重要的方面:保密性.完整性和可用性.()是指所有资源只能由授权方式以授权的方式进行修改,即信息未经授权不能进行改变的特性. 密码 ...
- 密码学研究-加密解密
引入: 现在我们来研究密码学的加密解密过程,这个十分重要,因为它是明文到密文的桥梁,从类型上分,我们又分为加密解密字符串和加密解密文件,我们这文章就讲解这些细节,主要的核心类是Cipher类. 实践: ...
- 密码学研究-Provider
引入: Provider 是研究密码学的第一步,它表示了对于JAVA安全框架的一种实现.对于JDK,它有许多默认的实现,当然了,你也可以不满意其默认的实现,而使用第三方或者自己根据API 开发SPI ...
- 区块链中的密码学之数字签名方案(十二)
1. 前言 类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性( integrity)和来源( 或不可抵赖,non-repudiation). 一个典型的场景是,A 要发给 B 一个 ...
- 密码学之数字签名是什么
数字签名是什么? 原文网址:http://www.youdzone.com/signature.html 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂. ...
- 现代密码学:数字签名
文章目录 数字签名 1.数字签名要解决的问题 2.数字签名的安全模型.性质 3.RSA签名算法以及存在的安全问题 4.ElGamal签名算法以及主要的问题 5.特殊的签名算法以及适应的应用场景 数字签 ...
- 现代密码学之数字签名
Digital Signature 介绍 数字签名方案 数字签名性质 数字签名的安全概念 攻击模型 RSA签名体制 Digital Signature Algorithm (DSA) Referenc ...
- 【go密码学】-数字签名
介绍 数字签名就是只有消息的发送者才能产生的别人无法伪造的一段数字串,这段数字串是对信息真实性的有效证明. 发送者:生成签名 接受者:验证签名 非对称密码机制 非对称加密中,公钥用于加密,私钥用于解密 ...
最新文章
- TensorFlow(3)张量与变量
- 在HYPER-V中利用差异磁盘和SYSPREP技术安装多个WINDOWS 2008
- codeforces-73C. LionAge II
- word python 域 操作_python实现在windows下操作word的方法
- 微信小程序时间转换成时间戳、获取当前时间戳、获取当前时间、时间戳加减
- bat 变量 文件内容第一行_VBA基础入门(38)FSO生成bat文件后执行的实例
- 的硬件报错_工程师经验:78%的硬件失效罪魁祸首 —— 焊接问题
- 【Python】pip模块管理Python包的常用方法
- mapreduce引用第三方jar
- 音视频开发(21)---基于RTMP推送实时AAC+H264流(二)
- 多核处理器_游戏爱好者的福音!AMD全新一代高性能多核处理器3950X
- Excel中 使用链接 批量导入图片
- vb.net视频总结
- 哪吒票房一路飙升100行python代码抓取豆瓣短评
- 通用计算机的通用性如何体现,计算机的通用性表现在哪方面
- c 语言 如何优化cpu占用率,C#程序优化-有效减少CPU占用率
- 《HelloGitHub》第 40 期
- java写zip后无法读取
- 【云原生】4.2 DevOps 精讲篇
- win11疑难解答怎么进