demo:使用数字证书进行数字签名和加密,解密
下边是一个使用数字证书来进行数字签名(以及验证签名信息),以及非对称加密的一个demo,代码中使用PKCS12类型的keystore(包含私钥)使用JKS或者其他类型的keystore也是可以的,就是在加载keystore的时候有一些不同
关于公钥,私钥和数字签名的一个比较容易的理解可以参考这篇文章:http://blog.csdn.net/21aspnet/article/details/7249401
下边直接上代码:
package com.jiaoyiping.passwordmanager.pki;
/*
* Created with Intellij IDEA
* USER: 焦一平
* Mail: jiaoyiping@gmail.com
* Date: 2016/10/2
* Time: 12:05
* To change this template use File | Settings | Editor | File and Code Templates
*/ import org.apache.commons.codec.binary.Hex; import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey; /**
* 签名和验证签名
*/
public class TestSign {
//证书密码
private static final String PASSWORD = "123456";
//证书别名
private static final String ALIAS = "test"; public static void main(String[] args) throws Exception { KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream("D:\\test.p12"), PASSWORD.toCharArray());
Certificate x509Certificate = keyStore.getCertificate(ALIAS); encrypt(x509Certificate.getPublicKey(), (PrivateKey) keyStore.getKey(ALIAS, PASSWORD.toCharArray()));
System.out.println("==============================================================================");
sign(keyStore);
} /**
* 签名和验证签名
*
* @throws Exception
*/
public static void sign(KeyStore keyStore) throws Exception { X509Certificate x509Certificate = (X509Certificate) keyStore.getCertificate(ALIAS);
//需要签名的信息的内容
String message = "中国移动通信研究院";
//获取CA证书私钥
PrivateKey priKey = (PrivateKey) keyStore.getKey(ALIAS, PASSWORD.toCharArray());
System.out.println("私钥:" + Hex.encodeHexString(priKey.getEncoded())); //用私钥签名
Signature signature = Signature.getInstance("NONEwithRSA");
signature.initSign(priKey);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);
dataOutputStream.writeUTF(message);
signature.update(byteArrayOutputStream.toByteArray());
String result = Hex.encodeHexString(signature.sign());
System.out.println("签名之后的内容:" + result); //用公钥来验证签名
Signature signature1 = Signature.getInstance("NONEwithRSA");
signature1.initVerify(x509Certificate.getPublicKey());
System.out.println("公钥:" + Hex.encodeHexString(x509Certificate.getPublicKey().getEncoded()));
ByteArrayOutputStream byteArrayOutputStream1 = new ByteArrayOutputStream();
DataOutputStream dataOutputStream1 = new DataOutputStream(byteArrayOutputStream1);
dataOutputStream1.writeUTF(message);
signature1.update(byteArrayOutputStream1.toByteArray()); System.out.println("验证结果: " + signature1.verify(Hex.decodeHex(result.toCharArray())));
} /**
* 加密和解密
*
* @param publicKey
* @param privateKey
* @throws Exception
*/
public static void encrypt(PublicKey publicKey, PrivateKey privateKey) throws Exception { String input = "慧与(中国)有限公司";
Cipher cipher = Cipher.getInstance("RSA");
RSAPublicKey pubKey = (RSAPublicKey) publicKey;
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKey;
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherText = cipher.doFinal(input.getBytes());
//加密后的内容
System.out.println("加密之后的内容:" + Hex.encodeHexString(cipherText)); //解密
cipher.init(Cipher.DECRYPT_MODE, rsaPrivateKey);
byte[] plainText = cipher.doFinal(cipherText);
System.out.println("解密之后的内容 : " + new String(plainText)); } }
运行的结果:
demo:使用数字证书进行数字签名和加密,解密的更多相关文章
- https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名
声明:本文章已授权公众号Hollis转载,如需转载请标明转载自https://www.cnblogs.com/wutianqi/p/10654245.html(安静的boy) 一.为什么要使用http ...
- PHP通过OpenSSL生成证书、密钥并且加密解密数据,以及公钥,私钥和数字签名的理解
一.公钥加密假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个文 ...
- SSL身份认证原理 - 目标: 搞清楚数字证书和数字签名的关系
1 概述 1.1 产生背景 基于万维网的电子商务和网上银行等新兴应用,极大地方便了人们的日常生活,受到人们的青睐.由于这些应用都需要在网络上进行在线交易,它们对网络通信的安全性提出了更高的要求.传 ...
- 理解 HTTPS 工作原理(公钥、私钥、签名、数字证书、加密、认证)(转)
本文摘录参考: 细说 CA 和证书(主要讲解 CA 的使用) 数字签名是什么?(简单理解原理) 深入浅出 HTTPS 工作原理(深入理解原理) HTTP 协议由于是明文传送,所以存在三大风险: 1.被 ...
- 一篇读懂HTTPS:加密原理、安全逻辑、数字证书等
1.引言 HTTPS(全称: Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.本文,就来深入介绍下其 ...
- Java加密解密与数字证书的操作
1 keytool命令总结 一.创建数字证书 交互模式 使用默认的密钥库.keystore(文件夹是c: Documents and Settingusername)和算法(DSA) keytool ...
- [区块链|非对称加密] 对数字证书(CA认证)原理的回顾
摘要:文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的 ...
- C#编程总结(十一)数字证书
C#编程总结(十一)数字证书 之前已经通过文章介绍了数字证书的基础知识,包括加密和数字签名. 具体可见: 1.C#编程总结(七)数据加密——附源码 2.C#编程总结(八)数字签名 这里来讲述数字证书的 ...
- [转载]JavaEE学习篇之——网络传输数据中的密码学知识以及Tomcat中配置数字证书EE
原文链接:http://blog.csdn.net/jiangwei0910410003/article/details/21716557 今天是学习JavaWeb的第二天,我们来了解什么呢?就了解一 ...
随机推荐
- 第一篇 一步一步看透C++
毕业快一年半了,这些时候,都是在底层方面做的一些工作,虽然内核的C也实现了C++中的一些抽象机制,面向对象,继承,多态,封装等等,但是,想着大学里面,电子类的学习,都是偏向底层的,有过C++的 ...
- php 批量过滤关键字
代码: public function filterComment($content){ $string = "正品.真品.最.史上 .唯一.一流.独一无二.仅.独家.首.冠军. 国家级.领 ...
- Objective-C 语法之 NSURL
有时我们需要获取请求地址的相关信息,这时我们就可以用 NSURL 的一些方法操作来获取它. 需要注意的一点是:请求地址里可能存在特殊字符或中文,为了正确获取信息,建议使用 stringByAdding ...
- Android学习之——如何将GridView内嵌在ScrollView中
最近在做一个项目,有一个需求是在ScrollView中内嵌一个GridView. 刚开始,我是以为能直接内嵌在里面: <ScrollView android:layout_width=" ...
- 提高OCR质量的技巧之区域未正确检测
ABBYY FineReader会在识别前分析页面图像并检测图片上不同类型的区域,如文本.图片.背景图片.表格和条形码区域,此分析确定识别的区域和识别顺序.在用户界面中,不同的区域类型按其边界的颜色进 ...
- 跨域、跨服务器调用时候session丢失的问题
最近新进一个公司,做的项目是手机支付系统.由于涉及到金钱相关的,所以安全性要求特别的高.项目分了很多个子系统,在部署(测试)的时候是每个Tomcat上面只放一个子系统.比如现在有5个子系统,那么就会对 ...
- 本地存储(LocalStorage、SessionStorage、Web SQL Database、Indexed DB)
https://www.cnblogs.com/SeeYouBug/p/6127001.html https://blog.csdn.net/inter_peng/article/details/49 ...
- IIS------如何占用80端口
如何占用80端口 请看我的一篇随笔: https://www.cnblogs.com/tianhengblogs/p/9292347.html
- vuejs使用FormData对象,ajax上传图片文件
我相信很多使用vuejs的朋友,都有采用ajax上传图片的需求,因为前后端分离后,我们希望都能用ajax来解决数据问题,传统的表单提交会导致提交成功后页面跳转,而使用ajax能够无刷新上传图片等文件. ...
- Docker应用之镜像
一.Docker包括三个基本概念 1.镜像(Image):Docker镜像是一个只读模板,例如一个镜像可以包含完整的Linux系统环境,里面仅仅安装了Apache或用户其他应用程序:镜像可以用来创建D ...