维吉尼亚密码
原理
维吉尼亚密码是一种简单的多表代换密码(由26个类似的Caesar密码的代换表组成),
即由一些偏移量不同的恺撒密码组成,这些代换在一起组成了密钥。
英文中a~z,由0~25表示。
假设串长为m,明文为P,密文为C,密钥为K则
也可以根据图1进行计算,如图。
例如,假如明文为:
ATTACKATDAWN
选择某一关键词并重复而得到密钥,如关键词为LEMON时,密钥为:
LEMONLEMONLE
对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L。类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X。以此类推,可以得到:
明文:ATTACKATDAWN密钥:LEMONLEMONLE密文:LXFOPVEFRNHR
实现
#include<stdio.h> //加密 int encrypt(char *text,char *result,char *k) { int l,i,j=0,z=0; for(l=0;text[l]!='\0';l++); for(i=0;i<l;i++) { result[z]=(text[i]-'a'+k[j]-'a')%26+'a'; j++; z++; } return 0; } //解密 int decrypt(char *text,char *result,char *k) { int l,i,j=0,z=0; for(l=0;text[l]!='\0';l++); for(i=0;i<l;i++) { result[z]=(text[i]-k[j]+26)%26+'a'; j++; z++; } return 0; } int main() { char text[50]=""; char result[50]=""; char k[50]=""; int type; /**欢迎**/ printf("--------欢迎使用Vigenere密码-----------\n"); printf("请填写明文或者密文\n"); scanf("%[^\n]",text); printf("请选择加密方式,输入1加密,输入2解密\n"); scanf("%d",&type); printf("请输入密钥k\n"); scanf("%s",k); if(type == 1){ /**加密**/ encrypt(text,result,k); printf("明文%s的密文为:%s\n",text,result); }else if(type == 2){ /**解密**/ decrypt(text,result,k); printf("密文%s的明文为:%s\n",text,result); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型