基于密钥库和数字证书的加密解密和签名验证操作

package com.szzs;

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

import javax.crypto.Cipher;

public class CertificateCoder {
    // 类型证书X.509
    public static final String CERT_TYPE = "X.509";

    // 1.根据密钥库获得私钥
    private static PrivateKey getPrivateKeyByKeyStore(String keyStorePath,String alias, String password) throws Exception{
        // 获得密钥库
        KeyStore ks = getKeyStore(keyStorePath,password);
        // 根据别名和密码获取私钥
        PrivateKey privateKey = (PrivateKey) ks.getKey(alias, password.toCharArray());
        return privateKey;

    }

    // 2.根据证书获取公钥
    private static PublicKey getPublicKeyByCertificate(String certificatePath) throws Exception {
        // 获得证书
        Certificate certificate = getCertificate(certificatePath);
        // 获得证书公钥
        return certificate.getPublicKey();
    }

    // 3.加载数字证书:certificatePath为证书路径
    private static Certificate getCertificate(String certificatePath) throws Exception {
        // 实例化证书工厂
        CertificateFactory certificateFactory = CertificateFactory.getInstance(CERT_TYPE);
        // 取得证书文件流
        FileInputStream in = new FileInputStream(certificatePath);
        // 生成证书
        Certificate certificate = certificateFactory.generateCertificate(in);
        //关闭证书文件流
        in.close();
        return certificate;
    }

    // 4.根据别名从密钥库获得数字证书
    private static Certificate getCertificate(String keyStorePath, String alias, String password ) throws Exception {
        // 获得密钥库
        KeyStore ks = getKeyStore(keyStorePath, password);
        // 获得证书
        return ks.getCertificate(alias);

    }    

    // 5.根据密钥库路径获得KeyStore
    private static KeyStore getKeyStore(String keyStorepath, String password) throws Exception {
        // 实例化密钥库
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        // 获得密钥库文件流
        FileInputStream is = new FileInputStream(keyStorepath);
        // 加载密钥库
        ks.load(is, password.toCharArray());
        // 关闭密钥库文件流
        is.close();
        return ks;
    }

    // 6.私钥加密
    public static byte[] encryptByPrivateKey(byte[] data, String keyStorePath, String alias, String password) throws Exception {
        // 取得私钥
        PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath,alias,password);
        // 对数据加密
        Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }

    // 7.私钥解密
    public static byte[] decryptByPrivateKey(byte[] data, String keyStorePath, String alias, String password) throws Exception {
        // 取得私钥
        PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath,alias,password);
        // 对数据加密
        Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }

    // 8.公钥加密:返回加密后数据
    public static byte[] encryptByPublicKey(byte[] data, String certificatePath) throws Exception {
        // 取得公钥
        PublicKey publicKey = getPublicKeyByCertificate(certificatePath);
        // 对数据加密
        Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }

    // 9.公钥解密
    public static byte[] decryptByPublicKey(byte[] data, String certificatePath) throws Exception {
        // 取得私钥
        PublicKey publicKey = getPublicKeyByCertificate(certificatePath);
        // 对数据加密
        Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }

    // 10.获取签名
    public static byte[] sign(byte[] sign, String keyStorePath, String alias, String password) throws Exception {
        // 根据密钥库路径,密钥库别名,密码获得证书
        X509Certificate x509Certificate = (X509Certificate) getCertificate(keyStorePath, alias, password);
        // 构建签名,由证书指定签名算法
        Signature signature = Signature.getInstance(x509Certificate.getSigAlgName());
        // 获得私钥
        PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath, alias, password);
        // 初始化签名,由私钥构建
        signature.initSign(privateKey);
        signature.update(sign);
        return signature.sign(); //返回签名

    }

    // 11.验证签名,签名为真返回ture
    public static boolean verify(byte[] data, byte[] sign, String certificatePath) throws Exception {
        // 获得证书
        X509Certificate x509Certificate = (X509Certificate) getCertificate(certificatePath);
        // 构建签名,由证书指定签名算法
        Signature signature = Signature.getInstance(x509Certificate.getSigAlgName());
        // 由证书初始化签名,实际是用了证书中的公钥
        signature.initVerify(x509Certificate);
        signature.update(data);
        return signature.verify(sign);
    }
}

测试:

package com.szzs;
// 基于密钥库和数字证书的加密解密和签名验证操作
public class CertificateCoderTest {
    private String password = "123456";
    private String alias = "www.zlex.org";
    private String certficatePath = "D:/zlex.cer"; // 数字证书
    private String keyStorePath = "D:/zlex.keystore"; // 密钥库

    // 1.公钥加密,私钥解密
    public void test1() throws Exception {
        System.out.println("公钥加密--私钥解密");
        String inputStr = "数字证书";
        byte[] data = inputStr.getBytes();
        // 公钥加密
        byte[] encrypt = CertificateCoder.encryptByPublicKey(data, certficatePath);
        // 私钥解密
        byte[] decrypt = CertificateCoder.decryptByPrivateKey(data, keyStorePath, alias,  password);
        String outputStr = new String(decrypt);
        System.err.println("加密前:\n" + inputStr);
        System.err.println("解密后:\n" + outputStr);
        // 验证数据一致
        // assertArrayEquals(data, decrypt);
    }

    // 2.私钥加密,公钥解密
    public void test2() throws Exception {
        System.out.println("私钥加密--公钥解密");
        String inputStr = "数字签名";
        byte[] data = inputStr.getBytes();
        // 私钥加密
        byte[] encodedData = CertificateCoder.encryptByPrivateKey(data, keyStorePath, alias,  password);
        // 公钥解密
        byte[] decodedData = CertificateCoder.decryptByPublicKey(data, certficatePath);
        String outputStr = new String(decodedData);
        System.err.println("加密前:\n" + inputStr);
        System.err.println("解密后:\n" + outputStr);
        // 验证数据一致
        // assertEquals(inputStr, outputStr);
    }

    // 3.签名验证
    public void testSign() throws Exception {
        String inputStr = "签名";
        byte[] data = inputStr.getBytes();
        System.out.println("私钥签名---公钥验证");
        // 产生签名
        byte[] sign = CertificateCoder.sign(data, keyStorePath, alias, password);
        // System.err.println("签名:\n" + Hex.encodeHexString(sign));
        // 验证签名
        boolean status = CertificateCoder.verify(data, sign, certficatePath);
        System.err.println("状态:\n" + status);
        // 校验
        // assertTure(status);

    }

}

原文地址:https://www.cnblogs.com/yuwei1/p/9503240.html

时间: 2024-10-05 04:01:29

基于密钥库和数字证书的加密解密和签名验证操作的相关文章

Java 密钥库和数字证书

密钥库中可以存放多个条目(公钥/私钥对和证书),它们在密钥库中以别名(alias)区分. 1.cd C:\Program Files (x86)\Java\jdk1.6.0_10\bin 2.生成签名证书:keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000 [-genkey:生成密钥] [-keystore:指定存储位置可加上路径C:\Users\dxcb\android

神级程序员带来:用python有证书的加密解密实现方法!

本文实例讲述了python有证书的加密解密实现方法.分享给大家供大家参考.具体实现方法如下: 最近在做python的加解密工作,同时加完密的串能在php上能解出来,网上也找了一些靠谱的资料,刚好也有时间我就总结了一下python在加密与解密这块的代码,今后可能还能用的上.相对于php而言python这块加解密组件较多的,分别是: 一. RSA标准方式生成的证书 1.加密解密.加密签名.验证加密签名 代码如下: #encoding: utf8 import os import M2Crypto #

RSA加密解密与签名验证

关于RSACryption帮助类定义见RSACryption 一.加密与解密 //定义明文和密文变量 string plaintext = "天道酬勤,厚德载物!"; string ciphertext = ""; //产生密钥 string prikey = "", pubkey = ""; rsa.RSAKey(out prikey, out pubkey); //加密解密过程 ciphertext = rsa.RSAEn

iOS RSA加密解密及签名验证

1.首先要下载openssl,这个不用说,直接官网下载或者用brew install openssl下载 2.终端生成私钥密钥 2.1生成私钥 openssl genrsa -out rsa_private_key.pem 1024 2.2生成密钥 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 2.3将RSA私钥转换为pkcs8 格式 openssl pkcs8 -topk8 -inform PEM -in

数字证书简介及Java编码实现

1.数字证书简介 数字证书具备常规加密解密必要的信息,包含签名算法,可用于网络数据加密解密交互,标识网络用户(计算机)身份.数字证书为发布公钥提供了一种简便的途径,其数字证书则成为加密算法以及公钥的载体.依靠数字证书,我们可以构建一个简单的加密网络应用平台. 数字证书类似于个人身份证,由数字证书颁发认证机构(Certificate Authority, CA)签发.只有经过CA签发的证书在网络中才具备可认证性.CA颁发给自己的证书叫根证书. VeriSign, GeoTrust和Thawte是国

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

1 keytool命令总结 一.创建数字证书 交互模式 使用默认的密钥库.keystore(文件夹是c: Documents and Settingusername)和算法(DSA) keytool -genkey 默认的别名mykey 密钥库中能够存放多个条目(公钥/私钥对和证书),它们在密钥库中以别名(alias)区分. [plain] view plaincopy keytool -genkey -alias mytest -keyalg RSA -keysize 1024 -keysto

java加密与数字证书

加密与数字证书 加密与数字证书 概念 数字摘要 密钥加密技术 私用密钥(对称加密) 公共密钥(非对称加密) 数字签名 数字证书 X.509标准 工具 keytool 示例代码 加密解密 密钥库准备 代码 签名验签 代码 概念 数字摘要 数字摘要就是采用单项Hash函数将需要加密的明文"摘要"成一串固定长度(128位)的密文,这一串密文又称为数字指纹,HASH值或摘要值 ,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致. 目前常用的摘要算法为MD5

使用X.509数字证书加密解密实务(一)-- 证书的获得和管理

一.       获得证书 1.        从CA获得 2.        从windows2003证书服务中获得 3.        使用makecert工具获得 二.       证书的保存 1.        保存在证书存储区 2.        以文件形式保存 2.1.       带有私钥的证书 2.2.       二进制编码的证书 2.3.       Base64编码的证书 3.        存储区中的证书跟证书文件相互转换 3.1.       使用工具相互转换 3.1.

使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据

一.  使用RSA证书加.解密敏感数据 X.509证书标准支持三种不对称加密算法:RSA, DSA, Diffie-Hellman algorithms.最常用的是RSA算法.所以本文就以前面章节使用makecert工具生成的生成的MyTestCert证书进行加密解密,这个证书具有RSA算法1024位的密钥对. Figure 12. RSA加密解密过程 1. 生成证书.分发证书 证书使用前面“使用makecert工具获得”章节生成的MyTestCert,当然也可以是从商业CA获得的证书. 你获得