RAS算法简单示例(Java版)
RSA算法——由三位发明者Ronald Rivest、Adi Shamir 和 Leonard Adleman 姓氏的首字母拼在一起组成。
RSA算法属于“公开密钥加密技术”,其加密和解密的秘钥不同。
用于加密的密钥可以公开,因此称为“公钥”,而用于解密的密钥是只有自己才知道,称为“私钥”。
简单算法如下所示:
#####创建公钥#####
(1)选两个质数a,b。
如:a=13,b=29
(2)求c=a*b。
如:c=377
(3)求d=(a-1)*(b-1)
如:d=336
(4)选择和d没有公约数的e
如:e = 5
(5)得到公钥(c,e)
PublicKey [c=377, e=5]
#####创建私钥#####
(1)求出f,使其满足(f*e)÷d余1
如:f=269
(2)得到私钥(c,f)
PrivateKey [c=377, f=269]
###使用公钥加密:密文 =((明文的e次方)÷c)的余数
###使用私钥解密:明文 =((密文的f次方)÷c)的余数
代码:
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List; class PublicKey {
int c;
int e; @Override
public String toString() {
return "PublicKey [c=" + c + ", e=" + e + "]";
}
} class PrivateKey {
int c;
int f; @Override
public String toString() {
return "PrivateKey [c=" + c + ", f=" + f + "]";
}
} /**
*
* @author Andy Hoo
*
*/
public class RSA {
PublicKey publicKey = new PublicKey();
PrivateKey privateKey = new PrivateKey(); public void mKey() {
System.out.println("#####创建公钥#####");
System.out.println("(1)选两个质数a,b。");
int a = 13, b = 29;
System.out.println(" 如:a=" + a + ",b=" + b);
System.out.println("(2)求c=a*b。");
int c = a * b;
System.out.println(" 如:c=" + c);
System.out.println("(3)求d=(a-1)*(b-1)");
int d = (a - 1) * (b - 1);
System.out.println(" 如:d=" + d);
System.out.println("(4)选择和d没有公约数的e");
int e;
for (e = 2; e < d; e++) {
if (!getCommonDivisor(d, e)) {
break;
}
}
System.out.println(" 如:e = " + e); System.out.println("(5)得到公钥(c,e)");
publicKey.c = c;
publicKey.e = e;
System.out.println(publicKey); System.out.println("#####创建私钥#####");
System.out.println("(1)求出f,使其满足(f*e)÷d余1");
int f = 0;
for (f = 1; f <= d; f++) {
if ((f * e) % d == 1) {
System.out.println(" 如:f=" + f);
break;
}
}
System.out.println("(2)得到私钥(c,f)");
privateKey.c = c;
privateKey.f = f;
System.out.println(privateKey);
} /**
* 加密
*
* @param original原文
* @return 密文
*/
public int encrypt(int original) {
System.out.println("###使用公钥加密:密文 =((明文的e次方)÷c)的余数");
int cryptograph = powAndRemainder(original, publicKey.e, publicKey.c);
return cryptograph;
} /**
* 解密
*
* @param cryptograph密文
*/
public int decrypt(int cryptograph) {
System.out.println("###使用私钥解密:明文 =((密文的f次方)÷c)的余数");
int after = powAndRemainder(cryptograph, privateKey.f, privateKey.c);
return after;
} /**
* 加密解密通用方法: (a的b次方)%c
*/
public static int powAndRemainder(int a, int b, int c) {
BigDecimal bd = new BigDecimal(a);
// 求幂
BigDecimal bd2 = bd.pow(b);
// 取余数
BigDecimal[] dr = bd2.divideAndRemainder(new BigDecimal(c));
return dr[1].intValue();
} /**
* 求公约数
*
* @param a1
* @param a2
* @return true有公约数/false没有公约数
*/
public static boolean getCommonDivisor(int a1, int a2) {
List<Integer> commonDivisor = new ArrayList<Integer>();
int min = Math.min(a1, a2);
for (int n = 2; n <= min; n++) {
if (a1 % n == 0 && a2 % n == 0) {
commonDivisor.add(n);
}
}
if (commonDivisor.size() != 0) {
System.out.println(a1 + "," + a2 + "有公约数" + commonDivisor);
return true;
} else {
System.out.println(a1 + "," + a2 + "没有公约数");
return false;
}
} public static void main(String[] args) {
RSA rsa = new RSA();
// 获取秘钥
rsa.mKey();
// 原文
int original = 101;
System.out.println("原文:" + original);
// 加密
int cryptograph = rsa.encrypt(original);
System.out.println("密文:" + cryptograph);
// 解密
int after = rsa.decrypt(cryptograph);
System.out.println("解密后:" + after);
}
}
RAS算法简单示例(Java版)的更多相关文章
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- 【Java】分布式自增ID算法---雪花算法 (snowflake,Java版)
一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. 方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID.这种呢,优点是可以体现全局的递增 ...
- 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)
短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...
- 常见排序算法总结(java版)
一.冒泡排序 1.原理:相邻元素两两比较,大的往后放.第一次完毕,最大值在最大索引处. 即使用相邻的两个元素一次比价,依次将最大的数放到最后. 2.代码: public static void bub ...
- Selenium启动Firefox示例(java版)
本文示例使用selenium启动Firefox,并将浏览器窗口最大化,在百度搜索框内输入"HelloWorld",最后点击搜索按钮. 源代码如下: 1 package com.se ...
- 【算法】快速排序-Java版
说在前面的话 平常码砖的时候,对于一个数组进行排序更多的是起泡排序,起泡排序对于一般不是很长的数组进行操作没什么问题,一旦数组过大,很明显效率低. 而快排是对起泡排序的一种改进,效率明显优高. 快排思 ...
- 【云栖社区001-数据结构】如何实现一个高效的单向链表逆序输出(Java版)
如题 动手之前,发现自己很擅长用C语言来写链表. 不过,既然自己做的是Java开发,那么还是用Java实现这个算法吧:毕竟,以后的若干年里都差不多要跟Java打交道了. 于是,先将Java版的链表自学 ...
- java版gRPC实战之二:服务发布和调用
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- ubuntu命令行下java工程编辑与算法(第四版)环境配置
ubuntu命令行下java工程编辑与算法(第四版)环境配置 java 命令行 javac java 在学习算法(第四版)中的实例时,因需要安装配套的java编译环境,可是在编译java文件的时候总是 ...
随机推荐
- 聊聊pytorch中的DataLoader
实际上pytorch在定义dataloader的时候是需要传入很多参数的,比如,number_workers, pin_memory, 以及shuffle, dataset等,其中sampler参数算 ...
- ArcMap图层属性表中添加图片
一看标题是不是有点懵?懵就对了!刚接触到的时候我也有点懵,属性表不是都是文本啊数字啊之类的格式,怎么还可以存图片,下面就带大家来看看吧! 一.关于图层入库问题 图层进入数据库和图层以shp格式存储时, ...
- Mawawa CSS 学习之旅 Display
CSS 类型之 Display 更新时间: 2018-2-10: 一个良好的布局结构从 display 开始! 分类:外部值.内部值.列表值.属性值.混合值.显示值.全局值: 一.外部值 作用:主要用 ...
- 30天代码day2 Operators
Operators These allow you to perform certain operations on your data. There are 3 basic types: Unary ...
- HTML5网页制作好好玩啊
---恢复内容开始--- 这两天在看HTML5,由于学习的需要,所以要学的,嗯,这个整人还是很有意思的(但是超超是好人,从不干坏事) 现在请欣赏一下我的代码和图片吧!(想整人的小伙伴可以自己copy来 ...
- JS处理日期&字符串格式相互转换
之前找过一些获取系统日期以及日期&字符串格式相互转换的方式,但总体自我感觉来说还是以下的方式会更适合一些. 如有更好的方式,望大家多多赐教和交流,谢谢! 2016年曾写过一次,不过只是发了一下 ...
- MySQL更新死锁问题【转,纯为学习】
https://blog.csdn.net/a12345555555/article/details/72828366 -08-13 15:12:44 [ERROR] com.zhubajie.cou ...
- docker安装tomcat并部署web项目
docker安装tomcat就不说了,网上一大把 启动tomcat: docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tom ...
- Kali安装zmap简单介绍
zmap是一个非常方便的扫描器,跟nmap和masscan一样,不过区别在于zmap他快,号称是一小时扫遍整个互联网.主要使用方式是TCP SYN scan.TCP connectscan.UDP s ...
- VS 2017 + opencv4.0
完全参考这一文章, 非常详细: https://blog.csdn.net/qq_41175905/article/details/80560429 记录自己遇到的问题: 1. VS 2017 专业版 ...