仿射密码是一种古典移位密码,其算法设计时用到的数学基础是模运算和同余方程。它是一个字母对一个字母的加密密码。定义明文空间 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语言)相关推荐

  1. 凯撒密码加密解密C语言详细代码

    凯撒密码加密解密C语言详细代码 凯撒密码 又叫循环移位密码.它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代.它的加密过程可以表示为下面的函数: E(m)=(m+k) mod ...

  2. 凯撒(Caesar)密码加密解密c语言

    2019独角兽企业重金招聘Python工程师标准>>> 我想用英语写注释,麻痹,写不明白! 编译器是vc++6.0 输入:omnia gallia est 密钥:3 加密:RPQLD ...

  3. 仿射密码加密解密实现

    加密和解密都是数学函数.对此并没有很多了解.只为一解答一道作业题目来了解这两个函数以及将函数转为代码. 先从百度基本了解一下这个加密函数 只靠通识的数学知识,理解 是有难度 首先是计算优先级的疑惑,通 ...

  4. 仿射密码加密解密代码(java)

    加密代码 import java.util.*; class fangshe {public static void main(String[] args) {Scanner input=new Sc ...

  5. 仿射密码python_仿射密码加解密 python

    参数选取:模数n=26+10=36,k2为学号后2位:k1为与学号后2位最近的素数. 加解密:加密自己名字的全拼,再解密. 密钥 k = (k1 , k2) 仿射密码加解密算法是:    m:是输入的 ...

  6. python中字符移位加密_1.1 移位密码加密解密python实现

    例题1.1 移位密码加密解密 1.1.使用穷尽密钥搜索法破译如下利用移位密码加密的密文: ESPESTCOPIPCNTDPYPPODACZRCLXXTYR. 1.1答案: K=11,明文序列为: th ...

  7. php加密密码解析,php密码加密解密

    php密码加密解密 龙行    PHP    2020-3-19    1002    0评论 function MD5PWD($data) { $pwd = md5($data); //把密码分割成 ...

  8. 维吉尼亚密码加密/解密在线工具

    维吉尼亚密码加密/解密在线工具,工具链接:http://www.atoolbox.net/Tool.php?Id=856 维吉尼亚密码是在凯撒密码基础上产生的一种加密方法,它将凯撒密码的全部25种位移 ...

  9. 凯撒密码加密解密——Java代码(密码学)

    凯撒密码加密解密--Java代码(密码学) 凯撒密码: 恺撒密码(英语:Caesar cipher),或称恺撒加密.恺撒变换.变换加密,是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文 ...

最新文章

  1. 邮件安全隐患及其防范技术研究
  2. Android 页面进行镜像反转-面试
  3. 简单Linux C线程池
  4. swoole mysql 并发_Swoole4 如何打造高并发的PHP7协程Mysql连接池?
  5. HDU - 6203 ping ping ping(LCA+dfs序+线段树)
  6. oracle求数据关联度,关于数据挖掘关联规则的Oracle实现
  7. 阿里云前端周刊 - 第 33 期
  8. 机器学习的数学基础(一)—— 期望、方差、协方差与相关系数
  9. 微型计算机地基本结构,微型计算机地基本结构.ppt
  10. 霍夫曼编码及解码实验c语言,Huffman编码与解码_C语言实现
  11. EMERSON模块A6500-UM、SLS1508、MVME7100-0171、MVME61006E-0163、A6370D、SE3008、CE3008、MVME6100、VE3006,CE3008
  12. JavaWeb 注解
  13. 关于投资人的一些事-创业杂记
  14. php获取视频直链并且跳转,求 cctalk 提取免费视频直链的方法
  15. 2021,自动驾驶的“五代十国”
  16. 回归中的相关度和R平方值
  17. Qt编写4K/8K大分辨率播放器(8K占用1%CPU)
  18. html 圆圈透明 其他不透明,Javascript HTML5 Canvas绘制透明圆圈
  19. MySQL 获取时间函数
  20. 【JAVA多线程】如何解决一个生产者与消费者问题

热门文章

  1. DB-Engines发布了2017年9月数据库排名。
  2. ms08_067,ms10_046漏洞复现与利用
  3. 前端关于自己模拟接口做测试
  4. windows安装Rocket因为JAVAHOME空格导致找不到加载类问题
  5. 淘宝上传图片太大怎么办?怎么把图片压缩变小?
  6. sql语句多表查询实例
  7. 【java】tomcat配置域名访问并修改端口号
  8. 【07月15日】A股滚动市盈率PE最低排名
  9. i5 13600K和i5 12600k差距
  10. 开发通用资料——英文缩写