程序仿射加密解密
- 格式:doc
- 大小:19.00 KB
- 文档页数:2
仿射密码的c代码在密码学中,仿射密码是一种替代密码。
它是通过对输入的字母进行线性变换来实现加密的。
具体来说,它将输入的字母映射到一个新的字母,映射方式是通过乘以一个密钥元素再加上另一个密钥元素来实现的。
以下是仿射密码的C代码:```#include <stdio.h>#include <string.h>#include <ctype.h>#define MAX_LEN 100void affine_cipher(char* plaintext, int a, int b) {int len = strlen(plaintext);char ciphertext[MAX_LEN];for(int i = 0; i < len; i++) {if(isalpha(plaintext[i])) {char c = plaintext[i];c = toupper(c);c = ((a * (c - 'A')) + b) % 26 + 'A';ciphertext[i] = c;} else {ciphertext[i] = plaintext[i];}}printf('密文: %s', ciphertext);}int main() {char plaintext[MAX_LEN];int a, b;printf('请输入明文: ');fgets(plaintext, MAX_LEN, stdin);printf('请输入a值: ');scanf('%d', &a);printf('请输入b值: ');scanf('%d', &b);affine_cipher(plaintext, a, b);return 0;}```代码解释:- `affine_cipher`函数实现了仿射密码的加密过程。
仿射密码加密原理
仿射密码是一种基于数学变换的加密方法,它使用了一组线性变换和数字替换的规则来对明文进行加密。
其加密原理如下:
1. 字母映射:首先,将明文中的每个字母通过一个映射规则转换为一个对应的整数。
通常使用的映射规则是A=0,B=1,
C=2...Z=25,即将每个字母映射为0到25之间的整数。
2. 线性变换:对于每个映射后的整数,通过一个线性变换公式对其进行变换。
该公式可以写成如下形式:E(x) = (ax + b)
mod m,其中E(x)表示加密后的整数,x表示明文中的整数,a 和b是用来控制变换的参数,m是字母表大小,对于英文字母表来说,m=26。
3. 数字替换:最后,将加密后的整数通过逆映射规则转换为对应的字母。
同样地,将每个整数通过映射规则转换为对应的字母。
通过以上三个步骤,明文中的每个字母都被加密成了一个对应的字母,从而实现了加密过程。
解密的过程与加密相反,将加密后的字母通过逆映射规则转换为对应的整数,然后通过一个逆向的线性变换公式得到明文中的整数,最后再通过逆映射规则转换为对应的字母,从而得到明文。
总结来说,仿射密码加密的原理就是通过字母映射、线性变换和数字替换的规则对明文进行加密,其中线性变换是关键步骤,通过改变线性变换的参数a和b来控制加密的强度和规则。
仿射加密算法原理一、引言在信息时代,数据安全问题一直备受关注。
为此,加密技术得到了广泛应用。
仿射加密算法是一种流行的加密算法,它具有简单、快速、安全等优点。
本文将介绍仿射加密算法的原理及其加密过程,并针对该算法的优缺点进行探讨。
二、基本原理1. 线性变换仿射加密算法是基于线性变换的加密算法。
线性变换指的是对向量或矩阵进行的一种数学操作,可以用线性方程组表示。
具体而言,就是线性变换将向量或矩阵变换为另一个向量或矩阵,变换后的向量或矩阵与原始向量或矩阵之间存在一定的线性关系。
在仿射加密算法中,通过选择合适的线性变换,可以实现对明文的加密。
2. 明文加密过程在仿射加密算法中,加密过程分为以下几个步骤:(1)选择两个正整数a和b(这两个数要求互质);(2)将明文m分解为若干组,每组加密如下:C = (am + b) mod nn是最大取值。
3. 密文解密过程由于仿射加密算法也是一种对称加密算法,因此密文解密的过程与加密过程类似,但是需要构造一个解密变换。
解密变换如下:m = ((C - b) * a^(-1)) mod na^(-1)是a的逆元(互质情况下,a和n一定存在逆元)。
三、优缺点和应用1. 优点(1)加密速度较快:仿射加密算法只涉及到简单的模运算和乘法运算,因此加密速度较快。
(2)加解密易于实现:仿射加密算法的数学原理比较简单,因此实现起来相对容易。
(3)加密强度较高:仿射加密算法通过选择合适的a和b可以实现随机化加密,相对比较安全。
2. 缺点(1)加密强度不太高:仿射加密算法具有一定的加密强度,但是相对于其他加密算法来说,它较容易被攻击。
(2)加密密钥选择较为有限:仿射加密算法中a和b的选择比较有限,要求a和n必须是互质的,因此加密密钥的数量比较少。
3. 应用仿射加密算法主要用于对不太敏感、名称等信息进行加密。
仿射加密算法可用于保护论文、报告等文件的机密性,也可用于网络通讯中的数据加密。
但对于重要的商业机密等敏感信息,仿射加密算法的加密强度可能不够,仍需使用更加安全的加密算法。
仿射密码公式
仿射密码是一种经典的对称加密算法,其公式可以表示为:
C = (a * P + b) mod 26
其中,C代表密文,P代表明文(即待加密的字符),a和b是密钥中的参数。
这里的mod 26表示结果取模26,即26个字母的循环。
在加密过程中,先将明文字符P转换为对应的数字(A对应0,B对应1,依此类推),然后应用公式进行加密求解。
最后将得到的密文字符再转换回对应的字母形式。
需要注意的是,为了确保加密的安全性,选择合适的密钥参数a和b非常重要。
a必须是与26互质的数,这样才能保证加密算法的可逆性。
同时还要保证a和b的取值范围符合要求,通常要求a属于0到25之间的整数,b属于0到25之间的任意整数。
值得一提的是,仿射密码属于经典密码算法,在现代密码学中已经不再被广泛使用。
因为它的安全性相对较低,容易受到各种攻击手段的破解。
在实际应用中,更常见的是使用更为安全的对称加密算法,例如AES、DES等。
第1篇一、实验背景密码学是一门研究信息加密与解密的学科,它广泛应用于信息安全领域。
为了更好地理解密码学的基本原理和算法,我们选择了实验吧平台上的密码学实验进行学习。
本次实验旨在通过实际操作,加深对古典密码、对称密码和不对称密码等密码学基本概念的理解,提高密码学应用能力。
二、实验目的1. 理解并掌握古典密码的基本原理和算法;2. 掌握对称密码和不对称密码的基本原理和算法;3. 通过实验操作,提高密码学应用能力;4. 培养团队协作和解决问题的能力。
三、实验内容1. 古典密码实验(1)仿射密码原理:仿射密码是一种单字母替换密码,加密公式为:C = (aP + b) mod 26,其中C为密文字母,P为明文字母,a和b为密钥。
操作步骤:1)编写加密函数encrypt,实现仿射密码加密;2)编写解密函数decrypt,实现仿射密码解密;3)测试加密和解密函数,验证其正确性。
(2)单表代替密码原理:单表代替密码是一种将明文字符映射到密文字符的替换密码。
操作步骤:1)编写加密函数subencrypt,实现单表代替密码加密;2)编写解密函数subdecrypt,实现单表代替密码解密;3)测试加密和解密函数,验证其正确性。
(3)维吉尼亚密码原理:维吉尼亚密码是一种多字母替换密码,加密公式为:C = (P + K[i]) mod 26,其中C为密文字母,P为明文字母,K为密钥,i为索引。
操作步骤:1)编写加密函数vigenereencrypt,实现维吉尼亚密码加密;2)编写解密函数vigeneredecrypt,实现维吉尼亚密码解密;3)测试加密和解密函数,验证其正确性。
2. 对称密码实验(1)DES加密算法原理:DES(Data Encryption Standard)是一种分组加密算法,采用56位密钥,64位分组。
操作步骤:1)编写DES加密函数desencrypt,实现DES加密;2)编写DES解密函数desdecrypt,实现DES解密;3)测试加密和解密函数,验证其正确性。
2.1仿射密码解密-python实现1、引例:仿射密码恢复明⽂2.1 仿射密码:AOPC GUDE YKRO IFKG BEFM CPIY CRAR DEPB AQUF EPGH KJPK DDCJ GKPJ IEVC GEBE BAYCFAMC XCER IARE HAFF ERJG HCRA OKBB KYAR RCED KFAI GHCP CDCK DFCB KKME FEMC GKXCOKRQ KYYE BKYC ERBH CCRJ KVEI BKPS AQKU FJRK BIDC EMEG HKFC ICRB CRQC ARQK YDERSERJ GEIQ KRIA JCPC JRKB BKKX PAOH B答案:2.1.密钥K=(a,b)=(19,4),明⽂为:l grew up anong slow talkers,men in particular,who dropped words a few at a time like beansin a hill, and when I got to Minneapolis where people took a Lake Wobegon comma to mean theend of a story, I couldn't speak a whole sentence in company and was considered not too bright.So I enrolled in a speech course taught by Orville Sand, the founder of reflexive relaxology, aself-hypnotic technique that enabled a person to speak up to three hundred words per minute. 2、python代码实现(推荐)# -*- coding: utf-8 -*-'''代码中各个函数的说明如下gcd(a, b) #获取两个数的最⼤公因数multi_gcd(num) #获取数组中所有数的最⼤公因数find_substr(strs) #统计字符串中长度为2的⼦串出现的次数cal_pos(substr, strs, count) #计算字符串中,⼦串出现位置的距离差cal_frequency(strs) #统计字符串中,英⽂字符出现的频率,并计算出 M_nstr_offset(strs, n) #将字符串中的所有英⽂字符整体向左偏移n位'''import operatorfrom functools import reducec = "AOPCGUDEYKROIFKGBEFMCPIYCRARDEPB\AQUFEPGHKJPKDDCJGKPJIEVCGEBEBAYC\FAMCXCERIAREHAFFERJGHCRAOKBBKYAR\RCEDKFAIGHCPCDCKDFCBKKMEFEMCGKXC\OKRQKYYEBKYCERBHCCRJKVEIBKPSAQKU\FJRKBIDCEMEGHKFCICRBCRQCARQKYDER\SERJGEIQKRIAJCPCJRKBBKKXPAOHB"C = []def gcd(a, b):return gcd(b,a%b) if b!=0 else adef multi_gcd(num):return reduce(gcd,num)def find_substr(strs):ans={}for i in range(len(strs) - 1):substr = strs[i:i + 1]count=0if substr not in ans.keys():for j in range(len(strs) - 1):if substr == strs[j:j + 1]:count=count+1;ans[substr] = countreturn ansdef cal_pos(substr, strs, count):ans = []last_pos=0for i in range(count):temp=last_poslast_pos = strs.find(substr, temp+1)#print(last_pos)if i != 0:ans.append(last_pos - temp)return ansdef cal_frequency(strs):p = [0.082, 0.015, 0.028, 0.043, 0.127, 0.022, 0.02,0.061, 0.07, 0.002, 0.008, 0.04, 0.024, 0.067,0.075, 0.019, 0.001, 0.06, 0.063, 0.091, 0.028,0.01, 0.023, 0.001, 0.02, 0.001]frequency = [strs.count(chr(ord('A') + i)) for i in range(26)]ans=sum((frequency[i]*p[i]/ len(strs)) for i in range(len(frequency)))return ansdef str_offset(strs, n):return "".join([chr((ord(i)-ord('A')-n)%26+ord('A'))for i in strs])def crack(strs, dictionary):dictionary=sorted(dictionary.items(), key=operator.itemgetter(1), reverse=True)print(dictionary)#encoding:utf-8def NI(x,b): #定义求x关于b的逆元的函数NI,其中(NI(x,b)*x) mod b = 1 当x和b互质时求出的逆元唯⼀i = 1while (x*i)%b != 1:i = i + 1return i#对密⽂进⾏预处理并储存在列表中,储存形式是对应字母在26个英⽂字母中的位序for i in c:if i == ' ':C.append(i)else:C.append(ord(i)-65)strs=cdictionary = find_substr(strs)print('dictionary data:', sorted(dictionary.items(), key=operator.itemgetter(1), reverse=True),'\n')#将加密算法中a可能的取值储存在列表中a = [3,5,7,9,11,15,17,19,21,23,25]P = []for keyb in range(0,26):for keya in a:y=ord(max(dictionary.items(),key=operator.itemgetter(1))[0])-ord('A')x=ord('E')-ord('A')ni_a = NI(keya,26)if int((y-keyb)*ni_a)%26!=int(x):continuefor s in C:if s == ' ':P.append(' ')else:P.append(((s-keyb)*ni_a)%26) #将明⽂字母对应的位次码依次加⼊到明⽂列表中strP = ''for t in P:if t==' ':strP = strP + ' 'else:strP = strP + chr(t+97) #将明⽂转化为字符串并输出print('keya:',keya,' keyb:',keyb,' strP:',strP)P = []3、求解答案dictionary data: [('C', 26), ('K', 25), ('E', 21), ('R', 20), ('A', 14), ('B', 14), ('F', 11), ('P', 10), ('G', 10), ('I', 10), ('D', 9), ('J', 9), ('Y', 8), ('H', 7), ('Q', 6), ('O', 5), ('M', 5),('U', 3), ('X', 3), ('V', 2), ('S', 2)]keya: 7 keyb: 0 strP: acremotiwuvcqxumpixyerqwevavtirpagoxirmbufruttefmurfqidemipipawexayeheivqavibaxxivfmbevacuppuwavveituxaqmbereteutxepuuyixiyemuhecuvguwwipuweivpbeevfudiqpurkaguoxfvupqteiyimbuxeqevpevgeavguwtivkivfm keya: 19 keyb: 4 strP: ## 搜索 the 定位igrewupamongslowtalkersmeninparticularwhodroppedwordsafewatatimelikebeansinahillandwhenigottominneapoliswherepeopletookalakewobegoncommatomeantheendofastoryicouldnotspeakawholesentenceincompanyandwasconsiderednottoobrigh keya: 25 keyb: 6 strP: gsreamdciwpsybwafcbueryiepgpdcrfgqmbcrazwxrwddexawrxycleacfcfgiebguejecpygpczgbbcpxazepgswffwigppecdwbgyazeredewdbefwwucbcueawjeswpqwiicfwiecpfzeepxwlcyfwrogqwmbxpwfydecucazwbeyepfepqegpqwid keya: 5 keyb: 8 strP: owrekszuyqhwapqkjupgerayehohzurjomspurkfqvrqzzevkqrvaunekujujoyepogedeuhaohufoppuhvkfehowqjjqyohheuzqpoakferezeqzpejqqgupugekqdewqhmqyyujqyeuhjfeehvqnuajqrcomqspvhqjazeugukfqpeaehjehmeohmqyzuh keya: 11 keyb: 10 strP: syrecixqgadyojaclqjmerogedsdxqrlskijqrcvahraxxehcarhoqbecqlqlsgejsmeneqdosdqvsjjqdhcvedsyallagsddeqxajsocverexeaxjelaamqjqmecaneyadkaggqlageqdlveedhabqolarwskaijhdaloxeqmqcvajeoedledkesdkagxqdwqdh keya: 17 keyb: 12 strP: kurescbyqglumvgshyvaermqelklbyrhkocvyrspgjrgbbejsgrjmyzesyhyhkqevkaeteylmklypkvvyljspelkughhgqklleybgvkmsperebegbvehggayvyaesgteuglogqqyhgqeylhpeeljgzymhgrikogcvjlghmbeyayspgvemelheloeklogqbyliylj keya: 23 keyb: 14 strP: wareuyvmokzacdkunmdsercoezwzvmrnwiydmrulktrkvvetukrtcmpeumnmnwoedwsexemzcwzmlwddmztulezwaknnkowzzemvkdwculerevekvdenkksmdmseukxeakzikoomnkoemznleeztkpmcnkrqwikydtzkncvemsmulkdecez keya: 3 keyb: 16 strP: mireoknwuyjigfyovwfqerguejmjnwrvmakfwroxyprynnepoyrpgwteowvwvmuefmqelewjgmjwxmffwjpoxejmiyvvyumjjewnyfmgoxereneynfevyyqwfwqeoyleiyjayuuwvyuewjvxeejpytwgvyrsmaykfpjyvgnewqwoxyfegejvejaemjayunwj keya: 9 keyb: 18 strP: yoreqghkscxowncqbknierwsexyxhkrbyugnkrqtczrchhezqcrzwkjeqkbkbysenyiepekxwyxktynnkxzqtexyocbbcsyxxekhcnywqterehechnebcciknkieqcpeocxucsskbcsekxbteexzcjkwbcrayucgnzxcbwhekikqtcnewexbexueyxucsh keya: 15 keyb: 20 strP: qkregalscifkuzigxszwerucefqflsrxqyazsrgnibrillebgirbushegsxsxqcezqwevesfuqfsnqzzsfbgnefqkixxicqffeslizqugnereleilzexiiwszswegivekifyiccsxicesfxneefbihsuxirmqyiazbfixuleswsgnizeuefxefyeqfyiclsfmsfbgsuyifuqbere keya: 21 keyb: 22 strP: umreyqjoksbmitsyzotcerikebubjorzuwqtorydsnrsjjenysrnioveyozozuketucefeobiuboduttobnydebumszzskubbeojstuiyderejesjtezsscotoceysfemsbwskkozskeobzdeebnsvoizsrguwsqtnbszijeocoydsteiebzebweubwskjobgobn 4、暴⼒破解(不推荐)#encoding:utf-8def NI(x,b): #定义求x关于b的逆元的函数NI,其中(NI(x,b)*x) mod b = 1 当x和b互质时求出的逆元唯⼀i = 1while (x*i)%b != 1:i = i + 1return ic = "AOPCGUDEYKROIFKGBEFMCPIYCRARDEPBAQUFEPGHKJPKDDCJGKPJIEVCGEBEBAYCFAMCXCERIAREHAFFERJGHCRAOKBBKYARRCEDKFAI GHCP CDCK DFCB KKME FEMC GKXC OKRQ KYYE BKYC ERBH CCRJ KVEI C = []#对密⽂进⾏预处理并储存在列表中,储存形式是对应字母在26个英⽂字母中的位序for i in c:if i == ' ':C.append(i)else:C.append(ord(i)-65)#将加密算法中a可能的取值储存在列表中a = [3,5,7,9,11,15,17,19,21,23,25]P = []for keyb in range(0,26):for keya in a:ni_a = NI(keya,26)for s in C:if s == ' ':P.append(' ')else:P.append(((s-keyb)*ni_a)%26) #将明⽂字母对应的位次码依次加⼊到明⽂列表中strP = ''for t in P:if t==' ':strP = strP + ' 'else:strP = strP + chr(t+97) #将明⽂转化为字符串并输出print(strP)print("==========================")P = []# AOPC GUDE YKRO IFKG BEFM CPIY CRAR DEPBAQUF EPGH KJPK DDCJ GKPJ IEVC GEBE BAYCFAMC XCER IARE HAFF ERJG HCRA OKBB KYARRCED KFAI GHCP CDCK DFCB KKME FEMC GKXCOKRQ KYYE BKYC ERBH # 结果:# i grew up among slow talkers men in particular who dropped word safe wata time like beans in a hill and when i got to minneapolis where people took a lake wobegon comma to mean the end of astory i could not speak a whole sentence in com ## 搜索the 得出结果。
古典密码之仿射密码熟练掌握多表古典密码仿射密码加密算法原理及实现根据仿射密码及其加解密算法,创建⼀个明⽂信息,再确定k1,k2,编写实现程序,实现加密和解密操作。
实验流程图:找到桌⾯上的Microsoft Visual C++ 6.0,双击打开。
新建⼀个C++ Source File,⽂件名为fangshe。
将下⾯的代码输⼊。
图4#include#include#includeint gcd(int a, int b) /*辗转相除法求a,b的最⼤公因数*/{int k=0;do{k=a%b;a=b;b=k;}while(k!=0);return a;}int Ni(int a, int b) /*求a相对于b的逆*/{int i=0;while(a*(++i)%b!=1);return i;}void Affine() /*仿射密码*/{char c[100];int length, i=0, ka=0, kb=0;system('cls');printf('********仿射密码*********\n请输⼊最初的明⽂: '); gets(c);length = strlen(c);printf('请输⼊密钥(两数字):');scanf('%d%d', &ka, &kb);getchar();while(gcd(ka,26)!=1){printf('密钥输⼊错误,请重新输⼊');scanf('%d%d', &ka, &kb);getchar();}for(i=0; i{if(c[i]>96&&c[i]<>c[i]=(ka*(c[i]-97)+kb)%26+97;else if(c[i]>64&&c[i]<>c[i]=(ka*(c[i]-65)+kb)%26+65;}printf('\n密⽂为:\n%s\n', c);printf('按任何键返回……');getch();}void exAffine() /*仿射解密*/{char c[100];int length, i=0, ka=0, kb=0, tmp;system('cls');printf('********仿射密码********\n请输⼊最初的密⽂:'); gets(c);length = strlen(c);printf('请输⼊密钥(两数字): '); scanf('%d%d', &ka, &kb); getchar();while(gcd(ka,26)!=1){printf('密钥输⼊错误,请重新输⼊'); scanf('%d%d', &ka, &kb); getchar();}for(i=0; i{if(c[i]>64&&c[i]<>{tmp= Ni(ka, 26)*((c[i]-65)-kb);if(tmp<>c[i]= tmp%26+26+65;elsec[i]= tmp%26+65;}else if(c[i]>96&&c[i]<>{tmp= Ni(ka, 26)*((c[i]-97)-kb);if(tmp<>c[i]= tmp%26+26+97;elsec[i]= tmp%26+97;}}printf('\n明⽂为:\n%s\n', c);printf('按任何键返回……');getch();}int main(){char i= '0';printf('********请按1~3选择:********\n');printf('1.仿射加密\n2.仿射解密\n3.退出\n');i= getch();while(i!='3'){if(i=='1')Affine();else if(i=='2')exAffine();i=getch();}return 0;}Compile和Build之后发现没有错误,这个程序是正确的,然后点击F5运⾏。
C语⾔实现加密解密功能加密主要是通过⼀种算法对原内容进⾏处理,使原来内容不直观可见。
解密过程通常要知道加密的算法,然后对加密后的内容进⾏逆处理,从⽽实现解密功能。
当然解密也有⼀些暴⼒破解的⽅法。
接下来以 c 语⾔为例讲解⼀种简单的加密解密以及暴⼒破解字符串的⽅法,带您⾛进加密解密技术的⼤门。
先讲⼀下凯撒加密,凯撒密码相传是古罗马凯撒⼤帝⽤来保护重要军情的加密系统。
它是⼀种置换密码,通过将字母顺序推后起到加密作⽤。
如字母顺序推后 3 位,字母 A 将被推作字母 D,字母 B 将被推作字母 E。
本实例类似于凯撒加密。
加密算法:⼤(⼩)写字母加密后还为⼤(⼩)写字母。
⼤(⼩)写字母向后推 n 位,n 由⽤户输⼊,如果超出⼤(⼩)写字母的 ASCII 范围,则返回⾄第⼀个⼤(⼩)写字母继续循环。
解密算法(与加密算法正好相反):⼤(⼩)写字母解密后还为⼤(⼩)写字母。
⼤(⼩)写字母向前推 n 位,n 由⽤户输⼊,如果超出⼤(⼩)写字母的 ASCII 范围,则返回⾄最后⼀个⼤(⼩)写字母继续循环。
代码如下:/*字符串加密解密程序凯撒加密*/#include <stdio.h>#include <stdlib.h>#include <string.h>//函数encode()将字母顺序推后n位,实现⽂件加密功能void encode(char str[],int n){char c;int i;for(i=0;i<strlen(str);++i){ //遍历字符串c=str[i];if(c>='a' && c<='z'){ //c是⼩写字母if(c+n%26<='z'){ //若加密后不超出⼩写字母范围str[i]=(char)(c+n%26); //加密函数}else{ //加密后超出⼩写字母范围,从头开始循环⼩写字母str[i]=(char)(c+n%26-26);}}else if(c>='A' && c<='Z'){ //c为⼤写字母if(c + n%26 <= 'Z'){ //加密后不超出⼤写字母范围str[i]=(char)(c+n%26);}else{ //加密后超出⼤写字母范围,从头开始循环⼤写字母str[i]=(char)(c+n%26-26);}}else{ //不是字母,不加密str[i]=c;}}printf("\nAfter encode: \n");puts(str); //输出加密后的字符串}//decode()实现解密功能,将字母顺序前移n位void decode(char str[],int n){char c;int i;//遍历字符串for(i=0;i<strlen(str);++i){c=str[i];//c为⼩写字母if(c>='a' && c<='z'){//解密后还为⼩写字母,直接解密if(c-n%26>='a'){str[i]=(char)(c-n%26);}else{//解密后不为⼩写字母了,通过循环⼩写字母处理为⼩写字母str[i]=(char)(c-n%26+26);}}else if(c >= 'A' && c<='Z'){ //c为⼤写字母if(c-n%26>='A'){ //解密后还为⼤写字母str[i]=(char)(c-n%26);}else{ //解密后不为⼤写字母了,循环⼤写字母,处理为⼤写字母str[i]=(char)(c-n%26+26);}}else{ //⾮字母不处理str[i]=c;}}printf("\nAfter decode: \n");puts(str); //输出解密后的字符串}//该函数代码有冗余,读者可改进int main(){char str[50];int k=0,n=0,i=1;printf("\nPlease input strings: ");scanf("%s",str); //输⼊加密解密字符串//打印菜单printf("-----------------\n");printf("1: Encryption\n");printf("2: Decryption\n");printf("3: Violent Crack\n"); //暴⼒破解printf("-----------------\n");printf("\nPlease choose: ");scanf("%d",&k);if(k==1){ //加密printf("\nPlease input number: ");scanf("%d",&n);encode(str,n);}else if(k==2){ //解密printf("\nPlease input number: ");scanf("%d",&n);decode(str,n);}else{for(i=1;i<=25;++i){ //尝试所有可能的n值进⾏暴⼒破解printf("%d ",i);decode(str,i);}}return 0;}测试运⾏如下:成功实现加密解密功能,读者可以稍加改造完成对⽂件的加密解密以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
程序:仿射加密解密
1.软件功能:
字符串的加密和解密功能,没有支持中文的功能
文件的加密我解密功能,没有支持中文的功能
支持查看源代码的功能,(前提是:文件夹的名字不能更改,只能是“仿射加解密”)
2.实现方法:
加密时,根据算法:y = ax+b mod 26;
解密时,根据算法:x = a^(-1)(y-b) mod 26;
3.测试结果:
加密:
a=3 b=5
输入:abcdefg
输出:filorux
解密:
A=3 b=5
输入:filorux
输出:abcdefg
4.相关核心算法:
//加密函数,形参为明文,返回CString类型的密文
CString CPrj_1Dlg::encrypt(CString str,int keya,int keyb)
{
CString str2=str; //使str2和str具有相同的大小
char ch;
for(int i=0;i<str.GetLength();i++)
{
//str.MakeUpper();
ch=str.GetAt(i);
//ch = (m_key_a*(ch-65)+m_key_b)%26+65;
if(ch>96&&ch<123)
ch = (keya*(ch-97)+keyb)%26+97;
else if(ch>64&&ch<91)
ch = (keya*(ch-65)+keyb)%26+65;
str2.SetAt(i,ch);
}
return str2;
}
//解密函数,形参为明文,返回CString类型的明文
CString CPrj_1Dlg::dencrypt(CString str,int keya,int keyb)
{
CString str2=str; //使str2和str具有相同的大小
int a0;
int k=0; // a0*a=1mod26 when(26*k+1)%a==0 , a0=(26*k+1)/a
while((26*k+1)%keya!=0)
{
k++;
}
a0=(26*k+1)/keya;
for(int i=0;i<str.GetLength();i++)
{
int temp;
char ch=str.GetAt(i);
if(ch>64&&ch<91)
{
temp=ch-65;
if((temp-keyb)<0)
str2.SetAt(i,((a0*(temp-keyb))%26+26)+65);
else
str2.SetAt(i,((a0*(temp-keyb))%26)+65);
}
else if(ch>96&&ch<123)
{
temp=ch-97;
if((temp-keyb)<0)
str2.SetAt(i,((a0*(temp-keyb))%26+26)+97);
else
str2.SetAt(i,((a0*(temp-keyb))%26)+97);
}
}
return str2;
}。