当前位置: 首页 > news >正文

Android RSA 加解密

文章目录

  • 一、RSA简介
  • 二、RSA 原理介绍
  • 三、RSA 秘钥对生成
    • 1. 密钥对生成
    • 2. 获取公钥
    • 3. 获取私钥
  • 四、PublicKey 和PrivateKey 的保存
    • 1. 获取公钥十六进制字符串
    • 1. 获取私钥十六进制字符串
  • 五、PublicKey 和 PrivateKey 加载
    • 1. 加载公钥
    • 2. 加载私钥
  • 六、 RSA加解密
    • 1. RSA 支持三种加密方式
    • 2.RSA加密
    • 3. RSA解密
  • 七、实例代码

一、RSA简介

RSA是一种常用的非对称加密算法,所谓非对称加密是指使用一对密钥(公钥和私钥)进行加密和解密,公钥人人都可以获得,用于加密数据,私钥保存在服务器中,用于解密数据。加密解密过程如下:

在这里插入图片描述
使用RSA进行加密解密,其优点是非常不容易破解,缺点是和对称加密(如AES)相比,加密速度较慢。因此,实际使用中,常常将对称加密和非对称加密结合使用,即使用非对称加密协商对称加密的密钥,使用对称加密密钥加密传输内容。

二、RSA 原理介绍

RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困 难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有

三、RSA 秘钥对生成

1. 密钥对生成

 private static KeyPair genKeyPair() {try {KeyPairGenerator keyPairGen = null;keyPairGen = KeyPairGenerator.getInstance("RSA");keyPairGen.initialize(2048, new SecureRandom());return keyPairGen.generateKeyPair();} catch (Exception e) {e.printStackTrace();}return null;}

2. 获取公钥

 public static PublicKey getPublicKey(KeyPair keyPair){return  keyPair.getPublic();}

3. 获取私钥

 public static PrivateKey getPrivateKey(KeyPair keyPair){return  keyPair.getPrivate();}

四、PublicKey 和PrivateKey 的保存

1. 获取公钥十六进制字符串

  public static  String getHexStrPublicKey(PublicKey publicKey){byte[] publicKeyEncoded = publicKey.getEncoded();return  ConvectionUtils.byte2HexStr(publicKeyEncoded);}

1. 获取私钥十六进制字符串

public static  String getHexStrPrivateKey(PrivateKey privateKey){byte[] privateKeyEncoded = privateKey.getEncoded();return  ConvectionUtils.byte2HexStr(privateKeyEncoded);
}

五、PublicKey 和 PrivateKey 加载

1. 加载公钥

  public static PublicKey loadPublicKey(String publicKeyStr) throws Exception {try {byte[] buffer = ConvectionUtils.hexStr2Bytes(publicKeyStr);KeyFactory keyFactory = KeyFactory.getInstance("RSA");X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);return keyFactory.generatePublic(keySpec);} catch (Exception e) {e.printStackTrace();}return null;}

2. 加载私钥

    public static PrivateKey loadPrivateKey(String privateKeyStr) throws Exception {try {byte[] buffer =ConvectionUtils.hexStr2Bytes(privateKeyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return keyFactory.generatePrivate(keySpec);} catch (Exception e) {e.printStackTrace();}return null;}

六、 RSA加解密

1. RSA 支持三种加密方式

  • RSA/ECB/PKCS1Padding (1024, 2048)
  • RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
  • RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)

2.RSA加密

 public static byte[] encrypt(PublicKey publicKey, byte[] plainTextData)  {if (publicKey == null || plainTextData == null) {return null;}Cipher cipher;try {cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(plainTextData);} catch (Exception e) {e.printStackTrace();}return null;}

3. RSA解密

public static byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData)  {if (privateKey == null || cipherData == null) {return null;}Cipher cipher = null;try {cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(cipherData);} catch (Exception e) {e.printStackTrace();}return null;} 

RSA在线加密解密

七、实例代码

AndroidEncryption

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • stm32F1xx时钟配置分析总结
  • linux快速入门-学习笔记
  • Adobe“加速”创意人士开启设计新篇章
  • MongoDB教程(二十二):MongoDB固定集合
  • [k8s源码]8.deltaFIFO
  • Vue Router基础
  • BSV区块链在人工智能时代的数字化转型中的角色
  • 【快速实践 OpenCV morphology】形态学操作:腐蚀、膨胀、开运算、闭运算
  • 无人机飞行姿态俯仰、横滚、偏航、油门详解
  • vite+react+ts+Rust来进行前后端web开发(hello world)
  • 后端返回一个图片链接,前端如何实现下载功能?
  • 零基础入门:创建一个简单的Python爬虫管理系统
  • 杰发科技AC7840——SENT数据解析及软件Sent发送的实现
  • 【Node.js基础04】包的理解与使用
  • 如何使用 API list 极狐GitLab 容器镜像仓库中的 tag?
  • 「面试题」如何实现一个圣杯布局?
  • 【技术性】Search知识
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • CentOS从零开始部署Nodejs项目
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JSONP原理
  • Nodejs和JavaWeb协助开发
  • select2 取值 遍历 设置默认值
  • vue 个人积累(使用工具,组件)
  • 构造函数(constructor)与原型链(prototype)关系
  • 猴子数据域名防封接口降低小说被封的风险
  • 配置 PM2 实现代码自动发布
  • 提醒我喝水chrome插件开发指南
  • 小而合理的前端理论:rscss和rsjs
  • 学习Vue.js的五个小例子
  • 原生js练习题---第五课
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​字​节​一​面​
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma pack(1)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (4) PIVOT 和 UPIVOT 的使用
  • (C11) 泛型表达式
  • (二十六)Java 数据结构
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)甲方乙方——赵民谈找工作
  • (转)母版页和相对路径
  • (转载)Linux网络编程入门
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *Django中的Ajax 纯js的书写样式1
  • .gitignore文件忽略的内容不生效问题解决
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 快速重构概要1
  • .net 生成二级域名
  • .NET 通过系统影子账户实现权限维持