本文实例讲述了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^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e1和e2可以互换使用,即:
A=B^e1 mod n;B=A^e2 mod n;
三、RSA加密算法的使用
1、RSA密钥的生成,返回一个KeyPair对象
KeyPair 用于非对称加密,KeyPair中包含了一个公钥和一个私钥
/**
* 通过指定的密钥长度生成非对称的密钥对
* @param keySize 推荐使用1024,2048 ,不允许低于1024
* @return
*/
public static KeyPair generateRSAKeyPair(int keySize){
KeyPair ret = null;
try {
//1、准备生成
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
//2、初始化,设置秘钥长度
generator.initialize(keySize);
//3、生成,并且返回
ret = generator.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return ret;
}
2、获取私钥和公钥
PublicKey 和 PrivateKey 都是Key类型的
KeyPair keyPair = EncryptUtil.generateRSAKeyPair(1024); //获取公钥,可以给任何人 PublicKey publicKey = keyPair.getPublic(); //获取私钥 PrivateKey privateKey = keyPair.getPrivate();
3、RSA加密
/**
* RSA 加密
* @param data 需要加密的数据
* @param key 可以是 PublicKey,也可以是PrivateKey
* @return
*/
public static byte[] rsaEncrypt(byte[] data ,Key key){
byte[] ret = null;
if (data != null
&& data.length>0
&& key!=null) {
// 1、创建Cipher 使用RSA
try {
Cipher cipher = Cipher.getInstance("RSA");
//设置Key
cipher.init(Cipher.ENCRYPT_MODE,key);
ret = cipher.doFinal(data);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
}
return ret;
}
4、RSA解密
/**
* RSA 解密
* @param data 要解密的数据
* @param key 可以是 PublicKey,也可以是PrivateKey
* @return
*/
public static byte[] rsaDecrypt(byte[] data ,Key key){
byte[] ret = null;
if (data != null
&& data.length>0
&& key!=null) {
// 1、创建Cipher 使用RSA
try {
Cipher cipher = Cipher.getInstance("RSA");
//设置Key
cipher.init(Cipher.DECRYPT_MODE,key);
ret = cipher.doFinal(data);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
}
return ret;
}
5、公钥与私钥的存储
一对公钥和私钥创建好之后,我们需要存储起来以后使用
//获得公钥 私钥 PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); //编码将PublicKey和PrivateKey对象转换为字节数组,该字节数组为公钥、私钥的实际数据 byte[] publicKeyEncoded = publicKey.getEncoded(); byte[] privateKeyEncoded = privateKey.getEncoded(); //将字节数组通过Base64编码算法 编码成可见的字符形式 String publickey = Base64.encodeToString(publicKeyEncoded, Base64.NO_WRAP); String privatekey = 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(new String(str_publickey), Base64.NO_WRAP);
//构造X509EncodedKeySpec对象
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicdecode);
//指定加密算法
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//取得公钥
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
//解码
//获取私钥
//str_private 为私钥字符串形式的数据
byte[] privatedecode = Base64.decode(new String(str_private), Base64.NO_WRAP);
//构造X509EncodedKeySpec对象
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privatedecode);
//指定加密算法
keyFactory = KeyFactory.getInstance("RSA");
//取得私钥
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:
MD5在线加密工具:
http://tools./password/CreateMD5Password
迅雷、快车、旋风URL加密/解密工具:
http://tools./password/urlrethunder
在线散列/哈希算法加密工具:
http://tools./password/hash_encrypt
在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools./password/hash_md5_sha
在线sha1/sha224/sha256/sha384/sha512加密工具:
http://tools./password/sha_encode
更多关于java相关内容感兴趣的读者可查看本站专题:《Java数学运算技巧总结》、《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《java日期与时间操作技巧汇总》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
# java
# RSA
# 加密算法
# 分享Java常用几种加密算法(四种)
# Java 对称加密几种算法分别实现
# java异或加密算法
# 基于java实现的ECC加密算法示例
# java加密算法分享(rsa解密、对称加密、md5加密)
# 教你用Java实现RSA非对称加密算法
# Java常用加密算法实例总结
# java常见的五种加密算法使用方法举例
# 公钥
# 非对称
# 加密工具
# 加载
# 感兴趣
# 操作技巧
# 只能用
# 都是
# 是一种
# 相关内容
# 还可以
# 推荐使用
# 数据结构
# 给大家
# 要用
# 其中一个
# 更多关于
# 转换为
# 中就
# 所述
相关文章:
名字制作网站免费,所有小说网站的名字?
全景视频制作网站有哪些,全景图怎么做成网页?
用v-html解决Vue.js渲染中html标签不被解析的问题
制作国外网站的软件,国外有哪些比较优质的网站推荐?
如何在Windows服务器上快速搭建网站?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
制作网站外包平台,自动化接单网站有哪些?
三星网站视频制作教程下载,三星w23网页如何全屏?
建站之星代理如何优化在线客服效率?
电商平台网站制作流程,电商网站如何制作?
如何在自有机房高效搭建专业网站?
如何通过NAT技术实现内网高效建站?
如何通过VPS建站无需域名直接访问?
如何通过服务器快速搭建网站?完整步骤解析
如何实现建站之星域名转发设置?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
内部网站制作流程,如何建立公司内部网站?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
高防服务器租用首荐平台,企业级优惠套餐快速部署
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
制作宣传网站的软件,小红书可以宣传网站吗?
建站之星2.7模板快速切换与批量管理功能操作指南
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
招贴海报怎么做,什么是海报招贴?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
如何在阿里云购买域名并搭建网站?
如何在万网主机上快速搭建网站?
香港服务器WordPress建站指南:SEO优化与高效部署策略
建站OpenVZ教程与优化策略:配置指南与性能提升
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何快速查询网址的建站时间与历史轨迹?
c++ stringstream用法详解_c++字符串与数字转换利器
定制建站价位费用解析与套餐推荐全攻略
如何在宝塔面板创建新站点?
再谈Python中的字符串与字符编码(推荐)
佛山网站制作系统,佛山企业变更地址网上办理步骤?
linux top下的 minerd 木马清除方法
网站制作知乎推荐,想做自己的网站用什么工具比较好?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
如何高效搭建专业期货交易平台网站?
如何确认建站备案号应放置的具体位置?
香港服务器如何优化才能显著提升网站加载速度?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
建站主机选哪种环境更利于SEO优化?
广州营销型建站服务商推荐:技术优势与SEO优化解析
创业网站制作流程,创业网站可靠吗?
*请认真填写需求信息,我们会在24小时内与您取得联系。