标签:
乘数密码也是一种替换密码,其加密变换是将明文字母串逐位乘以密钥k并进行模运算,数学表达式如下:
E(m)=k*m mod q, gcd(k,q)=1 (即k,q互素)。
当k与q互素时,明文字母加密成密文字母的关系为一一映射。
现有一经过乘法加密的密文,请破译出它的明文。
ILOVEYOU 3
UVWHKIWY
题意:这个题看了很久才看懂题意,意思是给你一个k值,每一个字母都根据k和给出的公式进行了加密,那么现在要解密输出明文。
思路:也就是一个逆向的过程。首先为了方便我们先把A~Z的ascll码编程0~26,那么我们首先将明文转换为暗文用数组记录每一个对应关系,
但存的时候我们是将暗文用下标保存,明文用下标对应的值保存,这样一来输入给出暗文,我们根据数组就可以输出对应的明文。也就完成了解密的过程。
Code:
#include <stdio.h> #include <string.h> char str[50],ch[50]; void mapping(int k) //建立明文与暗文的映射 { int i; for(i=0;i<26;i++) ch[i*k%26]=i+'A'; //ch的坐标为暗文,其对应值为明文 } int main() { int k,i; while(scanf("%s%d",str,&k)!=EOF) { mapping(k); for(i=0;i<strlen(str);i++) str[i]=ch[str[i]-'A']; //直接用暗文下标找到对应的明文 printf("%s\n",str); } return 0; }
标签:
原文地址:http://blog.csdn.net/sxx312/article/details/51345853