RSA加密与解密
RSA算法的密钥由公钥和私钥组成,公钥用于加密,私钥用于解密。顾名思义,公钥就是可以进行公开的密钥,一般可以公开给你的合作伙伴;私钥就是私有的,也就是只有你知道的,你的合作伙伴通过你提供的公钥进行加密的内容只有你能进行解密,这样也就只有你知道他发的是什么内容。用于加密的公钥和私钥是配对的。这样的一对密钥在Java中由java.security.KeyPairGenerator
来产生。以下是一个生成密钥对的示例,该示例中还将生成的密钥对分别保存到了文件中。
private static final String ALGORITHM = "RSA";
private static final String PRIVATE_KEY_PATH = "D:\\rsa_private.isa";
private static final String PUBLIC_KEY_PATH = "D:\\rsa_public.isa";
/**
* 生成公钥和私钥并存储到文件中
* @throws Exception
*/
@Test
public void geneKeyPair() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();//私钥
PublicKey publicKey = keyPair.getPublic();//公钥
byte[] privateKeyBytes = privateKey.getEncoded();//私钥对应的字节数组
byte[] publicKeyBytes = publicKey.getEncoded();//公钥对应的字节数组
Files.write(Paths.get(PRIVATE_KEY_PATH), privateKeyBytes);
Files.write(Paths.get(PUBLIC_KEY_PATH), publicKeyBytes);
}
加密
加密的过程跟使用AES算法进行加密的过程类似,唯一需要注意的是使用存储起来的公钥时需要使用X509EncodedKeySpec
进行封装,然后通过KeyFactory.generatePublic(KeySpec)
进行生成。
@Test
public void testEncrypt() throws Exception {
this.encrypt("Hello RSA");
}
/**
* 公钥加密
* @param value
* @return
* @throws Exception
*/
private byte[] encrypt(String value) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
//读取公钥对应的字节数组
byte[] publicKeyCode = Files.readAllBytes(Paths.get(PUBLIC_KEY_PATH));
//构造公钥,存储起来的公钥需要使用X509EncodedKeySpec进行读取
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyCode);
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
//根据已有的KeySpec生成对应的公钥
PublicKey publicKey = keyFactory.generatePublic(keySpec);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] result = cipher.doFinal(value.getBytes());
System.out.println(Base64.getEncoder().encodeToString(result));
return result;
}
解密
解密是使用的密钥对中的私钥,其使用方法跟AES算法进行解密类似。 存储起来的私钥需要通过PKCS8EncodedKeySpec
加载,然后通过KeyFactory.generatePrivate(KeySpec)
生成私钥。
/**
* 私钥解密
* @throws Exception
*/
@Test
public void testDecrypt() throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
byte[] privateKeyCode = Files.readAllBytes(Paths.get(PRIVATE_KEY_PATH));
//私钥需要通过PKCS8EncodedKeySpec来读取
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyCode);
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
//生成私钥
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
String content = "Java Program";
byte[] input = this.encrypt("Java Program");
byte[] result = cipher.doFinal(input);
Assert.assertTrue(content.equals(new String(result)));
}
(本文由Elim写于2017年5月22日)
相关推荐
RSA算法基于大数分解难题的原理,使用公钥加密、私钥解密的方式实现信息的加密和解密。 知识点2:Java中RSA加密解密算法的实现 在Java中,可以使用Java Cryptography Architecture(JCA)来实现RSA加密解密算法。...
`java Rsa 加解密示例.html`和`java Rsa 加解密示例_files`可能是包含该示例代码和相关资源的文件,建议打开查看以获取实际操作的指导。通过这些文件,你可以学习如何将理论知识转化为实际代码,进一步巩固对RSA加...
总之,RSA加密解密示例工程提供了一个实践平台,让开发者可以动手学习如何在Android环境中利用RSA算法保护数据安全。通过这个示例,可以提升对非对称加密的理解,增强实际开发中的安全意识和技能。
本示例是用C#语言实现的,利用RSA算法进行文件的加密和解密操作。RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出,因其发明者的名字首字母命名。 首先,了解RSA的基本原理:RSA...
本项目"PHP_JAVA_RSA互通加解密"实现了PHP和Java之间使用RSA算法进行数据的加解密操作,确保了跨平台、跨语言的数据安全通信。 首先,RSA(Rivest-Shamir-Adleman)加密算法基于数论中的大数因子分解问题,它的核心...
**Delphi中的经典RSA算法源码示例** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于信息安全领域,包括数据加密、数字签名等。在Delphi编程环境中,理解并实现RSA算法对于开发安全相关的应用至关...
在IT领域,特别是软件开发中,安全通信是至关重要的,而RSA算法是广泛使用的非对称加密技术之一。本文将详细讲解Delphi环境下如何实现RSA加解密,并着重讨论其支持的公钥加密私钥解密以及私钥加密公钥解密的功能,...
首先,我们需要理解RSA算法的基本原理。RSA(Rivest–Shamir–Adleman)是一种非对称加密算法,它依赖于两个密钥:公钥和私钥。公钥是可以公开的,用于加密数据;而私钥是保密的,用于解密数据。由于数学上的复杂性...
"www.pudn.com.txt"可能是提供了一些关于RSA算法的额外资料或示例,而"RSA加密解密"可能是程序代码文件,包含了一个实现RSA加密解密功能的示例程序。通过阅读这些文件,你可以深入了解RSA算法的实现细节,并可以动手...
本示例主要探讨了如何在C#环境中使用RSA算法进行加解密操作。 RSA(Rivest–Shamir–Adleman)是一种广泛使用的非对称加密算法,它基于大素数因子分解的难度。RSA的核心在于一对公钥和私钥:公钥用于加密,而私钥...
- `main.c`: 示例程序,展示了如何使用RSA库进行加解密操作。 - 可能还有其他辅助文件,如`Makefile`用于构建项目,或者测试数据文件。 为了实际运行和理解这些代码,你需要具备一定的C语言基础和对数论知识的理解...
基于openssl写的RSA的公钥加密,私钥解密,私钥加密,公钥解密的测试例子,密钥类型是rsa1024的PEM格式。
下面将详细介绍RSA算法的基本原理、C#中的实现方式以及如何进行加密解密操作。 **RSA算法基础** RSA(Rivest-Shamir-Adleman)算法是1977年由Ron Rivest、Adi Shamir和Leonard Adleman提出的。它基于大数因子分解...
RSA算法是一种非对称加密技术,它在信息安全领域扮演着重要的角色。非对称加密与对称加密的主要区别在于,它使用两个不同的密钥:一个公钥用于加密,另一个私钥用于解密。RSA的名字来源于它的发明者Ron Rivest、Adi ...
为了实现C#与Java之间的互通加解密,需要确保两边使用的RSA算法实现一致,包括密钥生成、填充算法及加密解密的具体实现。 - **密钥一致性**:确保C#与Java生成的公私钥对相同。 - **填充算法一致性**:两边都应采用...
在给出的链接中(https://blog.csdn.net/qq_37835111/article/details/87358779),作者提供了一个具体的示例,演示了如何在C# .NET环境下实现RSA加解密。压缩包文件"RSATool"可能包含了一些辅助工具或者示例代码,...
RSA算法是一种广泛应用于网络安全的非对称加密技术,它的全称是Rivest-Shamir-Adleman,由三位美国数学家Rivest、Shamir和Adleman在1977年提出。非对称加密算法与对称加密算法不同,它拥有两个密钥:公钥和私钥。...
"RSA加解密及公钥密生成工具"这个文件可能是包含上述功能的Delphi源码文件或者一个简单的GUI应用程序,它提供了一个用户友好的界面,使得用户能够轻松地生成RSA密钥对,并进行加密和解密操作。 通过学习和理解这段...
RSA加密解密是一种广泛应用于网络安全领域的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家在1977年提出,因此得名RSA。这种算法基于大整数因子分解的困难性,使得只有持有正确密钥的人才能...
在"RSA.rar_VS2010 RSA算法_rsa_rsa加解密"这个压缩包中,可能包含了使用VS2010实现RSA加解密的源代码示例,这可以帮助开发者理解和学习如何在实际项目中应用RSA算法。通过阅读和分析这些代码,可以深入理解RSA的...