一、实验目的与原理

这次次实验主要难点在于以下三个算法的理解与实现: 1. Rabin-Miller 算法 2. 扩展欧几里得算法 3. 快速幂取余算法 根据前面的算法,我们知道明文和密文都不能大于 n,假设 n 的长度为 L,对于 明文,我们需要按照 L-1 的长度对其分组然后再加密,每组的密文长度 L。解密 的时候使用 L 的长度对其进行分组然后解密,每组的明文长度为 L-1。分组按照 整数从低到高(即从右往左)

二、实验实现

C++中数据的类型与长度参考:

因此,C++最大能支持的十进制是19位的整数。如果要支持更大的整数,需要实现Big Number类。RSA目前比较安全的密钥长度是2048位二进制,即是617位的十进制。因此,C++自带的数据类型无法实现安全的RSA密钥加解密。

为了降低难度,该题不要求实现大数支持,因此只使用C++自带的long long 数据类型。

该实验主要包含三部分:1. 公私钥的生成。在公私钥生成中,有p、q、e三个参数是随机选择的,其中p、q要求是质数,因此需要实现一个函数检查一个整数是否是质数。由p、q的乘积可以得到n:n=p*q,以及n的欧拉函数: φ(n) = (p-1)*(q-1)。e是在(1, φ(n))之间随机选取的整数,需要满足gcd(e, φ(n)) = 1,因此,需要通过扩展欧几里得算法验证取得的e是与φ(n)互质的。d可以通过扩展欧几里得算法求得 。以满足,即

公钥为(n, e),私钥为(n,d)

检查一个整数是否为质数-Rabin-Miller算法,请参考:Miller-Rabin素性测试算法详解_Nicetomeetu-的博客-CSDN博客_millerrabin素数测试算法或Miller Rabin算法详解 - 自为风月马前卒 - 博客园或BZOJ3667: Rabin-Miller算法 - 自为风月马前卒 - 博客园

扩展欧几里得算法:请参考:【算法学习】扩展欧几里得算法详解及C++代码实现_行仔ovo的博客-CSDN博客_欧几里得算法c++

2. 加密过程,使用加密算法c = m^e mod n,计算出密文c;

3.解密过程,使用私钥d和解密算法m = c^d mod n, ,计算m;

加密和解密过程需要做幂运算取余,如果直接先做幂运算再取余,则很容易出现溢出,因此,我们需要采用快速幂运算取余算法,请参考:https://jlice.top/p/7tbs7/

因此,该次实验主要难点在于以下三个算法的理解与实现:

1. Rabin-Miller算法

2. 扩展欧几里得算法

3. 快速幂取余算法

根据前面的算法,我们知道明文和密文都不能大于n,假设n的长度为L,对于明文,我们需要按照L-1的长度对其分组然后再加密,每组的密文长度L。解密的时候使用L的长度对其进行分组然后解密,每组的明文长度为L-1。分组按照整数从低到高(即从右往左)

输入

第一行是p

第二行是q

第三行是e

第四行是待加密数据

第五行是待解密数据

输出

第一行输出p是否是质数

第二行输出q是否是质数

第三行打印n

第四行打印d

第五行显示输入第四行的加密结果

第六行显示输入第五行的解密结果

输入样例1

67                                                     
43                                                     
13                                                      
281
2154

输出样例1

Yes
Yes
2881
853
325
54

输入样例2

9973
9397
4889
2020
53185119

输出样例2

Yes
Yes
93716281
42181817
53185119
2020

代码:(有参考)

import java.util.Scanner;
public class test4 {private static long x = 0,y = 0;public static void main(String[] args) {long p,q,e,message1,message2;Scanner scanner = new Scanner(System.in);p = scanner.nextInt();q = scanner.nextInt();e = scanner.nextInt();message1 = scanner.nextInt();message2 = scanner.nextInt();if(isPrime(p)){System.out.println("Yes");}else{System.out.println("No");}System.out.println(isPrime(q) ? "Yes" : "No");long n = p*q;System.out.println(n);long fnd=(p-1)*(q-1);//调用欧里几得算法if (ouli(e, fnd)==1) {long temp;if(x<0){temp=-1;}else{temp=1;}if (temp == -1){x = x+fnd;}System.out.println(x);}String str1=Long.toString(n);int L = str1.length();//加密过程long truemessage1=fx1(message1, n, e, L, L - 1);//解密过程long truemessage2=fx2(message2, n, x, L - 1, L);System.out.println(truemessage1);System.out.println(truemessage2);}//素数检查static boolean isPrime(long n) {if(n%2==0){return false;}for(long i= 2;i<n/2+1;i++)if(n%i==0) {return false;}return true;}//扩展欧几里得算法private static long ouli(long a, long b) {if (b==0) {x = 1;y = 0;return a;}long r = ouli(b, a%b);long temp = y;y = x-((a/b)*y);x = temp;return r;}//快速幂取余算法private static long powMod(long a, long b, long c) {long result = 1;while (b!=0) {if (b%2==1) {result = (result*a)%c;}b = b/2;a = (a*a)%c;}return result;}//加密算法private static long fx1(long m, long n, long e, int L, int length) {// m < nlong x=0;if(m<n){x=-1;}else{x=1;}if (x != 1) {return powMod(m, e, n);}//开始分组String a = Long.toString(m);//StringBuilder为可变字符串StringBuilder stringBuilder = new StringBuilder();for (int i = a.length(); i - length > -length; i -= length) {String b = a.substring(Math.max(0, i - length), i);long temp=Integer.parseInt(b);StringBuilder subStr = new StringBuilder(Long.toString(powMod(temp, e, n)));while (subStr.length() < L) {subStr.insert(0, "0");}stringBuilder.insert(0, subStr);}return Integer.parseInt(stringBuilder.toString());}//解密算法private static long fx2(long m, long n, long e, int L, int length) {// m < nlong x = 0;if (m < n) {x = -1;} else {x = 1;}if (x != 1) {return powMod(m, e, n);}//开始分组String a = Long.toString(m);//StringBuilder为可变字符串StringBuilder stringBuilder = new StringBuilder();for (int i = a.length(); i - length > -length; i -= length) {String b = a.substring(Math.max(0, i - length), i);long temp = Integer.parseInt(b);StringBuilder subStr = new StringBuilder(Long.toString(powMod(temp, e, n)));while (subStr.length() < L) {subStr.insert(0, "0");}stringBuilder.insert(0, subStr);}return Integer.parseInt(stringBuilder.toString());}
}

信息安全导论 实验四 RSA算法(不要求支持大数)相关推荐

  1. RSA算法(不要求支持大数)

    题目描述 C++中数据的类型与长度参考: 因此,C++最大能支持的十进制是19位的整数.如果要支持更大的整数,需要实现Big Number类.RSA目前比较安全的密钥长度是2048位二进制,即是617 ...

  2. 人工智能导论实验四:深度学习算法及应用

    实验四:深度学习算法及应用 一.实验目的 1.了解深度学习的基本原理: 2.能够使用深度学习开源工具: 3.应用深度学习算法求解实际问题. 二.实验要求 1.解释深度学习原理: 2.对实验性能进行分析 ...

  3. 信息安全-5:RSA算法详解(已编程实现)[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...

  4. (AI)人工智能导论实验【A* 算法】

    人工智能导论实验 文章目录 人工智能导论实验 A-star algorithm A-star algorithm 传送:看懂A*的网站 源码 """ 实验内容:假设在一个 ...

  5. 操作系统实验四-LRU算法的模拟

    操作系统实验四:页式虚拟存储管理的模拟 一.实验目的: 掌握存储管理的基本原理.地址变换过程:用软件实现地址转换过程:用一种常用的页面置换算法来处理缺页中断并研究其命中率. 二.实验题目: 1.模拟请 ...

  6. 算法分析与设计-实验四 回溯算法设计

    文章目录 1.0-1背包问题 2.旅行售货员问题 3.图的m着色问题 一.实验目的: 掌握用回溯法解题的算法框架:根据回溯法解决实际问题. 二.实验所用仪器及环境 Windows 7 以上操作系统,P ...

  7. 信息安全密码学实验四:Diffie-Hellman密钥交换协议的设计与实现

    一.实验目的 理解Diffie-Hellman算法的实现原理,编程实现Diffie-Hellman算法的程序,能够实现密钥协商的目的 二.实验原理 w.Diffie与M.Hellman在1976年提出 ...

  8. java符号三角形问题_实验四 回溯算法和分支限界法 符号三角形问题

    基本题一:符号三角形问题 一.实验目的与要求 1.掌握符号三角形问题的算法: 2.初步掌握回溯算法: 二.实验题图 下面都是"-".下图是由14个"+"和14个 ...

  9. 信息安全导论 实验一 古典密码学

    一.实验目的与原理 1.实现古典密码学中的移位密码算法和维吉尼亚算法. 2.了解两种算法的原理,并且编写出来. 3.使用语言为C++或者Python等. 二.实验内容与记录 位移密码算法: 移位密码算 ...

最新文章

  1. 第5关:32位快速加法器设计
  2. python是脚本语言不需要编译器编译执行_都有Python了,还要什么编译器!
  3. 工作五年,后面四年重复着第一年的活儿?
  4. springmvc 配置 fastjson解析器
  5. 结构型模式之Flyweight模式
  6. 从 TFS 迁移源代码到 git
  7. HTTP / HTTPS抓包工具-Fiddler
  8. 数据类别不平衡/长尾分布?不妨利用半监督或自监督学习
  9. jni直接转byte_JNI jbyteArray转char*
  10. bzoj 2434 [Noi2011]阿狸的打字机(AC自动机+fail树+dfs序+树状数组)
  11. c语言编程sinx泰勒公式_大白话5分钟带你走进人工智能-第12节梯度下降之原理泰勒公式(7)...
  12. 同学,你要的SpringBoot多图片上传回显功能已经实现了,赶紧收藏吃灰~
  13. 思凡软件(思凡全功能拓扑检查工具)
  14. JSP文件的中文在浏览器上显示乱码解决方法
  15. java excel 导入试题
  16. 计算机图形图像设计构图的基本形式,构图一学就会!构图基本形式只有四种
  17. oracle的month函数的使用方法,oracle add_month函数
  18. Java8 处理日期和时间
  19. 2021-07-17 随笔
  20. es-Ingest pipelines

热门文章

  1. hash路由实现微信登陆后的重定向
  2. JAVA毕业设计HTML5“牧经校园疫情防控网站”设计与实现计算机源码+lw文档+系统+调试部署+数据库
  3. terminal的常用快捷键
  4. 2011-2020年北京大学数字普惠金融指数(PKU-DFIIC)
  5. c# WPF中对输入值任意限制的方法及通用示例
  6. PDF文件如何转JPG图片?三种方法教你快速转换
  7. java实现、项目开发团队分配管理软件
  8. rsa 长密钥实现及测试
  9. Python解题 - 硬币的面值
  10. Android实现垂直型的SeekBar