简单实现RAS加密-java
简单实现RSA加密
- 简单实现RSA加密
- 理论基础
- 互质概念
- 欧拉函数和欧拉定理
- 模反元素
- RSA的简单实现
- 加密和解密
- 代码
- 理论基础
理论基础
实现RSA的算法需要一部分数学基础。
互质概念
如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。
关于互质关系,不难得到以下结论:
1. 任意两个质数构成互质关系,比如13和61。2. 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10。3. 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。4. 1和任意一个自然数是都是互质关系,比如1和99。5. p是大于1的整数,则p和p-1构成互质关系,比如57和56。6. p是大于1的奇数,则p和p-2构成互质关系,比如17和15。
欧拉函数和欧拉定理
任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?)
计算这个值的方法就叫做欧拉函数,以φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。
欧拉函数的用处,在于欧拉定理。”欧拉定理”指的是:
如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立。a的φ(n)次方被n除的余数为1。或者说,a的φ(n)次方减去1,可以被n整除。比如,3和7互质,而7的欧拉函数φ(7)等于6,所以3的6次方(729)减去1,可以被7整除(728/7=104)。
模反元素
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。这时,b就叫做a的”模反元素”。
RSA的简单实现
第一步,随机选择两个不相等的质数p和q。
第二步,计算p和q的乘积n。
第三步,计算n的欧拉函数φ(n)。
根据公式:
φ(n) = (p-1)(q-1)
第四步,随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。
第五步,计算e对于φ(n)的模反元素d。
根据公式:
ed - 1 = kφ(n)
这个方程可以用”扩展欧几里得算法”求解,此处省略具体过程。
第六步,将n和e封装成公钥,n和d封装成私钥。
加密和解密
有了公钥和密钥,就能进行加密和解密了。
加密要用公钥 (n,e),所谓”加密”,就是算出下式的c:
me ≡ c (mod n)
解密要用私钥(n,d),通过已知的c算出m:
cd ≡ m (mod n)
至此,”加密–解密”的整个过程全部完成。
代码
package etc;import java.util.Random;/*** 简单实现RAS加密* Created by Administrator on 2018/2/2.*/
public class RSASimple {public static void main(String[] args) {buildN();buildD(E,faiN);while (d<=1){buildN();buildD(E,faiN);}System.out.println("public:"+N+","+E);System.out.println("private:"+N+","+d);long message=RSASimpleBoxing(65);System.out.println(message);System.out.println(RSASimpleReboxing(message));}//加密public static long RSASimpleBoxing(long m){long c= 1;for(int i=0;i<E;i++){c*=m;if(c>N)c%=N;}return c;}//解密public static long RSASimpleReboxing(long c){long m=1;for(int i=0;i<d;i++){m*=c;if(m>N)m%=N;}return m;}//测试数据public static final int E=17;public static long p=61;public static long q=53;public static long N=3233;public static long faiN=3120;public static long d=2753;//随机生成p,qpublic static void buildN(){Random r=new Random();int[] primeArr=new int[100];int temp=2,num=0;while (num!=100){if(isPrime(temp)){primeArr[num]=temp;num++;}temp++;}p= primeArr[r.nextInt(100)];q= primeArr[r.nextInt(100)];while (p==q){q=primeArr[r.nextInt(100)];}N= p*q;faiN=(p-1)*(q-1);
// System.out.println(p+" "+q+" "+N+" "+faiN);}//计算dpublic static void buildD(long E,long faiN){long[] result=extend_gcd(E,faiN);d=result[1];}//判断素数public static boolean isPrime(long n){if(n<=1)return false;else if(n==2)return true;else if(n==4)return false;for(int i=2;i<n/2;i++){if(n%i==0){return false;}}return true;}//扩展欧几里得算法,已知ab求解xy//返回的数组中,第一个值是最大公约数,第二个值表示C++语言实现中的x,第三个值表示y。//TODO:这个算法会让生成的d为负数,造成解密失败public static long[] extend_gcd(long a,long b){long ans;long[] result=new long[3];if(b==0){result[0]=a;result[1]=1;result[2]=0;return result;}long [] temp=extend_gcd(b,a%b);ans = temp[0];result[0]=ans;result[1]=temp[2];result[2]=temp[1]-(a/b)*temp[2];return result;}}
参考博文:
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
http://blog.csdn.net/zhjchengfeng5/article/details/7786595
简单实现RAS加密-java相关推荐
- 简单的汉字加密-java
import java.util.*; import java.lang.*; public class DayThreeEee{ public static void main (String ar ...
- Java简单实现DES加密解密算法
Java简单实现DES加密解密算法 文章目录 Java简单实现DES加密解密算法 DES算法介绍 实现相关java类 代码实现 DES算法介绍 DEC加密算法属于对称加密,即利用指定的密钥,按照密码的 ...
- 小工具分享----Java简单的文字加密解密
今天有空自己制作了一个jar包,用于实现java中简单的文字加密解密功能,保存可用于以后需要的项目中,再也不用耗时间去网上找资源了,值得收藏!戳这里---------https://download. ...
- 利用自定义的 ClassLoader 加密 Java Class 文件
本文演示利用自定义的 ClassLoader 加密 Java Class 文件 首先,我们定义一个需要被加密的java Class: classload.MyClassBase. 为了让客户端使用,需 ...
- RSA加密 - Java
前言 简介 RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,"由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制. 原理 根据数论,寻求两个大素数比较简单,而将它们 ...
- PHP简单的字符串加密与加密代码
PHP简单的字符串加密与加密代码 代码 //加密算法 function encode($string = '', $skey = 'cxphp') {$strArr = str_split(base6 ...
- getcoo php_PHP简单实现DES加密解密的方法
本文实例讲述了PHP简单实现DES加密解密的方法.分享给大家供大家参考,具体如下: des加密: function des_encrypt($str, $key) { $block = mcrypt_ ...
- 一个简单的例子看java线程机制
一个简单的例子看java线程机制 作者: zyf0808 发表日期: 2006-03-26 11:20 文章属性: 原创 复制链接 import java.util.*; public class T ...
- 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件签名 )
文章目录 一.生成 jks 文件 二.签名命令 三.执行结果 四.处理 Unsupported major.minor version 52.0 错误 参考博客 : [Android 安全]DEX 加 ...
最新文章
- adaptiveThreshold 阈值化的实现
- LINQ to SQL 在 Visual Studio 2008 中的简单应用
- 开发者账号申请完多久可以用_苹果开发者从0到发布app到apple store
- GraphQL 学习
- android 开源fc模拟器_星标 4.5K!又一个跨端框架,腾讯开源内部跨端统一开发框架:Hippy...
- c语言经典算法——查找一个整数数组中第二大数
- 重置Oracle密码
- vue中使用lazyload实现图片懒加载
- 毕啸南专栏 | 对话姚星:腾讯有后来居上的传统,我们的战略是全民AI
- 当下流行的语音识别技术是不是发展错了方向?
- Java定时任务与分布式定时任务
- oracle 11g 创建表空间
- VirtualBox+CentOS6.5安装增强功能包 - Building the main Guest Additions module [失败]
- SaaS系统权限体系设计
- 【IT情感】关于专业、理想和工作的认知
- matlab中输入数学符号,matlab中特殊符号的写法
- WebGL入门(六)-通过坐标计算实现图形的平移、旋转和缩放变换
- 网络对抗 Exp4 恶意代码分析 20154311 王卓然
- 观世界赛事,品足球人生--2022世界杯
- 云栖小镇通勤车_云栖小镇通勤特快线即将上线!@上班族们,冬日上班新姿势快来Get!...