用Java实现RSA加解密及签名和验签(2)——.pfx文件格式秘钥

注:.pfx 主要用于windows平台,浏览器可以使用,也是包含证书和私钥,获取私钥需要密码才可以

.pfx文件生成的方式可参考:https://www.cnblogs.com/ouyanxia/p/12427955.html

1、准备好pfx秘钥文件(alias默认是1)

path=/RSA/other/openssl.pfx
pwd=秘钥的秘钥(生成秘钥时记得存好)
alias=1
cerPath=/RSA/other/openssl.cer

2、编写RSAUtil

import java.io.FileInputStream;

import java.security.Key;
import java.security.KeyPair;
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.CertificateFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

import javax.crypto.Cipher;

import org.apache.tomcat.util.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class RSAUtil {
    public static RSAPublicKey publicKey;
    public static RSAPublicKey tlPublicKey;
    public static RSAPrivateKey privateKey;

    public static void configure(RSAConfig config) {
        try {
            RSAUtil.publicKey = (RSAPublicKey) loadPublicKey(config.getCerPath());
            RSAUtil.privateKey = (RSAPrivateKey) loadPrivateKey(config.getAlias(), config.getPath(), config.getPwd());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 私钥
     *
     * @param source
     * @return
     */
    public static String doSignBySHA1withRSA(String source) {
        byte[] sourceData = source.getBytes();
        String result = null;
        try {
            // 获得私钥并签名
            Signature sign = Signature.getInstance("SHA1WithRSA", new BouncyCastleProvider());
            sign.initSign(privateKey);
            sign.update(sourceData);

            byte[] resultData = sign.sign();
            result = Base64.encodeBase64String(resultData);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

    public static PrivateKey loadPrivateKey(String alias, String path, String pwd) {
        PrivateKey privateKey = null;
        try {
            // 获得公钥

            KeyPair keyPair = null;

            KeyStore keyStore = KeyStore.getInstance("PKCS12");

            keyStore.load(new FileInputStream(path), pwd.toCharArray());
            Key key = keyStore.getKey(alias, pwd.toCharArray());

            if (key instanceof PrivateKey) {
                Certificate cert = keyStore.getCertificate(alias);

                keyPair = new KeyPair(cert.getPublicKey(), (PrivateKey) key);

            }
            privateKey = keyPair.getPrivate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return privateKey;

    }

    public static PublicKey loadPublicKey(String cerPath) {
        PublicKey publicKey = null;
        try {
            // 获得公钥
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            FileInputStream in = new FileInputStream(cerPath);

            // 生成一个证书对象并使用从输入流 inStream 中读取的数据对它进行初始化。
            Certificate c = cf.generateCertificate(in);
            publicKey = c.getPublicKey();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return publicKey;

    }

    /**
     * 公钥验签
     *
     * @param sign
     * @param source
     * @return
     */
    public static boolean doVerifyBySHA1withRSA(String sign, String source) {
        boolean result = false;
        try {
            // 获得公钥
            byte[] sourceData = source.getBytes();

            Signature verify = Signature.getInstance("SHA1withRSA");
            verify.initVerify(publicKey);
            verify.update(sourceData);

            byte[] decoded = Base64.decodeBase64(sign);
            result = verify.verify(decoded);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 公钥加密
     *
     * @param plainText
     * @param pkcs8_rsa_public_key
     * @return
     */
    public static String doEncryptByRSA(String plainText) {
        byte[] sourceData = plainText.getBytes();
        String result = null;

        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] resultData = cipher.doFinal(sourceData);
            result = Base64.encodeBase64String(resultData);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static String doDecryptByRSA(String encryptedText) {
        byte[] sourceData = Base64.decodeBase64(encryptedText);
        String result = null;

        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] resultData = cipher.doFinal(sourceData);
            result = new String(resultData);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

}

3、编写配置类(方便配置)

public class RSAConfig {
      private String pwd;
      private String alias;
      private String path;
      private String cerPath;
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getAlias() {
        return alias;
    }
    public void setAlias(String alias) {
        this.alias = alias;
    }
    public String getPath() {
        return path;
    }
    public void setPath(String path) {
        this.path = path;
    }
    public String getCerPath() {
        return cerPath;
    }
    public void setCerPath(String cerPath) {
        this.cerPath = cerPath;
    }
    public RSAConfig(String pwd, String alias, String path, String cerPath) {
        super();
        this.pwd = pwd;
        this.alias = alias;
        this.path = path;
        this.cerPath = cerPath;
    }
}

4、main方法测试

import com.example.demo.constants.Constants;
import com.gworld.rsautil.pfx.RSAConfig;
import com.gworld.rsautil.pfx.RSAUtil;

public class DemoTest {
    public static void main(String[] args) throws Exception {

        RSAConfig config = new RSAConfig(Constants.PWD, Constants.ALIAS, Constants.PFX_PATH, Constants.CER_PATH);//读取配置文件的秘钥配置
        RSAUtil.configure(config);
        String id = "123456789";
        String encodeId = RSAUtil.doEncryptByRSA(id);
        String decodeId = RSAUtil.doDecryptByRSA(encodeId);
        System.out.println("encodeId="+encodeId);
        System.out.println("decodeId="+decodeId);

        String sign = RSAUtil.doSignBySHA1withRSA(id);
        System.out.println(sign);
        boolean verify = RSAUtil.doVerifyBySHA1withRSA(sign, id);
        System.out.println("verify result="+verify);
    }

}

测试结果:

encodeId=Tv4/lRio3ldjfdk/KsiM18tlUMTe+u5i2ZLot3A8TW3bnP8iZgTArC9cxHcbYkTk37/07gOyHWHwpYkjYZ8xNA2d/Fgnf+Z4F23ULO2UgDR00eyjXe7R2XTQgMhSHenQxmaICU45PDs4+esrehSPkyyWB8rTDbB/dwn+wucKmXM=
decodeId=123456789
g495zEj7o4PxdRA7SYhGALR04qoLUbznknUrGWm5/AIwYYnt8hym94i/dSAQEJo7jXHbmEZo2N0l4p8BDBIJ7Wp5CIqG2+NXr+aT/QA9MLnOFvpAJ/HzOn+HNzMSOpRNvFZ8Bj12it/cdTGq++qFwrf4uUuzB63V67mjIRVDZrg=
verify result=true

原文地址:https://www.cnblogs.com/ouyanxia/p/12430090.html

时间: 2024-11-08 00:46:51

用Java实现RSA加解密及签名和验签(2)——.pfx文件格式秘钥的相关文章

用Java实现RSA加解密及签名和验签(1)——.pem文件格式秘钥

一.***.pem文件格式的秘钥(获取秘钥:可通过文件读取内容或者直接打开文件复制内容),我这里是打开文件复制秘钥直接使用 1.准备秘钥对,通过openssl生成秘钥对,生成秘钥可参考:https://www.cnblogs.com/ouyanxia/p/12427955.html A_RSA_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnPzYKf20JIza

【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据.否则的话,你就要考虑你的场景是否有必要用 RSA 了. 2. 可以通过修改生成密钥的长度来调整密文长度 生成密文的长度等于密钥长度.密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉.著名

.NET RSA解密、签名、验签

using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; namespace API.Tools { /// <summary> /// 类名:RSAFromPkcs8 /// 功能:RSA解密.签名.验签 /

RSA加密、解密、签名、验签 DSA签名、验签

重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名.验签的测试代码,主要代码参考 http://xw-z1985.iteye.com/blog/1837376 重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名.验签的测试代码,主要代码参考 http://xw-z1985.iteye.com/blog/1837376 重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名.验签的测试代码,主要代码参考 http://xw-z1985.iteye.com/blog/1837376 下

Java 进行 RSA 加解密时不得不考虑到的那些事儿

1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据.否则的话,你就要考虑你的场景是否有必要用 RSA 了. 2. 可以通过修改生成密钥的长度来调整密文长度 生成密文的长度等于密钥长度.密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉.著名的"安全和效率总是一把双刃剑"定律,在这里展现的淋漓尽

Java 进行 RSA 加解密的例子

加密是保证数据安全的手段之一.加密是将纯文本数据转换为难以理解的密文:解密是将密文转换回纯文本.数据的加解密属于密码学的范畴.通常,加密和解密都需要使用一些秘密信息,这些秘密信息叫做密钥,将纯文本转为密文或者转回的时候都要用到这些密钥.对称加密指的是发送者和接收者共用同一个密钥的加解密方法.非对称加密(又称公钥加密)指的是需要一个私有密钥一个公开密钥,两个不同的密钥的加解密体系.尽管不同,这个密钥对的这两个部分在算法上是有关联的.一个密钥将纯文本加密,另一个将密文解密.没有一个密钥能够把加密和加

关于rsa非对称加密、解密、签名、验签

测试数据: 1 var xmlprikey =""; 2 var xmlpubkey =""; 3 rsa = new RSACryption(); 4 //待处理字符串 5 var str="hello成功啊啊!¥%……&*([email protected]#$%^&*()@#$%^&*()_}::{>>?}{>?{?"; 6 var strlen= str.Length; 7 rsa.RSAKey(

java中RSA加解密的实现

今天在做RSA加密的时候遇到了一个这样的错误:ArrayIndexOutOfBoundsException: too much data for RSA block 查询相关资料后得知该错误是加密数据过长导致的. 加密数据长度 <= 模长-11 解决办法:将要加密的数据截取后分段加密 1.密钥长度rsa算法初始化的时候一般要填入密钥长度,在96-1024bits间(1)为啥下限是96bits(12bytes)?因为加密1byte的明文,需要至少1+11=12bytes的密钥(不懂?看下面的明文长

Java RSA (SHA1withRSA)签名和验签

static { try { SIGNATURE = Signature.getInstance("SHA1withRSA", "BC"); } catch (NoSuchAlgorithmException | NoSuchPaddingException | NoSuchProviderException e) { throw Throwables.propagate(e); } } public static String getSignature(Map&l