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版)的更多相关文章

  1. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  2. 【Java】分布式自增ID算法---雪花算法 (snowflake,Java版)

    一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. 方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID.这种呢,优点是可以体现全局的递增 ...

  3. 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)

    短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...

  4. 常见排序算法总结(java版)

    一.冒泡排序 1.原理:相邻元素两两比较,大的往后放.第一次完毕,最大值在最大索引处. 即使用相邻的两个元素一次比价,依次将最大的数放到最后. 2.代码: public static void bub ...

  5. Selenium启动Firefox示例(java版)

    本文示例使用selenium启动Firefox,并将浏览器窗口最大化,在百度搜索框内输入"HelloWorld",最后点击搜索按钮. 源代码如下: 1 package com.se ...

  6. 【算法】快速排序-Java版

    说在前面的话 平常码砖的时候,对于一个数组进行排序更多的是起泡排序,起泡排序对于一般不是很长的数组进行操作没什么问题,一旦数组过大,很明显效率低. 而快排是对起泡排序的一种改进,效率明显优高. 快排思 ...

  7. 【云栖社区001-数据结构】如何实现一个高效的单向链表逆序输出(Java版)

    如题 动手之前,发现自己很擅长用C语言来写链表. 不过,既然自己做的是Java开发,那么还是用Java实现这个算法吧:毕竟,以后的若干年里都差不多要跟Java打交道了. 于是,先将Java版的链表自学 ...

  8. java版gRPC实战之二:服务发布和调用

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. ubuntu命令行下java工程编辑与算法(第四版)环境配置

    ubuntu命令行下java工程编辑与算法(第四版)环境配置 java 命令行 javac java 在学习算法(第四版)中的实例时,因需要安装配套的java编译环境,可是在编译java文件的时候总是 ...

随机推荐

  1. Ubuntu文件系统

    (). 关于Linux中的文件: (). 在Linux系统中, 一切都是文件 : 所有数据都是文件,包括设备. (). 最小的数据存储单元也是文件. (). 文件系统: 文件系统就是文件的组织和管理方 ...

  2. mysql 导入数据库问题

    今天数据库迁移测试,发现存储过程导入不了,提示如下错误: Cannot load from mysql.proc. The table is probably corrupted 原因是mysql5. ...

  3. Python IO密集型任务、计算密集型任务,以及多线程、多进程

    对于IO密集型任务: 直接执行用时:10.0333秒 多线程执行用时:4.0156秒 多进程执行用时:5.0182秒 说明多线程适合IO密集型任务. 对于计算密集型任务 直接执行用时:10.0273秒 ...

  4. java的基础语法(标识符 修饰符 关键字)

    Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...

  5. vue 数字随机滚动(数字递增)

    html: <span v-for="i in numArr">{{i}}</span>   data: numArr: [], methods: perN ...

  6. Eclipse导入已有的项目后项目报错的解决办法

    第一种:jsp报错 选择windows-->preference-->列表找到Validation-->点击Disable All ->> Apply ->> ...

  7. STM32L071CBTX操作ECC508

    因为我是在stm32上面做的加密操作,所以我只对stm32的方案做总结. 1.ATECC508的底层接口是i2c的,工程中跟i2c相关的操作放在文件hal_stm32l0_ateccx08_i2c.c ...

  8. ubuntu16.04 安装java

    1.从官网下载 jdk-8u191-linux-x64.tar.gz(https://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...

  9. ACM山东工商 栈和队列算法练习

    #include <stdio.h>#include <stdlib.h> #define SIZE   20 typedef struct hold{ char sign[S ...

  10. Resin安装配置

    在linux下安装Resin过程整理   下载Resin, http://caucho.com/products/resin/download#download   检查JDK是否安装,环境是否配置 ...