模拟问题之密码学

网友投稿 298 2022-08-31

模拟问题之密码学

许多信息加密过程有着复杂的数学原理,但是一些简单的密码问题通过模拟即可解决。

POJ 3749 破译密码

​​#include #include using namespace std;char str[205],s[20];int main(){ while(~scanf("%s",s)){ if(strcmp(s,"ENDOFINPUT")==0) break; getchar(); gets(str); int len=strlen(str); for(int i=0;i=65){ str[i]=(str[i]-65-5+26)%26+65; } } scanf("%s",s); printf("%s\n",str); } return 0;}

UESTC_old - 1063

易位法字符串加密

密码学是一门既古老又年轻的学科。说它古老,是因为早在几千年前,人类就已经有了通信保密的思想,并先后出现了易位法和置换法等加密方法。到了1949 年,信息论的创始人香农(C.E.Shannon)论证了由传统的加密方法所获得的密文,几乎是都可攻破的,这使得密码学的研究面临着严重的危机。     直 至进入20世纪60年代,由于电子技术和计算机技术的迅速发展,以及结构代数、可计算性理论学科研究成果的出现,才使密码学的研究走出困境而进入了一个新 的发展时期;特别是美国的数据加密标准DES和公开密钥密码体制的推出,又为密码学的广泛应用奠定了坚实的基础。     虽然加密方法很多,但最 基本的加密方法只有两种,即易位法和置换法,其它方法大多是基于这两种方法形成的。易位法是按照一定的规则,重新安排明文中的比特或字符的顺序来形成密 文,而字符本身保持不变。按易位单位的不同又可分成比特易位和字符易位两种易位方式。前者的实现方法简单易行,并可用硬件实现,主要用于数字通信中;而后 者即字符易位法则是利用密钥对明文进行易位后形成密文。     具体方法是:假定有一密钥DCAB,其长度为4,字符串为I love China,去掉空格,四位四位分组,不足四位时用e补齐。具体见下图所示。输出时转化为大写输出。注意分组时要求先去掉空格,取列时按密钥的ASCII 码从小到大取,输出时要求英文字母全转换为大写

复制字符串时注意空格问题

处理字符串到数组时也要注意空格问题

(下面的代码不知道能不能行,OJ上居然没找到这题)

#include #include #include #include using namespace std;const int N=1005;struct node{ char val; char str[N]; int dth;}key[25];int cmp(node a,node b){ return a.val=97) a-=32; return a;}int main(){ //freopen("cin.txt","r",stdin); char code[25]; while(~scanf("%s",code)){ int len=strlen(code); for(int i=0;i

POJ 1107 W's Cipher

​​#include #include using namespace std;const int N=100;char str[N];int vis[N];char s1[N],s2[N],s3[N];char g1[N],g2[N],g3[N];int main(){ //freopen("cin.txt","r",stdin); int k1,k2,k3; int top1,top2,top3; while(scanf("%d%d%d",&k1,&k2,&k3)&&(k1+k2+k3)){ getchar(); gets(str+1); memset(vis,0,sizeof(vis)); top1=top2=top3=0; int len=strlen(str+1); for(int i=1;i<=len;i++){ if(str[i]<='i'&&str[i]>='a'){ s1[top1++]=str[i]; vis[i]=1; } else if(str[i]<='r'&&str[i]>='j'){ s2[top2++]=str[i]; vis[i]=2; } else { s3[top3++]=str[i]; vis[i]=3; } } for(int i=0;i

POJ 2159 Ancient Cipher

​​#include #include #include using namespace std;const int N=105;char s1[N],s2[N];int c1[30],c2[30];int main(){ //freopen("cin.txt","r",stdin); while(~scanf("%s",s1)){ memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); scanf("%s",s2); int len=strlen(s1); for(int i=0;i

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:互动营销火爆,电商运营该怎么做?(电商的运营推广)
下一篇:法雷级数(数列)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~