C#RSA密码以及利用欧几里得算法实现两数互质的判断

article/2025/7/20 1:12:50

最近做课程设计,想到以前看过RSA密码的相关内容,于是就想用刚学的C#做一个数字加密系统。RSA加密的流程如下:

                                                                           

来看一个“玩具式”的例子:

(1)选取两个素数p=2,q=11,于是N=22.

(2)构造数\phi (22)=(2-1)\times (11-1)=10,这是小于22且不含因数2和11的自然数的个数。

(3)选一个小于\phi (22)=10且与10互素的数a,可选择的数有3,7,和9.我们选a=3。

(4)求方程ab\equiv 1+\phi (22)r(mod N)的自然数解,从而求出b。在我们这个情况下,求得

                                                             3\times 7-10\times 2=1

于是我们选择的a使得b=7.

(5)为了让人们能够对一串小于22的自然数u加密,我们公开(a,N)=(3,22)(a,N)=(3,22).加密的操作如下:

                                                          u\rightarrow v\equiv u^{3}(mod22)

(6)我们知道数b,就可以对v进行解密;别人谁也做不到.

                                                                u\equiv v^{7}(mod22)

现在来看我们这个私密的RSA密码是如何运作的。首先让我们对数173124进行加密,然后将加密的结果解密.我们把这个数分裂成(17)(3)(12)(4)。注意分段法一定要把数字分成前后两数组合小于N的最大整数,列如:不能把(17)拆分成(1)和(7)也不能将(3)和后面的(1)组合成(31>22)。进行如下加密:

                                                     17\rightarrow 17^{3}=223\times 22+\textbf{7}

                                                     3\rightarrow 3^{3}=22\times 1+\textbf{5}

                                                     12\rightarrow 12^{3}=78\times 22+\mathbf{12}

                                                     4\rightarrow 4^{3}=22\times 2+\textbf{20}

加了密的数串于是为v=(7)(5)(12)(20)

通过规定的方法对它解密如下:

                                                   7\rightarrow 7^{7}=37422\times 22+\mathbf{17}

                                                   5\rightarrow 5^{7}=3551\times 22+\mathbf{3}

                                                  12\rightarrow 12^{7}=1628718\times 22+\boldsymbol{12}

                                                  20\rightarrow 20^{7}=58181818\times 22+\textbf{4}

我在编写程序寻找自选数a的过程中发现如果要寻找合适的a就要编写一套判断两数互质的算法,如果列出两个数的素数分解式再判断是否有重合未免太过复杂也很难操作,正好在这一章的内容里有欧几里得算法(辗转求余算法),我才突然醒悟:这不就是求最大公因数吗!如果最大公因数是1,则代表两数互质。

所以,先复习一下欧几里得算法,这个算法可简述为以下等式:

                                                          hcf(a,b)=hcf(b,r)

hcf(x,y)表示对x,y求最大公因数。

而我们有长除法a=b\times q+r

来看一个例子(7540,546)

                                     (1)7540=546\times 13+442\Rightarrow hcf(7540,546)=hcf(546,442)

                                     (2)546=442\times 1+104\Rightarrow hcf(546,442)=hcf(442,104)

                                     (3)442=104\times 4+26\Rightarrow hcf(442,104)=hcf(104,26)

                                     (4)104=26\times 4+0\Rightarrow hcf(7540,526)=26

求得的最大公因数是26.

选取候选数a的代码:

int[] a = new int[20];
Find_relativelyPrime(phi,p,q,ref a);//求解a
public void Find_relativelyPrime(int phi,int p,int q,ref int[] a){int k = phi;int count=0;for(int i = 2; i < phi; i++){int j = i;while (j!=0&&j!=1){Euclid(ref phi,ref j);//欧几里得运算}//若经历过循环欧几里得运算余数j=1,两数互质;若j=0;两数存在最大公因数,因此不互质;if (j != 0 && i!=p && i!=q) {//若两数互质,且i不等于构造欧拉数phi(p,q)的两因子,则选取为候选公开数i加入数组a;a[count]=i;count++;}if (count == 20)break;phi = k;}}public void Euclid(ref int phi,ref int i){int temp=i;i = phi % i;phi = temp;}

案例来自于《数学桥》。如果把加密后的数字进行ASCII转换,就可以得到更复杂的加密密钥。

 


http://chatgpt.dhexx.cn/article/bQrspdml.shtml

相关文章

判断两数互质,java实现

数组下标i和j值互质时&#xff0c;a[i][j] true,反之false Write a program to create an n * n Boolean array. If I and j are coprime, a [i] [J] is true, otherwise it is false /** * When Array index Mutuality ,a[i][j] true,else is false * 数组i和j值互质时&…

两个质数互质是_两个数互质是什么意思 如何判断

互质数为数学中的一种概念&#xff0c;即两个或多个整数的公因数只有1的非零自然数。公因数只有1的两个非零自然数&#xff0c;叫做互质数。下面是小编整理的详细内容&#xff0c;一起来看看吧&#xff01; 两个数互质是什么意思 质数为数学中的一种概念&#xff0c;即两个或多…

char、wchar_t、ACHAR、WCHAR、TCHAR

最近用到上面几种不同的字符类型,下面贴上在网上收集到的资料。 1、char 单字节变量类型,最多表示256个字符。 2、wchar_t 宽字节变量类型,用于表示Unicode字符,它实际定义在<string.h>里:typedef unsigned short wchar_t。 定义宽字节类型方法如下: wchar_…

wchar* 转换成 string

wchar* 转换成 string 123 windows 类型转换问题 1 // Your wchar_t* wstring ws(L"Hello World"); // your new String std::string str(ws.begin(), ws.end()); // Show String std::cout << str << std::endl; 2 std::wstring wstr(L"Test&…

wchar_t类型

今天在看前辈的项目的时候学习到了一个以前没有通过的数据类型&#xff1a;宽字符wchar_t类型。 先来看看他占多大的空间吧&#xff0c; 从图中可以看到wchar_t占的空间的大小为2个字节&#xff0c; 然后来确定一下他是无符号还是有符号的 由上图可见&#xff0c;他应该是无符号…

char与wchar_t字符串

C里的字符串类型是比较二的&#xff0c;因为有太多表示方法&#xff1a;char*、string、字符串数组、wchar_t*、wstring&#xff0c;今天就来缕一缕这些玩意。 char* char* 貌似是C字符串最基础最核心的。 看以下四个字符串声明及输出结果&#xff1a; 先说说核心&#xff0c…

wchar_t的用法

wchar_t的解释可以看这里:这里 程序和解析: 1 # include<stdio.h>2 # include<stdlib.h>3 # include<locale.h>//设置本地化<

WCHAR的简单操作

WCHAR 是双字节类型&#xff0c;一般它用来存储那些双字节而不是单字节字符.较长的字节数可以支持 在应用程序的国际发布版本里所使用的扩展字符集(如常用的Unicode字符集). 比如说&#xff1a;在中文系统下开发的软件&#xff0c;当应用到日文操作系统时&#xff0c;如果没有采…

ADI Diff-Amp Calculator差分放大器件计算器使用方法

Diff-Amp Calculator便于计算单端转差分放大&#xff0c;差分转差分放大&#xff0c;在满足输入信号和输出信号的参数要求下&#xff0c;配置元件增益自动计算Rf和Rg阻值大小。 下载地址&#xff1a;https://www.analog.com/cn/design-center/interactive-design-tools/adi-dif…

双电阻差分电流采样_差分信号和差分电路讲解 差分放大电路应用

1、什么是差分信号?为什么要用差分信号? 两个芯片要通信,我们把它们用一根导线连接起来,一个传输 1,另一个接受 1,一个传输 0,另一个接受 0,不是很好吗?为什么还要搞其他的花花肠子。 因为有干扰,各种各样的干扰,比如温度,电磁辐射等等,这些干扰使得传输的 1 不再…

双电阻差分电流采样_差分放大电路的应用

差分运算放大电路,对共模信号得到有效抑制,而只对差分信号进行放大,因而得到广泛的应用。 1、如下图是差分电路的电路构型 目标处理电压:是采集处理电压,比如在系统中像母线电压的采集处理,还有像交流电压的采集处理等。 差分同相/反相分压电阻:为了得到适合运放处理的电…

全差分放大器(FDA)的基本知识

为了获得最佳性能&#xff0c;用户必须在信号链上选择一个balun(平衡不平衡变换器&#xff09;&#xff0c;虽然这可能会导致某些应用中的耦合问题。然而&#xff0c;耦合问题并不是总是发生&#xff0c;特别是在某些需要DC分量的测试和测量应用中更是如此。 全差分放大器 (FDA…

3.0.MATLAB版线性代数-矩阵加法、数乘、乘法、求逆

矩阵运算及其应用(加法、数乘、乘法、求逆) 加法数乘运算规则乘法矩阵乘法定义线性变换多次线性变换等于矩阵的连乘线性方程组看做矩阵乘法矩阵的转置矩阵的逆(“除法”)矩阵逆的定义矩阵逆的性质求逆矩阵的方法(求逆1)MATLAB中求逆矩阵的分块向量等式初等矩阵初等矩阵和…

算法:动态规划—矩阵链相乘

问题描述 给定n个矩阵&#xff5b;A1,A2,…,An&#xff5d;&#xff0c;其中Ai与A i1是可乘的&#xff0c;i1&#xff0c;2…&#xff0c;n-1。如何确定计算矩阵连乘积的计算次序&#xff0c;使得依此次序计算矩阵连乘积需要的数乘次数最少 解法 1.穷举法&#xff1a; 列举…

Java实现矩阵的加、减、乘、数乘、转置、幂运算

Java实现矩阵的加、减、乘、数乘、转置、幂运算 首先需要一个矩阵对应的类 Matrix. 命名为Matrix import java.util.Arrays; /*** author yiran* creat 2021-11-26-13:58*/ public class Matrix{// 矩阵private double[][] matrix;// m x n private int m;private int n;publ…

【数理知识】向量数乘,内积,外积,matlab代码实现

序号内容1【数理知识】向量数乘&#xff0c;内积&#xff0c;外积&#xff0c;matlab代码实现2【数理知识】矩阵普通乘积&#xff0c;哈达玛积&#xff0c;克罗内克积&#xff0c;点乘&#xff0c;点积&#xff0c;叉乘&#xff0c;matlab代码实现 文章目录 1. 向量基本形式2. …

Eigen入门系列 —— Eigen::Matrix矩阵基本加减、数乘运算

Eigen入门系列 —— Eigen::Matrix矩阵基本加减、数乘运算 前言程序说明输出结果代码示例 前言 随着工业自动化、智能化的不断推进&#xff0c;机器视觉&#xff08;2D/3D&#xff09;在工业领域的应用和重要程度也同步激增&#xff08;识别、定位、抓取、测量&#xff0c;缺陷…

07-行向量列向量_向量的运算 加法,数乘,减法,转置

行向量和列向量 其实它们非常简单&#xff0c;所谓的行向量就是我们的向量表示&#xff0c;一组数这组数码成一行&#xff0c;那么所谓的列向量呢&#xff1f;就是这组数码成一列而已&#xff0c;那么对于行向量还是列向量&#xff0c;在我们的学习中是并没有区别的&#xff0…

矩阵相乘求解最小数乘次数

矩阵连乘问题&#xff1a; 给定n 个矩阵(A0,A1,....An-1) 其中 Ai 和 Ai1 是可乘的&#xff0c; i0, 1,... , n-2 . 求解计算这n 个矩阵的连乘积A0A1....An-1 。 由于矩阵连乘满足结合律&#xff0c;因此矩阵的乘法可以有多种不同的计算次序&#xff0c;每种计算次序对应不同…

人工智能数学基础-线性代数1:向量及向量加减法与数乘

☞ ░ 老猿Python博文目录░ 一、向量 1.1、向量定义 向量也称为欧几里得向量、几何向量、矢量&#xff0c;指具有大小&#xff08;magnitude&#xff09;和方向的量。它可以形象化地表示为带箭头的线段。箭头所指&#xff1a;代表向量的方向&#xff1b;线段长度&#xff1…