下边是一个使用数字证书来进行数字签名(以及验证签名信息),以及非对称加密的一个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:使用数字证书进行数字签名和加密,解密的更多相关文章

  1. https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名

    声明:本文章已授权公众号Hollis转载,如需转载请标明转载自https://www.cnblogs.com/wutianqi/p/10654245.html(安静的boy) 一.为什么要使用http ...

  2. PHP通过OpenSSL生成证书、密钥并且加密解密数据,以及公钥,私钥和数字签名的理解

    一.公钥加密假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个文 ...

  3. SSL身份认证原理 - 目标: 搞清楚数字证书和数字签名的关系

    1  概述 1.1  产生背景 基于万维网的电子商务和网上银行等新兴应用,极大地方便了人们的日常生活,受到人们的青睐.由于这些应用都需要在网络上进行在线交易,它们对网络通信的安全性提出了更高的要求.传 ...

  4. 理解 HTTPS 工作原理(公钥、私钥、签名、数字证书、加密、认证)(转)

    本文摘录参考: 细说 CA 和证书(主要讲解 CA 的使用) 数字签名是什么?(简单理解原理) 深入浅出 HTTPS 工作原理(深入理解原理) HTTP 协议由于是明文传送,所以存在三大风险: 1.被 ...

  5. 一篇读懂HTTPS:加密原理、安全逻辑、数字证书等

    1.引言 HTTPS(全称: Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.本文,就来深入介绍下其 ...

  6. Java加密解密与数字证书的操作

    1 keytool命令总结 一.创建数字证书 交互模式 使用默认的密钥库.keystore(文件夹是c: Documents and Settingusername)和算法(DSA) keytool  ...

  7. [区块链|非对称加密] 对数字证书(CA认证)原理的回顾

    摘要:文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的 ...

  8. C#编程总结(十一)数字证书

    C#编程总结(十一)数字证书 之前已经通过文章介绍了数字证书的基础知识,包括加密和数字签名. 具体可见: 1.C#编程总结(七)数据加密——附源码 2.C#编程总结(八)数字签名 这里来讲述数字证书的 ...

  9. [转载]JavaEE学习篇之——网络传输数据中的密码学知识以及Tomcat中配置数字证书EE

    原文链接:http://blog.csdn.net/jiangwei0910410003/article/details/21716557 今天是学习JavaWeb的第二天,我们来了解什么呢?就了解一 ...

随机推荐

  1. [转]十个 iOS 面试问题

    原文地址:http://onevcat.com/2013/04/ios-interview/ 不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术问题环节不仅是企业对应聘 ...

  2. awk调用shell

    为什么会有这份记录:在帮同学传文件至服务器时,使用了scp,因此链接属性没有建立好,所以向通过awk完成.(更好的是通过tar传递) 附:awk中调用shell的方法. 参考:http://hi.ba ...

  3. 【转】maven同时使用maven-surefire-report-plugin和maven-surefire-plugin默认将执行两次test

    https://issues.apache.org/jira/browse/SUREFIRE-753 Here the pom.xml snippet how i configured the rep ...

  4. 栈空间默认1M,测试存进数据时间

    #include <stdio.h> 栈空间是1024*1024,一兆1M,其中包含了进入main函数之前的1万左右空间.全空间是足的.速度:栈>全局>堆 测试运算时间.100 ...

  5. java字符集

    在utf-8编码中,unicode(编码字符集)是utf-8(字符编码)的表现形式 http://www.cnblogs.com/hanruyue/p/5859107.html

  6. 运行jsp常犯的错误

    error 未启动tomcat服务 tomcat端口是否已改动 404: 未部署web应用 运行时URL输入错误 检查文件的存放位置(存放文件的目录无法对外引用,如WEB-INF , META-INF ...

  7. MySQL修改密码和忘记ROOT密码

    1.关闭数据库 脚本:[root@mysql etc]# service mysql stop 2.使用脚本: mysqld_safe --skip-grant-tables 启动数据库 使用/usr ...

  8. java okhttp包的类特点

    1.开始使用这个包时候不习惯,觉得api用起来很别扭,不管是Request okhttpClient formBody只要是设置啥,就必须使用类里面的Builder类,然后一个方法接受一个参数,不停地 ...

  9. Android测试跑单个包脚本文件

    脚本: adb shell monkey -p 应用包名 --throttle 随机事件间隔 -v -v -v -s 1 --ignore-security-exceptions --kill-pro ...

  10. HTML5的一个写下拉文本框标签

    新的HTML5有个标签,能够下拉的文本框 代码如下 <input list="browsers"> <datalist id="browsers&quo ...