java实现的RSA加密算法详解
本文实例讲述了java实现的RSA加密算法。分享给大家供大家参考,具体如下:
一、什么是非对称加密
1、加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密
2、密钥分为:公钥,私钥
公钥:可以对外给任何人的加密和解密的密码,是公开的
私钥:通过私钥可以生成公钥,但从公钥被认为无法生成公钥(被推导出的概率小到不考虑)
3、当将要加密的内容用公钥加密的时候,只能用私钥来解密
当将要加密的内容用私钥加密的时候,只能用公钥来解密
4、公钥与私钥的关系,利用一个简单的公式来生成公钥和私钥,即非对称加密的公钥和私钥之间存在某一个公式关系
5、常见的非对称加密算法
RSA,DSA
二、什么是RSA算法
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2modn;B=A^e1modn;(公钥加密体制中,一般用公钥加密,私钥解密)
e1和e2可以互换使用,即:
A=B^e1modn;B=A^e2modn;
三、RSA加密算法的使用
1、RSA密钥的生成,返回一个KeyPair对象
KeyPair用于非对称加密,KeyPair中包含了一个公钥和一个私钥
/**
*通过指定的密钥长度生成非对称的密钥对
*@paramkeySize推荐使用1024,2048,不允许低于1024
*@return
*/
publicstaticKeyPairgenerateRSAKeyPair(intkeySize){
KeyPairret=null;
try{
//1、准备生成
KeyPairGeneratorgenerator=KeyPairGenerator.getInstance("RSA");
//2、初始化,设置秘钥长度
generator.initialize(keySize);
//3、生成,并且返回
ret=generator.generateKeyPair();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}
returnret;
}
2、获取私钥和公钥
PublicKey和PrivateKey都是Key类型的
KeyPairkeyPair=EncryptUtil.generateRSAKeyPair(1024); //获取公钥,可以给任何人 PublicKeypublicKey=keyPair.getPublic(); //获取私钥 PrivateKeyprivateKey=keyPair.getPrivate();
3、RSA加密
/**
*RSA加密
*@paramdata需要加密的数据
*@paramkey可以是PublicKey,也可以是PrivateKey
*@return
*/
publicstaticbyte[]rsaEncrypt(byte[]data,Keykey){
byte[]ret=null;
if(data!=null
&&data.length>0
&&key!=null){
//1、创建Cipher使用RSA
try{
Ciphercipher=Cipher.getInstance("RSA");
//设置Key
cipher.init(Cipher.ENCRYPT_MODE,key);
ret=cipher.doFinal(data);
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(NoSuchPaddingExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(BadPaddingExceptione){
e.printStackTrace();
}catch(IllegalBlockSizeExceptione){
e.printStackTrace();
}
}
returnret;
}
4、RSA解密
/**
*RSA解密
*@paramdata要解密的数据
*@paramkey可以是PublicKey,也可以是PrivateKey
*@return
*/
publicstaticbyte[]rsaDecrypt(byte[]data,Keykey){
byte[]ret=null;
if(data!=null
&&data.length>0
&&key!=null){
//1、创建Cipher使用RSA
try{
Ciphercipher=Cipher.getInstance("RSA");
//设置Key
cipher.init(Cipher.DECRYPT_MODE,key);
ret=cipher.doFinal(data);
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(NoSuchPaddingExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(BadPaddingExceptione){
e.printStackTrace();
}catch(IllegalBlockSizeExceptione){
e.printStackTrace();
}
}
returnret;
}
5、公钥与私钥的存储
一对公钥和私钥创建好之后,我们需要存储起来以后使用
//获得公钥私钥 PrivateKeyprivateKey=keyPair.getPrivate(); PublicKeypublicKey=keyPair.getPublic(); //编码将PublicKey和PrivateKey对象转换为字节数组,该字节数组为公钥、私钥的实际数据 byte[]publicKeyEncoded=publicKey.getEncoded(); byte[]privateKeyEncoded=privateKey.getEncoded(); //将字节数组通过Base64编码算法编码成可见的字符形式 Stringpublickey=Base64.encodeToString(publicKeyEncoded,Base64.NO_WRAP); Stringprivatekey=Base64.encodeToString(privateKeyEncoded,Base64.NO_WRAP); //进行存储操作 。。。。
6、公钥与私钥的加载
通常1、获取密钥对2、获取公钥、私钥3、保存公钥、私钥,保存形式基本为字符串形式
那么在以后的使用中就需要获取公钥和私钥来使用
需要知道:
6.1、KeyFactory可以来加载相应的公钥和私钥
6.2、公钥加载使用X509EncodedKeySpec(byte[])
6.3、私钥加载使用PCKS8EncodedKeySpec(byte[])
//获取公钥
//str_publickey为公钥字符串形式数据(公钥先编码成byte[]在形成字符串)
//解码
byte[]publicdecode=Base64.decode(newString(str_publickey),Base64.NO_WRAP);
//构造X509EncodedKeySpec对象
X509EncodedKeySpecpublicKeySpec=newX509EncodedKeySpec(publicdecode);
//指定加密算法
KeyFactorykeyFactory=KeyFactory.getInstance("RSA");
//取得公钥
PublicKeypublicKey=keyFactory.generatePublic(publicKeySpec);
//解码
//获取私钥
//str_private为私钥字符串形式的数据
byte[]privatedecode=Base64.decode(newString(str_private),Base64.NO_WRAP);
//构造X509EncodedKeySpec对象
PKCS8EncodedKeySpecprivateKeySpec=newPKCS8EncodedKeySpec(privatedecode);
//指定加密算法
keyFactory=KeyFactory.getInstance("RSA");
//取得私钥
PrivateKeyprivateKey=keyFactory.generatePrivate(privateKeySpec);
PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:
MD5在线加密工具:
http://tools.jb51.net/password/CreateMD5Password
迅雷、快车、旋风URL加密/解密工具:
http://tools.jb51.net/password/urlrethunder
在线散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
在线sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode
更多关于java相关内容感兴趣的读者可查看本站专题:《Java数学运算技巧总结》、《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《java日期与时间操作技巧汇总》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。