全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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^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常见的五种加密算法使用方法举例  # 公钥  # 非对称  # 加密工具  # 加载  # 感兴趣  # 操作技巧  # 只能用  # 都是  # 是一种  # 相关内容  # 还可以  # 推荐使用  # 数据结构  # 给大家  # 要用  # 其中一个  # 更多关于  # 转换为  # 中就  # 所述 


相关文章: 公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  独立制作一个网站多少钱,建立网站需要花多少钱?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何零基础在云服务器搭建WordPress站点?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何通过西部数码建站助手快速创建专业网站?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  建站之星与建站宝盒如何选择最佳方案?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  如何使用Golang table-driven基准测试_多组数据测量函数效率  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  建站之星如何开启自定义404页面避免用户流失?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  建站之星安装模板失败:服务器环境不兼容?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何选择高性价比服务器搭建个人网站?  建站之星如何取消后台验证码生成?  如何获取PHP WAP自助建站系统源码?  seo网站制作优化,网站SEO优化步骤有哪些?  已有域名如何快速搭建专属网站?  网站制作免费,什么网站能看正片电影?  如何快速搭建FTP站点实现文件共享?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  网站代码制作软件有哪些,如何生成自己网站的代码?  如何选择高效响应式自助建站源码系统?  如何在万网自助建站中设置域名及备案?  西安大型网站制作公司,西安招聘网站最好的是哪个?  如何快速搭建二级域名独立网站?  韩国服务器如何优化跨境访问实现高效连接?  建站OpenVZ教程与优化策略:配置指南与性能提升  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  成都响应式网站开发,dw怎么把手机适应页面变成网页?  如何高效完成独享虚拟主机建站?  如何在服务器上三步完成建站并提升流量?  视频网站制作教程,怎么样制作优酷网的小视频?  北京网站制作公司哪家好一点,北京租房网站有哪些?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  建站主机功能解析:服务器选择与快速搭建指南  如何快速选择适合个人网站的云服务器配置?  网站制作公司排行榜,抖音怎样做个人官方网站  如何用IIS7快速搭建并优化网站站点?  如何用好域名打造高点击率的自主建站?  ,想在网上投简历,哪几个网站比较好?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  如何获取开源自助建站系统免费下载链接?  大连网站制作公司哪家好一点,大连买房网站哪个好?  代刷网站制作软件,别人代刷火车票靠谱吗? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。