当前位置: 首页 > news >正文

密码学:古典密码.代替密码.仿射密码加密与解密 (广义欧几里得除法)

乘法密码和加法密码结合构成仿射密码,放射密码函数为

                                                   f(ai)=bi=aj (i,j为下角标)

                                                   j=i*k1+k0 mod n   只对大写英文加密n为26

其中:要求  (k1,n)=1, 0<=k0<n,且不允许同时有k1=1和k0=0

代码解释:

在输入时密文为字符串,通过ASCII码进行加减A对应的ASCII码把英文字母对应为0~25

在找k1时用广义欧几里得除法得到1~25之内与26互素的数字放在p数组里面,用于密钥k1的选择

代码:

#include <stdio.h>
#include <string.h>
int Findp(int p[],int n)
{int top=0,flag=1;if (n%2)flag=0;     //如果n为偶数,偶数必然不和n互素{for (int i=1;i<n;)//利用广义欧几里得除法找1~n之内与n互素的数{int j1=n,j0=i,r=i;while(r!=0){do{j1-=j0;r=j1;}while(r>=j0);j1=j0;j0=r;}if(j1==1)p[top++]=i;if(!flag)i+=2;elsei++;}}return top;
}int main()
{char M[9999],C[9999];printf("请输入明文字符(大写英文字母,回车结束)\n");fgets(M,9999,stdin);int k1,k0,n=26;printf("请输入密钥k1 k0(中间空格分隔,k1=1和K0=0不能同时),");int p[26];int num=Findp(p,n);printf("k1可取值为");for (int i=0;i<num;i++)printf("%d ",p[i]);printf("\n");scanf("%d%d",&k1,&k0);printf("密文\n");int end=strlen(M),top=0;for (int i=0;i<end-1;i++){if(M[i]==' ')C[i]=' ';elseC[i]=((M[i]-65)*k1+k0)%n+65;}for (int i=0;i<end-1;i++){printf("%c",C[i]);}printf("\n解密\n");for (int i=0;i<end-1;i++){if (C[i]==' ')printf("%c",C[i]);else{int m=(C[i]-65-k0);//不能用char类型!!!!m超过100多变为负数//while(-25%25)不执行 所以不能小于0while(m%k1 || m<0) //需要先加26 什么时候模K1为0停止m+=26;//因为选K1时互素,所以这里即使后面也有模K1为0的 除k1后再mod26是一样的结果printf("%c",m/k1+65);}}
}


http://www.mrgr.cn/news/44963.html

相关文章:

  • 【Nacos入门到实战十四】Nacos配置管理:集群部署与高可用策略
  • 【黑群晖】记录一次黑群突然重启后无法开机的处理经过
  • 内核缓冲区、用户缓冲区、中断服务
  • 2-115 基于matlab的瞬态提取变换(TET)时频分析
  • 源码分析之blip2的ITC和ITM的具体实现
  • python实现DES算法
  • gitlab-ci 集成 k3s 部署spring boot 应用
  • 【网络篇】计算机网络——运输层详述(笔记)
  • 云原生(四十九) | WordPress源码部署
  • omron fins 内存区域写入(MEMORY AREA WRITE)
  • Moshi:类似chatgpt advanced voice mode的端到端语音问答技术
  • 成像基础 -- 焦距、物距、视野、画幅的数学公式及计算示例
  • C语言-指针变量,常量与数组名的细微区别辨析
  • Windows系统编程(五)静态库和动态库
  • 慢接口分析与优化总结
  • MyBatis 批量插入方案
  • Java之Native详解
  • 动态规划算法——三步问题
  • 图论day55|深度优先搜索理论基础、98. 所有可达路径(卡码网)
  • 数据库中,如何查询表中的所有记录?