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. Tomcat生成的session持久化到MySQL

    Telling Tomcat to save session records in MySQL 此部分内容摘自 MySQL cookbook 3th.具体内容不做翻译,哈哈,懒 The default ...

  2. i3wm菜单

    抛弃i3-dmenu-desktop吧,投入到 j4-demu-desktop 速度超快

  3. pycrypto安装各种方法试了,最后这种最快速最方便

    需要安装vs,然后按照如下步骤 这个不是在cmd中执行 而是在vs的命令行中执行

  4. 小程序之hover-class

    hover-class 属性主要是用来来指定元素的点击态效果.但是在在使用中要注意,大部分组件是不支持该属性的. 目前支持 hover-class 属性的组件有三个:view.button.navig ...

  5. 百战程序员——JDBC

    JDBC全称是什么? JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Jav ...

  6. Measuring Text Difficulty Using Parse-Tree Frequency

    https://nlp.lab.arizona.edu/sites/nlp.lab.arizona.edu/files/Kauchak-Leroy-Hogue-JASIST-2017.pdf In p ...

  7. Map的嵌套 练习

    Map的嵌套   练习 利用迭代和增强for循环的两种方式实现如下效果 package cn.ccc; import java.util.HashMap;import java.util.Iterat ...

  8. centos7图形界面安装

    系统笔者采用的是centos7 可以通过/etc/inittab文件看到 yum groupinstall "X Window System" -y             # 首 ...

  9. COOKIE和SESSION之间的区别以及用法

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  10. java web(三):ServletContext、session、ServletConfig、request、response对象

    上一篇讲了Servlet: 1)什么是Servlet[servlet本身就是一种Java类,这种Java类提供了web形式的方法,只要实现了servlet接口的类,都是一种servlet资源.] 2) ...