简单实现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相关推荐

  1. 简单的汉字加密-java

    import java.util.*; import java.lang.*; public class DayThreeEee{ public static void main (String ar ...

  2. Java简单实现DES加密解密算法

    Java简单实现DES加密解密算法 文章目录 Java简单实现DES加密解密算法 DES算法介绍 实现相关java类 代码实现 DES算法介绍 DEC加密算法属于对称加密,即利用指定的密钥,按照密码的 ...

  3. 小工具分享----Java简单的文字加密解密

    今天有空自己制作了一个jar包,用于实现java中简单的文字加密解密功能,保存可用于以后需要的项目中,再也不用耗时间去网上找资源了,值得收藏!戳这里---------https://download. ...

  4. 利用自定义的 ClassLoader 加密 Java Class 文件

    本文演示利用自定义的 ClassLoader 加密 Java Class 文件 首先,我们定义一个需要被加密的java Class: classload.MyClassBase. 为了让客户端使用,需 ...

  5. RSA加密 - Java

    前言 简介 RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,"由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制. 原理 根据数论,寻求两个大素数比较简单,而将它们 ...

  6. PHP简单的字符串加密与加密代码

    PHP简单的字符串加密与加密代码 代码 //加密算法 function encode($string = '', $skey = 'cxphp') {$strArr = str_split(base6 ...

  7. getcoo php_PHP简单实现DES加密解密的方法

    本文实例讲述了PHP简单实现DES加密解密的方法.分享给大家供大家参考,具体如下: des加密: function des_encrypt($str, $key) { $block = mcrypt_ ...

  8. 一个简单的例子看java线程机制

    一个简单的例子看java线程机制 作者: zyf0808 发表日期: 2006-03-26 11:20 文章属性: 原创 复制链接 import java.util.*; public class T ...

  9. 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件签名 )

    文章目录 一.生成 jks 文件 二.签名命令 三.执行结果 四.处理 Unsupported major.minor version 52.0 错误 参考博客 : [Android 安全]DEX 加 ...

最新文章

  1. adaptiveThreshold 阈值化的实现
  2. LINQ to SQL 在 Visual Studio 2008 中的简单应用
  3. 开发者账号申请完多久可以用_苹果开发者从0到发布app到apple store
  4. GraphQL 学习
  5. android 开源fc模拟器_星标 4.5K!又一个跨端框架,腾讯开源内部跨端统一开发框架:Hippy...
  6. c语言经典算法——查找一个整数数组中第二大数
  7. 重置Oracle密码
  8. vue中使用lazyload实现图片懒加载
  9. 毕啸南专栏 | 对话姚星:腾讯有后来居上的传统,我们的战略是全民AI
  10. 当下流行的语音识别技术是不是发展错了方向?
  11. Java定时任务与分布式定时任务
  12. oracle 11g 创建表空间
  13. VirtualBox+CentOS6.5安装增强功能包 - Building the main Guest Additions module [失败]
  14. SaaS系统权限体系设计
  15. 【IT情感】关于专业、理想和工作的认知
  16. matlab中输入数学符号,matlab中特殊符号的写法
  17. WebGL入门(六)-通过坐标计算实现图形的平移、旋转和缩放变换
  18. 网络对抗 Exp4 恶意代码分析 20154311 王卓然
  19. 观世界赛事,品足球人生--2022世界杯
  20. 云栖小镇通勤车_云栖小镇通勤特快线即将上线!@上班族们,冬日上班新姿势快来Get!...

热门文章

  1. 基于c语言流量预警软件,基于Android的手机流量控制软件答案.doc
  2. imx6ul添加keyboard Matrix矩阵键盘
  3. B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案
  4. Enviroment类
  5. 7z 头部错误 数据错误_打开一个7z的加密文件,显示CRC错误操作出错怎么办
  6. python 递归-递归可视化
  7. 常用Python爬虫库汇总
  8. Tomcat、JVM 优化配置
  9. 软件观点 - 软件工厂方法
  10. Kubernetes 有状态应用程序控制器 Operator