仿射密码加密解密(C语言)
仿射密码是一种古典移位密码,其算法设计时用到的数学基础是模运算和同余方程。它是一个字母对一个字母的加密密码。定义明文空间 P = Z 26 P={\rm Z}_{26} P=Z26 ,密文空间 C = Z 26 C={\rm Z}_{26} C=Z26 ,秘钥空间为 K = { ( a , b ) ∈ Z 26 ⋅ Z 26 : g c d ( a , 26 ) = 1 } K=\lbrace (a,b)\in {\rm Z}_{26} \cdot {\rm Z}_{26}:gcd(a,26)=1 \rbrace K={(a,b)∈Z26⋅Z26:gcd(a,26)=1} 对于 x ∈ P , y ∈ C , k = ( a , b ) ∈ K x\in P, y\in C,k=(a,b)\in K x∈P,y∈C,k=(a,b)∈K 定义加密函数 e k ( x ) = a x + b m o d 26 {\rm e}_k(x)=ax+b\mod \ 26 ek(x)=ax+bmod 26
,定义解密函数 d k ( x ) = a − 1 ( y − b ) m o d 26 ) {\rm d}_k(x)=a^{-1}(y-b)\mod \ 26) dk(x)=a−1(y−b)mod 26)
,其中是a在群的乘法逆元(求a在群的乘法逆元)。当a=1时,仿射密码,弱化为凯撒密码。
1.加密过程: text为要加密的明文,password为加密后的密文
//加密
char* encode(char* text,int addkey,int mulkey)
{char* password=NULL;//空指针//开辟空间password=(char*)malloc(10*sizeof(char));for(int i=0;i<strlen(text);i++){int code=text[i]-'a';password[i]=(code*mulkey+addkey)%26+'a';}return password;
}
2.求逆过程: 拓展欧几里得算法
//求逆 b%m的逆
int extendedeuclid(int m,int b)
{int a1,a2,a3;int b1,b2,b3;int t1,t2,t3;a1=1;a2=0;a3=m;b1=0;b2=1;b3=b;while(1){if(b3==0) return 0;if(b3==1){if(b2<0) b2=m+b2;return b2;}int q=a3/b3;t1=a1-q*b1;t2=a2-q*b2;t3=a3-q*b3;a1=b1;a2=b2;a3=b3;b1=t1;b2=t2;b3=t3;}return 0;
}
3.解密过程: password是要解密的密文,text是得到的解密后的明文。
//解密
char* decode(char* password,int addkey,int mulkey)
{char* text=NULL;text=(char*)malloc(10*sizeof(char));for(int i=0;i<strlen(password);i++){int code=password[i]-'a';text[i]=( (code-addkey+ 26) * extendedeuclid(26,mulkey) )% 26 + 'a';}return text;
}
4.完整代码:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>//求逆 b%m的逆
int extendedeuclid(int m,int b)
{int a1,a2,a3;int b1,b2,b3;int t1,t2,t3;a1=1;a2=0;a3=m;b1=0;b2=1;b3=b;while(1){if(b3==0) return 0;if(b3==1){if(b2<0) b2=m+b2;return b2;}int q=a3/b3;t1=a1-q*b1;t2=a2-q*b2;t3=a3-q*b3;a1=b1;a2=b2;a3=b3;b1=t1;b2=t2;b3=t3;}return 0;
}//加密
char* encode(char* text,int addkey,int mulkey)
{char* password=NULL;//空指针//开辟空间password=(char*)malloc(10*sizeof(char));for(int i=0;i<strlen(text);i++){int code=text[i]-'a';password[i]=(code*mulkey+addkey)%26+'a';}return password;
}//解密
char* decode(char* password,int addkey,int mulkey)
{char* text=NULL;text=(char*)malloc(10*sizeof(char));for(int i=0;i<strlen(password);i++){int code=password[i]-'a';text[i]=( (code-addkey+ 26) * extendedeuclid(26,mulkey) )% 26 + 'a';}return text;
}
int main()
{char text[200];printf("请输入明文:");scanf("%s",text);int k,b;printf("请输入k,b的值:");scanf("%d%d",&k,&b);char *p=NULL;char *q=NULL;p=q=(char*)malloc(10*sizeof(char));p=encode(text,k,b);q=decode(p,k,b);printf("加密后的密文:%s\n",p);printf("解密后的明文:%s",q);free(p);free(q);return 0;
}
Cmd Markdown 公式指导手册
复习了一下C语言的指针,学的时候感觉难,现在看还是难。
仿射密码加密解密(C语言)相关推荐
- 凯撒密码加密解密C语言详细代码
凯撒密码加密解密C语言详细代码 凯撒密码 又叫循环移位密码.它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代.它的加密过程可以表示为下面的函数: E(m)=(m+k) mod ...
- 凯撒(Caesar)密码加密解密c语言
2019独角兽企业重金招聘Python工程师标准>>> 我想用英语写注释,麻痹,写不明白! 编译器是vc++6.0 输入:omnia gallia est 密钥:3 加密:RPQLD ...
- 仿射密码加密解密实现
加密和解密都是数学函数.对此并没有很多了解.只为一解答一道作业题目来了解这两个函数以及将函数转为代码. 先从百度基本了解一下这个加密函数 只靠通识的数学知识,理解 是有难度 首先是计算优先级的疑惑,通 ...
- 仿射密码加密解密代码(java)
加密代码 import java.util.*; class fangshe {public static void main(String[] args) {Scanner input=new Sc ...
- 仿射密码python_仿射密码加解密 python
参数选取:模数n=26+10=36,k2为学号后2位:k1为与学号后2位最近的素数. 加解密:加密自己名字的全拼,再解密. 密钥 k = (k1 , k2) 仿射密码加解密算法是: m:是输入的 ...
- python中字符移位加密_1.1 移位密码加密解密python实现
例题1.1 移位密码加密解密 1.1.使用穷尽密钥搜索法破译如下利用移位密码加密的密文: ESPESTCOPIPCNTDPYPPODACZRCLXXTYR. 1.1答案: K=11,明文序列为: th ...
- php加密密码解析,php密码加密解密
php密码加密解密 龙行 PHP 2020-3-19 1002 0评论 function MD5PWD($data) { $pwd = md5($data); //把密码分割成 ...
- 维吉尼亚密码加密/解密在线工具
维吉尼亚密码加密/解密在线工具,工具链接:http://www.atoolbox.net/Tool.php?Id=856 维吉尼亚密码是在凯撒密码基础上产生的一种加密方法,它将凯撒密码的全部25种位移 ...
- 凯撒密码加密解密——Java代码(密码学)
凯撒密码加密解密--Java代码(密码学) 凯撒密码: 恺撒密码(英语:Caesar cipher),或称恺撒加密.恺撒变换.变换加密,是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文 ...
最新文章
- 邮件安全隐患及其防范技术研究
- Android 页面进行镜像反转-面试
- 简单Linux C线程池
- swoole mysql 并发_Swoole4 如何打造高并发的PHP7协程Mysql连接池?
- HDU - 6203 ping ping ping(LCA+dfs序+线段树)
- oracle求数据关联度,关于数据挖掘关联规则的Oracle实现
- 阿里云前端周刊 - 第 33 期
- 机器学习的数学基础(一)—— 期望、方差、协方差与相关系数
- 微型计算机地基本结构,微型计算机地基本结构.ppt
- 霍夫曼编码及解码实验c语言,Huffman编码与解码_C语言实现
- EMERSON模块A6500-UM、SLS1508、MVME7100-0171、MVME61006E-0163、A6370D、SE3008、CE3008、MVME6100、VE3006,CE3008
- JavaWeb 注解
- 关于投资人的一些事-创业杂记
- php获取视频直链并且跳转,求 cctalk 提取免费视频直链的方法
- 2021,自动驾驶的“五代十国”
- 回归中的相关度和R平方值
- Qt编写4K/8K大分辨率播放器(8K占用1%CPU)
- html 圆圈透明 其他不透明,Javascript HTML5 Canvas绘制透明圆圈
- MySQL 获取时间函数
- 【JAVA多线程】如何解决一个生产者与消费者问题