openssl在java端的加解密和签名验证

  • Post author:
  • Post category:java


一、前言

很大程度上参考:

http://blog.csdn.net/chaijunkun/article/details/7275632


在此基础上添加了签名和验证方法。为了完整性,把其前面的内容也搬过来了。

二、openssl下载

  1. windows版本下载地址:

    http://slproweb.com/products/Win32OpenSSL.html
  2. 绿色版下载地址:

    http://sourceforge.net/projects/openssl/?source=directory

三、openssl使用

绿色版bin目录下openssl.exe打开运行,有个warning,可以不用理会。

下面命令不需要打开头的“openssl”

这里写图片描述

  1. 生成私钥:

    openssl genrsa -out rsa_private_key.pem 1024

    保存在当前文件夹下的rsa_private_key.pem文件中,以下同理。
  2. 根据私钥生成公钥:

    openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout
  3. 此时的私钥还不能直接被java使用(但可以被openssl使用),需要进行PKCS#8编码:

    openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
  4. openssl生成签名文件:因为java端签名验证使用sha1算法做摘要。故openssl使用sha1签名:

    openssl sha1 -sign rsa_private_key.pem -out rsasign.bin tos.txt

    tos.txt为自己创建的需要签名的文本,里面可以随意写点字符。为了和后面代码匹配文本内容为:

    helloadsfdsfaasdfasffffffffffffdsafdasfasdfsafzxvxzvasfs

四、代码参考—— jdk1.5

cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());

改为

cipher = Cipher.getInstance("RSA");

本机运行时,起初加解密太慢,去掉BouncyCastleProvider后速度明显提升。而且加密结果一致,不明所以啊(可能和jdk版本有关)。

DEFAULT_PUBLIC_KEY 为rsa_public_key.pem内容。(去掉空格和换行符,头尾的—–PUBLIC KEY—–)

DEFAULT_PRIVATE_KEY 内容为pkcs8_rsa_private_key.pem的内容,格式处理同上。

package com.haiyisoft.lwsp.dto.login;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.SignatureException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Date;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

import sun.misc.BASE64Decoder;

/**
 * 生成私钥:openssl genrsa -out rsa_private_key.pem 1024 
 * 根据私钥生成公钥:openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout
 * 私钥还不能直接被使用,需要进行PKCS#8编码:openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt 
 * sha1签名 openssl sha1 -sign rsa_private_key.pem -out rsasign.bin tos.txt 
 * pkcs8_rsa_private_key 私钥
 * java可以使用
 */
public class RsaEncrypt {
   

    // openssl 产生的钥 私钥为pkcs8形式
    private final String DEFAULT_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxrbbBo9Zkd4uQ16/cx0LJwUJpUHAYHRnSwM8uPgoRkPEXXRFR9sWvZ3WAFdjSB/3KSd8LAK34P8sq49BouUxCJw0h6o2uv0wKIy70k3mTc4KVF12iClPfZR1fQ3FmJrOPr35AiuZTz+YsMp24WageIVz3VZ7qYmzMZ8dH0Ez+ZQIDAQAB";

    private final String DEFAULT_PRIVATE_KEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALGttsGj1mR3i5DXr9zHQsnBQmlQcBgdGdLAzy4+ChGQ8RddEVH2xa9ndYAV2NIH/cpJ3wsArfg/yyrj0Gi5TEInDSHqja6/TAojLvSTeZNzgpUXXaIKU99lHV9DcWYms4+vfkCK5lPP5iwynbhZqB4hXPdVnupibMxnx0fQTP5lAgMBAAECgYBkxQH+pt4kEszb9Afwri5J4Mq6kf1RH8gSiHm4X0U0m0CxIH5/Pvb1OTch0sIqtI+Sl/zg75y7S+r9Q0Fi85y0ghkbLFmmZgv8bGzh4k34WWFCyPMRmexOhsi+IGpTOYkbRnJbycxuY0TXJHHYvEcS0I14fUvI8gbflf12l6DCwQJBANoPXAjHF4TQm0h+qTyFmB4NoGlV3DNH2yk2D2UlKJ+9o7YqjMmw/jNQyeNb65Dj62ij57FQrbn4yfHLBWlkxnECQQDQl7g4kNtDzh0eMMcZYVKU7W/eEkd/G8WeldH26RWE1kZzYBIHeQJiujASDFodM3pqbJ3ssOCizoN1Acy+LPk1AkBvBXjvQyZXSbp1238gwEflrTxpxPw646/SuKJ39cZMJkpu2hUaL1INIGnZpxg1icV2XlT9cz0wPVncEGit81ARAkBkhrnhiO



版权声明:本文为zyw19871007原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。