RSA
时间:2022-07-25
本文章向大家介绍RSA,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
RSA算法
非对称加密算法的一种
- 随意选择两个大的质数p和q,p不等于q,计算N=pq。
- 根据欧拉函数,不大于N且与N互质的整数個数為(p-1)(q-1)。
- 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)。
- 用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))。 (d*e)%((p-1)(q-1))=1
- 将p和q的记录销毁。
- 以上内容中,(N,e)是公钥,(N,d)是私钥。
公钥对象转为String
byte[] keyByte=(Key)publicKey.getEncoded();
String key=Base64.getEncoder().encodeToString(keyByte);
String 转公钥对象
byte[] keyBytes = Base64.getDecoder().decode(key); //衔接 先转换byte[]
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); //RSA算法
Key publicK = keyFactory.generatePublic(x509KeySpec);
私钥转String
byte[] keyByte=(Key)privateKey.getEncoded();
String key=Base64.getEncoder().encodeToString(keyByte);
String转私钥
byte[] keyBytes = Base64.getDecoder().decode(key); //先转换byte[]
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
例:有A,B两人每人一对秘钥
prkA,pukA,prkB,pukB,A向B发送信息
- A用B的公钥进行加密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, pukB); byte[]data = cipher.doFinal(data, 0, data.length()); //加密后数据(全为数字),encodetoString()转为字符, //注:也可以循环分段加密,需添加流,每段为一个byte[],写入流中(ByteArrayOutputStream),最后读出流中byte[]
- A用A的私钥进行签名(写上名字) 注:sign为byte[]类型
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); //签名算法
signature.initSign(prkA);
signature.update(data);
signature.sign()返回签名byte[] 同上可转为字符串.
- B用自己的私钥进行解密 同加密过程 注意加密返回byte 解密也需要byte
- 根据解密内容,及A的公钥进行验证
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(publicKey);
signature.update(data);
signature.verify(Base64.getDecoder().decode(sign));
//注意验证时需提供解密内容,A的签名sign(注意String还是byte[]),以及A的公钥 返回boolean
- 2017奇葩机器人大盘点:Sophia想生孩子,Atlas后空翻,贝佐斯骑高达
- silverlight:分享一个不错的自定义布局CollectionFlow(可用于制作相册的哦!)
- 无法取得ConnectionSettings的问题
- DataTable,List去重复记录的方法
- Uploadify的一点总结
- 自动驾驶时代,中国移动要以怎样的姿势进入?
- JQuery中文日期控件
- Silverlight中的帧
- 窗口自动弹出浏览器显示广告的问题
- Instagram 开源用于 Python 3的MonkeyType 工具
- 拼凑了几个自定义的Panel(包括FishEyePanel,WrapPanel等几个常用的布局)
- jquery获取父级一级节点的序号
- Docker容器学习梳理--基础知识(2)
- Blend生成的TransformGroup如何引用?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法