浅析RSA公钥密码以及使用Java自带API实现RSA的密钥生成和加解密

RSA是目前最流行的非对称密码,目前普遍应用在数字签名,数字证书上。java

那么什么是非对称密码呢?就是给明文加密的密钥和给密文解密的密钥是不同的。其中,对外暴露的是公钥,本身保留的是私钥,若是用公钥加密,就只能用私钥解密,若是用私钥加密就只能用公钥解密。git

因此实现非对称密码,须要生成公私钥对。而因为RSA的非对称密码原理是基于大素数因子的难分解性,因此每次在生成公私钥对的时候在一开始都会随机产生两个素数p,q。因此每次生成的公私钥对也是不相同的。算法


接下来咱们就开始用Java自带的API完成RSA的公私钥对生成和加密解密操做。数组

在Java中,对于非对称密码操做的一个类是:KeyPairGenerator,密钥对生成器类,这个类在java.security.KeyPairGenerator包下。这个类在产生对象的时候须要往构造方法中传入一个String的值,告诉密钥对生成器生成的是哪一中密码的密钥对。工具

//使用RSA算法得到密钥对生成器对象keyPairGenerator
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//设置密钥长度为1024
keyPairGenerator.initialize(1024);
//生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//获取公钥
Key publicKey = keyPair.getPublic();
//获取私钥
Key privateKey = keyPair.getPrivate();

获取到公私钥对的时候,为了方便后续操做,咱们通常将这两个key对象持久化到本地保存起来。ui

在Java中提供了Cipher加密解密器来实现加解密操做,这个类在import javax.crypto.Cipher包下。在产生这个加密解密器对象的时候,须要在他的构造方法中传俩个值,一个是功能,一个是算法种类。功能就是说告诉他接下来这个对象是须要作加密操做仍是解密操做,算法种类就是告诉他使用的加密算法。编码

//获取一个加密算法为RSA的加解密器对象cipher。
Cipher cipher = Cipher.getInstance("RSA");
//设置为加密模式,并将公钥给cipher。
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//得到密文
byte[] secret = cipher.doFinal(str.getBytes());
//进行Base64编码并返回
return new BASE64Encoder().encode(secret);

一样的,解密算法也是使用Cilpher。加密

Cipher cipher = Cipher.getInstance("RSA");
//传递私钥,设置为解密模式。
cipher.init(Cipher.DECRYPT_MODE, privateKey);
//解密器解密由Base64解码后的密文,得到明文字节数组
byte[] b = cipher.doFinal(new BASE64Decoder().decodeBuffer(secret));
//转换成字符串
return new String(b);

以上就是使用Java自带API完成RSA密钥对生成和加密解密的方法。.net

============================================================code

我已经把这个RSA加密的工具类放到了GitOSC上,你们须要的话能够下下来看。

文中RSA工具类

相关文章
相关标签/搜索