在上一篇《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
相关推荐
总结来说,这个"rsa密钥生成工具.zip"可能是为开发者提供一个便捷的方式,生成用于与支付宝交互的RSA密钥对。理解RSA加密原理以及如何在Java环境中生成和使用密钥对,对于在支付领域工作的开发人员至关重要,因为这...
Java和Keytool生成RSA密钥对是网络安全领域中常见的操作,尤其在进行数据加密、数字签名和SSL/TLS证书管理时。RSA是一种非对称加密算法,它基于两个密钥:公钥和私钥,公钥用于加密,私钥用于解密。Keytool是Java...
本资源提供的"Java RSA加密与.NET的密匙转换完整版,java类"解决了这个问题,实现了Java RSA密钥对到C#格式的转换,确保了跨平台的互通性。 `RsaHelper.java`是这个解决方案的核心文件,它可能包含了以下关键功能:...
在C#中,我们可以使用`System.Security.Cryptography.RSACryptoServiceProvider`类来生成和管理RSA密钥对。签名过程通常包括以下步骤: 1. 加载私钥:通过加载`.pfx`或`.xml`文件获取私钥。 2. 创建签名:使用`...
这个jar文件可能是为了在Java环境中使用OpenSSL的命令行工具,如生成RSA密钥对、进行加密解密等操作。 `使用说明文档(请先阅读再操作).txt`是提供如何使用这些工具的指南,强烈建议在操作前仔细阅读,以避免误操作...
标题中的“RSA任意长度密钥生成工具”是指可以生成任意位数的RSA密钥对的软件。在标准RSA算法中,密钥长度通常是以位(bits)为单位,常见的有1024位、2048位、4096位等。密钥长度越长,安全性越高,但加密和解密的...
这个程序的作用很可能是简化RSA和ECDSA密钥对的生成过程,用户只需运行该程序,即可快速创建用于Git的身份验证密钥。"README"文件通常会包含使用工具的指南、注意事项和可能的故障排除信息。 在实际使用中,生成RSA...
首先,通过`KeyPairGenerator`实例化一个RSA密钥对生成器,然后调用`generateKeyPair()`生成公钥和私钥。加密时使用`Cipher.init(Cipher.ENCRYPT_MODE, publicKey)`初始化加密器,解密时使用`Cipher.init(Cipher....
生成的RSA密钥对中,私钥用于本地签名,公钥则提供给支付宝进行验证,确保交易数据的完整性和真实性。 【压缩包子文件的文件名称列表】中: - "RSA签名验签工具.bat":这可能是一个批处理文件,用于一键执行密钥...
下面我们将深入探讨如何在Java中使用RSA生成公私钥对、进行加解密以及实现签名和验签。 1. **生成公私钥对**: - 使用`java.security.KeyPairGenerator`类,通过`getInstance("RSA")`方法获取RSA的...
在给定的`GenerateKeyPair`类中,我们看到了如何使用Java Security库来生成RSA密钥对。具体步骤如下: 1. **初始化密钥生成器**: ```java KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA"); ...
1. 生成密钥对:选择大素数p和q,计算n=p*q和φ(n),选取e和计算d。 2. 加密:明文m通过m^e mod n计算得到密文c。 3. 解密:密文c通过c^d mod n计算得到明文m。 4. 数字签名:使用私钥对消息哈希值签名,发送给接收...
例如,后端可能会创建一个RSA密钥对,将公钥发送给前端,私钥保留在服务器上,确保只有服务器能解密前端发来的加密信息。 项目中提到的"rsaLogin"可能是一个具体的登录功能模块,该模块利用RSA加密技术处理用户的...
在Java中,我们可以使用`java.security.KeyPairGenerator`类来生成RSA密钥对。首先,需要初始化KeyPairGenerator实例,设置算法为RSA,并指定密钥长度。然后调用`generateKeyPair()`方法来生成KeyPair对象,其中包含...
- `KeyPairGenerator`:用于生成非对称密钥对,如RSA密钥对。 3. 安全提供者: - 在Java中,安全服务由安全提供者提供,例如`SunJCE`(Java Cryptography Extension)。 - 使用`Security.getProviders()`可以列...
在Java中,可以使用`java.security`包下的`KeyPairGenerator`、`Cipher`等类来生成密钥对并进行加解密操作。 接下来是Java的ZIP加密压缩。ZIP是一种广泛使用的文件压缩格式,支持对文件或文件夹进行压缩。在Java中...
2. **密钥生成**:在Delphi中,可以使用内置的TNetCrypto库或者其他第三方库(如GDI+单位)生成RSA密钥对。通常包括选择一个大素数p和q,计算n=p*q,欧拉函数φ(n)=(p-1)*(q-1),然后找到一个满足条件egcd(e, φ(n))...
本教程将详细解释如何使用开源工具openssl生成RSA密钥对,并探讨其在实际应用中的重要性。 首先,我们需要了解RSA的基本原理。RSA算法由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,它使用一对密钥——...
1. **生成密钥对**:在C#和Java中分别生成RSA的公钥和私钥,并确保使用相同的参数,如键长(通常为2048位)和填充模式(如PKCS#1 v1.5或OAEP)。 2. **交换密钥**:将生成的公钥以标准格式(如PEM或DER)在两端之间...