消息摘要和数字签名(Java简单实现)
摘要:
本文主要对数字签名和消息摘要进行简要介绍,并通过java实现基本流程。
概念介绍:
消息摘要
一个消息摘要是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于 SHA1 是产生一个 20 字节的二进制数组)。
消息摘要有两个基本属性:
两个不同的报文难以生成相同的摘要
难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要
代表:美国国家标准技术研究所的 SHA1 和麻省理工学院 Ronald Rivest 提出的 MD5
非对称算法与公钥体系
1976 年,Dittie 和 Hellman 为解决密钥管理问题,在他们的奠基性的工作"密码学的新方向"一文中,提出一种密钥交换协议,允许在不安全的媒体上通过通讯双方交换信息,安全地传送秘密密钥。在此新思想的基础上,很快出现了非对称密钥密码体制,即公钥密码体制。在公钥体制中,加密密钥不同于解密密钥,加密密钥公之于众,谁都可以使用;解密密钥只有解密人自己知道。它们分别称为公开密钥(Public key)和秘密密钥(Private key)。
迄今为止的所有公钥密码体系中,RSA 系统是最著名、最多使用的一种。RSA 公开密钥密码系统是由 R.Rivest、A.Shamir 和 L.Adleman 俊教授于 1977 年提出的。RSA 的取名就是来自于这三位发明者的姓的第一个字母
数字签名
所谓数字签名就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行 RSA 算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。
代表:DSA
JAVA实现:
对消息进行消息摘要处理(SHA-1):
java.security.MessageDigest alga= java.security.MessageDigest.getInstance("SHA-1");
alga.update(myinfo.getBytes());
byte[] digesta=alga.digest();
消息发送方生成密钥组关键代码:
java.security.KeyPairGenerator keygen = java.security.KeyPairGenerator.getInstance("DSA");
keygen.initialize(512);
KeyPair keys = keygen.genKeyPair();// 生成密钥组(包括私钥和公钥)
PublicKey pubkey = keys.getPublic();
PrivateKey prikey = keys.getPrivate();
消息发送方通过私钥对信息进行数字签名:
java.security.Signature signet = java.security.Signature.getInstance("DSA");
signet.initSign(myprikey); //通过私钥初始化数字签名
signet.update(myinfo.getBytes()); //写入要发送信息的字节数组
byte[] signed = signet.sign(); // 对信息的数字签名
消息接收方对生成的数字签名通过公钥进行验签:
java.security.Signature signetcheck = java.security.Signature.getInstance("DSA");
signetcheck.initVerify(pubkey); //通过公钥初始化验签
signetcheck.update(info.getBytes()); //对收到的信息进行写入
signetcheck.verify(signed);//验签,signed为上面私钥加密后的数字签名
测试代码:
消息摘要:
package javaTest;import java.security.MessageDigest;public class MyDigest {public static void main(String[] args) {MyDigest my=new MyDigest();my.testDigest();}public void testDigest(){try {String myinfo="我的测试信息";MessageDigest alga= MessageDigest.getInstance("SHA-1");alga.update(myinfo.getBytes());byte[] digesta=alga.digest();System.out.println("本信息摘要是 :"+byte2hex(digesta));// 通过某种方式传给其他人你的信息 (myinfo) 和摘要 (digesta) 对方可以判断是否更改或传输正常MessageDigest algb=MessageDigest.getInstance("SHA-1");algb.update(myinfo.getBytes());if (algb.isEqual(digesta,algb.digest())) {System.out.println("信息检查正常");}else{System.out.println("摘要不相同");}}catch (java.security.NoSuchAlgorithmException ex) {System.out.println("非法摘要算法");}}public String byte2hex(byte[] b) // 二行制转字符串{String hs="";String stmp="";for (int n=0;n<b.length;n++){stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));if (stmp.length()==1) hs=hs+"0"+stmp;else hs=hs+stmp;if (n<b.length-1) hs=hs+":";}return hs.toUpperCase();}
}
数字签名:
package javaTest;import java.security.*;
import java.security.spec.*;public class testdsa {public static void main(String[] args) throws java.security.NoSuchAlgorithmException,java.lang.Exception {testdsa my = new testdsa();my.run();}public void run() {// 数字签名生成密钥// 第一步生成密钥对 , 如果已经生成过 , 本过程就可以跳过 ,// 对用户来讲 myprikey.dat 要保存在本地// 而 mypubkey.dat 给发布给其它用户if ((new java.io.File("myprikey.dat")).exists() == false) {if (generatekey() == false) {System.out.println("生成密钥对败");return;};}// 第二步 , 此用户// 从文件中读入私钥 , 对一个字符串进行签名后保存在一个文件 (myinfo.dat) 中// 并且再把 myinfo.dat 发送出去// 为了方便数字签名也放进了 myifno.dat 文件中 , 当然也可分别发送try {java.io.ObjectInputStream in = new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));PrivateKey myprikey = (PrivateKey) in.readObject();in.close();String myinfo = "这是我的信息"; // 要签名的信息// 用私钥对信息生成数字签名java.security.Signature signet = java.security.Signature.getInstance("DSA");signet.initSign(myprikey);signet.update(myinfo.getBytes());byte[] signed = signet.sign(); // 对信息的数字签名System.out.println("signed( 签名内容 )=" + byte2hex(signed));// 把信息和数字签名保存在一个文件中java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat"));out.writeObject(myinfo);out.writeObject(signed);out.close();System.out.println("签名并生成文件成功");} catch (java.lang.Exception e) {e.printStackTrace();System.out.println("签名并生成文件失败");}// 第三步// 其他人通过公共方式得到此户的公钥和文件// 其他人用此户的公钥 , 对文件进行检查 , 如果成功说明是此用户发布的信息 .try {java.io.ObjectInputStream in = new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));PublicKey pubkey = (PublicKey) in.readObject();in.close();System.out.println(pubkey.getFormat());in = new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat"));String info = (String) in.readObject();byte[] signed = (byte[]) in.readObject();in.close();java.security.Signature signetcheck = java.security.Signature.getInstance("DSA");signetcheck.initVerify(pubkey);signetcheck.update(info.getBytes());if (signetcheck.verify(signed)) {System.out.println("info=" + info);System.out.println("签名正常");} else System.out.println("非签名正常");} catch (java.lang.Exception e) {e.printStackTrace();}}// 生成一对文件 myprikey.dat 和 mypubkey.dat--- 私钥和公钥 ,// 公钥要用户发送 ( 文件 , 网络等方法 ) 给其它用户 , 私钥保存在本地public boolean generatekey() {try {java.security.KeyPairGenerator keygen =java.security.KeyPairGenerator.getInstance("DSA");keygen.initialize(512);KeyPair keys = keygen.genKeyPair();// 生成密钥组PublicKey pubkey = keys.getPublic();PrivateKey prikey = keys.getPrivate();java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat"));out.writeObject(prikey);out.close();System.out.println("写入对象 prikeys ok");out = new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat"));out.writeObject(pubkey);out.close();System.out.println("写入对象 pubkeys ok");System.out.println("生成密钥对成功");return true;} catch (java.lang.Exception e) {e.printStackTrace();System.out.println("生成密钥对失败");return false;}}public String byte2hex(byte[] b) {String hs = "";String stmp = "";for (int n = 0; n < b.length; n++) {stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));if (stmp.length() == 1) hs = hs + "0" + stmp;else hs = hs + stmp;if (n < b.length - 1) hs = hs + ":";}return hs.toUpperCase();}
}
消息摘要和数字签名(Java简单实现)相关推荐
- 【Kotlin学习之旅】使用Kotlin实现常见的对称加密、非对称加密、消息摘要、数字签名的demo
文章目录 Demo 介绍 一.对称加密 二.非对称加密 三.消息摘要 四.数字签名 五.Demo地址 Demo 介绍 使用Kotlin实现常见的对称加密.非对称加密.消息摘要.数字签名的demo 一. ...
- 对称加密、非对称加密、RSA、消息摘要、数字签名、数字证书与 HTTPS 简介
文章目录 1.加密算法简介 1.1 对称加密(Symmetric Key Algorithms) 1.2 非对称加密(Asymmetric Key Algorithms) 1.3 非对称加密 RSA ...
- 信息安全管理——消息摘要与数字签名
1.实验目的 (1)了解哈希/散列/杂凑函数的特点: (2)掌握常见HASH函数基本原理: (3)理解数字签名的基本原理. 2.实验内容 (1)文件/文本哈希值计算: (2)HMAC验证: (2)数字 ...
- 对称加密、非对称加密、数字签名、消息摘要的简单学习
对称加密.非对称加密.数字签名.消息摘要的简单学习 前言 对称加密算法 DES 特点: 为什么不使用: 3DES(Triple DES 或者 DESede) 特点: 使用场景: 为什么不用: AES( ...
- 基于HTTP在互联网传输敏感数据的消息摘要、签名与加密方案
一.关键词 HTTP,HTTPS,AES,SHA-1,MD5,消息摘要,数字签名,数字加密,Java,Servlet,Bouncy Castle 二.名词解释 数字摘要:是将任意长度的消息变成固定长度 ...
- 【网络安全期末复习2】消息认证与数字签名的过程图与原理
消息认证: 过程图示: 原理: 首先发送方使用密钥K对消息进行Hash加密生成消息摘要 发送方将消息和消息摘要打包通过公开信道发送给接收方 接收方接收到消息和消息摘要 接收方对使用密钥K对消息进行Ha ...
- 加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
本文讲解对称加密.非对称加密.消息摘要.MAC.数字签名.公钥证书的用途.不足和解决的问题. 0.概述 当发送方A向接收方B发送数据时,需要考虑的问题有: 1.数据的安全性. 2.数据的完整性,即数据 ...
- 消息摘要(Digest),数字签名(Signature),数字证书(Certificate)是什么?
1. 消息摘要(Digest) 1. 什么是消息摘要? 对一份数据,进行一个单向的 Hash 函数,生成一个固定长度的 Hash 值,这个值就是这份数据的摘要,也称为指纹. 2. 摘要算法 常见的摘要 ...
- java中的数据加密1 消息摘要
消息摘要(Message Digest) 又称为数字摘要(Digital Digest).它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生.如果消息在途中 ...
最新文章
- PS Material 漫谈 六: Material Availability Check
- 解决 后台播放音乐时,设置手机铃声,后台音乐不会暂停
- jQuery.ajax实现根据不同的Content-Type做出不同的响应
- 《数据结构与算法之美》学习汇总
- mysql数据库python基础知识_python学习之Mysql数据库编程基础知识介绍
- Web.py Cookbook 简体中文版 - 在webpy中使用Cheetah模板引擎
- mysql maven 自动生成_【图文经典版】maven自动生成dao层
- eLife:一个开源、高性能的自动睡眠分期工具
- Java类型转换简单运用
- 利用ODI将Oracle US7ASCII编码的数据库迁移至UTF8编码数据库
- 通过STM32CUBEMX生成RTOS系统运用(一)
- Spacy分词php,Spacy简单入门
- c程序语言中long,C语言long
- 4.15 最短路 题
- Flash鼠绘入门第八课:绘制脱俗荷花-Flash鼠绘脱俗荷花教程(6)
- JavaWeb学习第二十七天——项目实例
- pdf文本和表格处理——pdfplumber的安装与简单使用
- git如何提交空目录
- [NESCAFE27] 探险队
- 判断三极管电路能否放大交流信号