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上,你们须要的话能够下下来看。