声明:无论以下情况如何,均与Affine Cipher相关。对于不知道它的人,这是一种使用数学函数Ax + B根据字母表中字母索引来移动给定明文中的每个字母的加密方法。C中的仿射密码无法正常工作
我写了一个代码,使用仿射密码对给定的明文或加密文本进行加密和解密。它由以下三个功能组成:
char *encryption(char Plaintext[MAXSIZE], int A, int B);
int modularinverse(int number, int modulo);
char *decryption(char Ciphered[MAXSIZE], int A, int B, int inverse);
解密函数中涉及到我站点的部分。大约三四个字母是错过计算的。
让我们考虑下面的明文: “A B C d e” 的
使用加密函数:
char *encryption(char Plaintext[MAXSIZE], int A, int B) {
static char Ciphered[MAXSIZE];
int i;
int y;
int index;
for (i = 0; i < strlen(Plaintext) - 1; i++) {
if (Plaintext[i] == ' ') {
Ciphered[i] = ' ';
} else {
index = (int)Plaintext[i] - 'a';
y = (A * index + B) % 26;
Ciphered[i] = (char)y + 97;
}
}
return Ciphered;
}
它变成明文分为: “F米T A H”。哪个是对的。
解密明文应该明显地给出:“a b c d e”。相反,它给出了:“a b c J e”。
char *decryption(char Ciphered[MAXSIZE], int A, int B, int inverse) {
static char NewPlaintext[MAXSIZE];
int i;
unsigned int x;
int y;
int index;
for (i = 0; i < strlen(Ciphered); i++) {
if (Ciphered[i] == ' ') {
NewPlaintext[i] = ' ';
} else {
index = (int)Ciphered[i] - 'a';
x = inverse * (index - B) % 26;
NewPlaintext[i] = (char)x + 97;
}
}
return NewPlaintext;
}
字母d
由于我不知道的原因而错过计算。印刷变量index
,inverse
,B
和x
的人物f m t a h
将分别返回这个每个人的价值观:
5 15 5 0
12 15 5 1
19 15 5 2
0 15 5 -23
7 15 5 4
第一列代表的字母f m t a h
的指标。
第二列代表A=7
的倒数,即15
。 (完全有害,你可以忽略它)。
第三列表示B现在是一个常数(您可以忽略它)。
第四列代表x是inverse*(index-B) % 26
的结果。在该列中的每个数字上加97('a'的ASCII码)将导致每个字母的ASCII码。
即0 + 97 = 97这是'a'。由结果解密(f)= a。
但是,如果你能注意到。字母'a'的x的结果是-23。 -23 + 97 = 74这是ASCII码中的J。它应该是100,因为它是d的ASCII码。因此x的结果应该是3而不是-23。
这个错过计算背后的原因是嗡嗡我,我还没有想出是什么原因造成的。
我假设你正在学习编码。如果是这样,自己解决问题,学习如何调试非常重要。添加打印语句,跟踪执行,添加断点,观察变量和** think **。 [Richard Feynman](https://en.wikipedia.org/wiki/Richard_Feynman)通过思考固定收音机。想想:“这怎么可能发生”? – zaph
@zaph我试过了,但我想不通为什么编译器认为简单计算的结果是-23。我已经测试过它,它给了我3它应该是。 – Amine
@Amine:编译器不会*思考*,它会生成代码,如果'B'大于'index',那么您编写的表达式可以具有负值。划分向'0'截去,'-23%26'评估为'-23'。 – chqrlie