`

JAVA RSA密钥对的生成与验证

阅读更多

        在上一篇《Java&keytool生成RSA密钥》中,我们用keytool先生成密钥库和公钥证书,然后通过代码方式获得文件和BASE64串形式的公私密钥对,而其实根本无这么复杂,可直接通过JAVA代码获得公私密钥对。代码如下:

package com.bijian.test;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import sun.misc.BASE64Encoder;

public class KeyPairGenUtil {

    /** 指定加密算法为RSA */
    private static final String ALGORITHM = "RSA";
    /** 密钥长度,用来初始化 */
    private static final int KEYSIZE = 1024;
    /** 指定公钥存放文件 */
    private static String PUBLIC_KEY_FILE = "PublicKey";
    /** 指定私钥存放文件 */
    private static String PRIVATE_KEY_FILE = "PrivateKey";

    public static void main(String[] args) throws Exception {
        generateKeyPair();
        genKeyPair();
    }

    /**
    * 生成密钥对
    * @throws Exception
    */
    private static void generateKeyPair() throws Exception {

        //     /** RSA算法要求有一个可信任的随机数源 */
        //     SecureRandom secureRandom = new SecureRandom();
        /** 为RSA算法创建一个KeyPairGenerator对象 */
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);

        /** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */
        //     keyPairGenerator.initialize(KEYSIZE, secureRandom);
        keyPairGenerator.initialize(KEYSIZE);

        /** 生成密匙对 */
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        /** 得到公钥 */
        Key publicKey = keyPair.getPublic();

        /** 得到私钥 */
        Key privateKey = keyPair.getPrivate();

        ObjectOutputStream oos1 = null;
        ObjectOutputStream oos2 = null;
        try {
            /** 用对象流将生成的密钥写入文件 */
            oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));
            oos2 = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE));
            oos1.writeObject(publicKey);
            oos2.writeObject(privateKey);
        } catch (Exception e) {
            throw e;
        } finally {
            /** 清空缓存,关闭文件输出流 */
            oos1.close();
            oos2.close();
        }
    }

    private static void genKeyPair() throws NoSuchAlgorithmException {
        
        /** RSA算法要求有一个可信任的随机数源 */
        SecureRandom secureRandom = new SecureRandom();
        
        /** 为RSA算法创建一个KeyPairGenerator对象 */
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);

        /** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */
        keyPairGenerator.initialize(KEYSIZE, secureRandom);
        //keyPairGenerator.initialize(KEYSIZE);

        /** 生成密匙对 */
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        /** 得到公钥 */
        Key publicKey = keyPair.getPublic();

        /** 得到私钥 */
        Key privateKey = keyPair.getPrivate();

        byte[] publicKeyBytes = publicKey.getEncoded();
        byte[] privateKeyBytes = privateKey.getEncoded();

        String publicKeyBase64 = new BASE64Encoder().encode(publicKeyBytes);
        String privateKeyBase64 = new BASE64Encoder().encode(privateKeyBytes);

        System.out.println("publicKeyBase64.length():" + publicKeyBase64.length());
        System.out.println("publicKeyBase64:" + publicKeyBase64);

        System.out.println("privateKeyBase64.length():" + privateKeyBase64.length());
        System.out.println("privateKeyBase64:" + privateKeyBase64);
    }
}

        运行结果:


        用上一篇验证公私钥对加签验签、加解密的代码验证,也都是OK的。附上加解密验证的代码如下。

package com.bijian.test;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.security.Key;

import javax.crypto.Cipher;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class RSAUtil {
    
    /** 指定加密算法为RSA */
    private static final String ALGORITHM = "RSA";
    /** 指定公钥存放文件 */
    private static String PUBLIC_KEY_FILE = "PublicKey";
    /** 指定私钥存放文件 */
    private static String PRIVATE_KEY_FILE = "PrivateKey";

    public static void main(String[] args) throws Exception {
        
        String source = "你好nihao";// 要加密的字符串
        System.out.println("准备用公钥加密的字符串为:" + source);
        
        String cryptograph = encrypt(source);// 生成的密文
        System.out.print("用公钥加密后的结果为:" + cryptograph);
        System.out.println();
       
        String target = decrypt(cryptograph);// 解密密文
        System.out.println("用私钥解密后的字符串为:" + target);
        System.out.println();   
    }
    
    /**
     * 加密方法
     * @param source 源数据
     * @return
     * @throws Exception
     */
    public static String encrypt(String source) throws Exception {
        
        Key publicKey = getKey(PUBLIC_KEY_FILE);

        /** 得到Cipher对象来实现对源数据的RSA加密 */
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] b = source.getBytes();
        /** 执行加密操作 */
        byte[] b1 = cipher.doFinal(b);
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(b1);
    }

    /**
     * 解密算法
     * @param cryptograph    密文
     * @return
     * @throws Exception
     */
    public static String decrypt(String cryptograph) throws Exception {
        
        Key privateKey = getKey(PRIVATE_KEY_FILE);

        /** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] b1 = decoder.decodeBuffer(cryptograph);

        /** 执行解密操作 */
        byte[] b = cipher.doFinal(b1);
        return new String(b);
    }
    
    private static Key getKey(String fileName) throws Exception, IOException {
        Key key;
        ObjectInputStream ois = null;
        try {
            /** 将文件中的私钥对象读出 */
            ois = new ObjectInputStream(new FileInputStream(fileName));
            key = (Key) ois.readObject();
        } catch (Exception e) {
            throw e;
        } finally {
            ois.close();
        }
        return key;
    }
}

        运行结果:

 

附阿里生成公私钥的链接:https://docs.open.alipay.com/291/105971

  • 大小: 63.7 KB
  • 大小: 10.3 KB
分享到:
评论

相关推荐

    rsa密钥生成工具.zip

    总结来说,这个"rsa密钥生成工具.zip"可能是为开发者提供一个便捷的方式,生成用于与支付宝交互的RSA密钥对。理解RSA加密原理以及如何在Java环境中生成和使用密钥对,对于在支付领域工作的开发人员至关重要,因为这...

    Java&keytool生成RSA密钥

    Java和Keytool生成RSA密钥对是网络安全领域中常见的操作,尤其在进行数据加密、数字签名和SSL/TLS证书管理时。RSA是一种非对称加密算法,它基于两个密钥:公钥和私钥,公钥用于加密,私钥用于解密。Keytool是Java...

    Java RSA加密 与.net 的密匙转换完整版,java类

    本资源提供的"Java RSA加密与.NET的密匙转换完整版,java类"解决了这个问题,实现了Java RSA密钥对到C#格式的转换,确保了跨平台的互通性。 `RsaHelper.java`是这个解决方案的核心文件,它可能包含了以下关键功能:...

    .net与java中的互操作(rsa签名与验签、加密与解密)

    在C#中,我们可以使用`System.Security.Cryptography.RSACryptoServiceProvider`类来生成和管理RSA密钥对。签名过程通常包括以下步骤: 1. 加载私钥:通过加载`.pfx`或`.xml`文件获取私钥。 2. 创建签名:使用`...

    RSA1024 RSA2048算法密匙生成器

    这个jar文件可能是为了在Java环境中使用OpenSSL的命令行工具,如生成RSA密钥对、进行加密解密等操作。 `使用说明文档(请先阅读再操作).txt`是提供如何使用这些工具的指南,强烈建议在操作前仔细阅读,以避免误操作...

    RSA任意长度密钥生成工具

    标题中的“RSA任意长度密钥生成工具”是指可以生成任意位数的RSA密钥对的软件。在标准RSA算法中,密钥长度通常是以位(bits)为单位,常见的有1024位、2048位、4096位等。密钥长度越长,安全性越高,但加密和解密的...

    根据git项目个人二次开发的rsa和ecdsa密钥生成工具

    这个程序的作用很可能是简化RSA和ECDSA密钥对的生成过程,用户只需运行该程序,即可快速创建用于Git的身份验证密钥。"README"文件通常会包含使用工具的指南、注意事项和可能的故障排除信息。 在实际使用中,生成RSA...

    RSA go java 相互加解密

    首先,通过`KeyPairGenerator`实例化一个RSA密钥对生成器,然后调用`generateKeyPair()`生成公钥和私钥。加密时使用`Cipher.init(Cipher.ENCRYPT_MODE, publicKey)`初始化加密器,解密时使用`Cipher.init(Cipher....

    支付宝RSA生成工具java版本

    生成的RSA密钥对中,私钥用于本地签名,公钥则提供给支付宝进行验证,确保交易数据的完整性和真实性。 【压缩包子文件的文件名称列表】中: - "RSA签名验签工具.bat":这可能是一个批处理文件,用于一键执行密钥...

    java 使用RSA生成公私钥对、加解密、及签名验签

    下面我们将深入探讨如何在Java中使用RSA生成公私钥对、进行加解密以及实现签名和验签。 1. **生成公私钥对**: - 使用`java.security.KeyPairGenerator`类,通过`getInstance("RSA")`方法获取RSA的...

    RSA数字签名和验证

    在给定的`GenerateKeyPair`类中,我们看到了如何使用Java Security库来生成RSA密钥对。具体步骤如下: 1. **初始化密钥生成器**: ```java KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA"); ...

    javarsa工具类

    1. 生成密钥对:选择大素数p和q,计算n=p*q和φ(n),选取e和计算d。 2. 加密:明文m通过m^e mod n计算得到密文c。 3. 解密:密文c通过c^d mod n计算得到明文m。 4. 数字签名:使用私钥对消息哈希值签名,发送给接收...

    Java RSA加密前后端实现

    例如,后端可能会创建一个RSA密钥对,将公钥发送给前端,私钥保留在服务器上,确保只有服务器能解密前端发来的加密信息。 项目中提到的"rsaLogin"可能是一个具体的登录功能模块,该模块利用RSA加密技术处理用户的...

    rsa生成私钥密钥

    在Java中,我们可以使用`java.security.KeyPairGenerator`类来生成RSA密钥对。首先,需要初始化KeyPairGenerator实例,设置算法为RSA,并指定密钥长度。然后调用`generateKeyPair()`方法来生成KeyPair对象,其中包含...

    Java生成密钥的实例.7z

    - `KeyPairGenerator`:用于生成非对称密钥对,如RSA密钥对。 3. 安全提供者: - 在Java中,安全服务由安全提供者提供,例如`SunJCE`(Java Cryptography Extension)。 - 使用`Security.getProviders()`可以列...

    java RSA加解密 zip加解密, js MD5 SHA1 RSA加密

    在Java中,可以使用`java.security`包下的`KeyPairGenerator`、`Cipher`等类来生成密钥对并进行加解密操作。 接下来是Java的ZIP加密压缩。ZIP是一种广泛使用的文件压缩格式,支持对文件或文件夹进行压缩。在Java中...

    Delphi标准RSA加密,解密,签名.与C,Java,php等通用

    2. **密钥生成**:在Delphi中,可以使用内置的TNetCrypto库或者其他第三方库(如GDI+单位)生成RSA密钥对。通常包括选择一个大素数p和q,计算n=p*q,欧拉函数φ(n)=(p-1)*(q-1),然后找到一个满足条件egcd(e, φ(n))...

    使用openssl生成RSA秘钥对(用这个!)

    本教程将详细解释如何使用开源工具openssl生成RSA密钥对,并探讨其在实际应用中的重要性。 首先,我们需要了解RSA的基本原理。RSA算法由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,它使用一对密钥——...

    C#与java平台RSA加密解密签名验签互通案例

    1. **生成密钥对**:在C#和Java中分别生成RSA的公钥和私钥,并确保使用相同的参数,如键长(通常为2048位)和填充模式(如PKCS#1 v1.5或OAEP)。 2. **交换密钥**:将生成的公钥以标准格式(如PEM或DER)在两端之间...

Global site tag (gtag.js) - Google Analytics