我一直在尝试编写一个C ++程序,该程序可以将给定的字母加密为Vigenere加密的字母。如果字母长度为26个字母,则可以使用该代码,但是当我尝试使它们使用不同大小的字母(本示例中为25个字母)时,我得到了不相关的代码。
例如:
字母:ABCDEFGHIJKLMNOPQRSTUVWXY(字母长度为25)
文字:MUADGRATRYINGTOMAKEITWORK
关键字:KAIJG
加密文本:CANRRHFHGKXSTIACFXSTJCCGV
解密文本:RAFILWFYWENSLYTRFPJNYCTWP
我当前的加密公式是:
for (i = 0; i < lengthoftext; i++) {
encryptedtext[i] = ((text[i] + keytext[i]) % alphabetlength) + 'A' + 1;
if (encryptedtext[i] < 65) {
encryptedtext[i] = encryptedtext[i] + alphabetlength;
}
if (encryptedtext[i] > 90) {
encryptedtext[i] -= alphabetlength;
}
解密公式为:
for (i = 0; i < lengthoftext; i++) {
decryptedtext[i] = (((decryptedtext[i] - keytext[i]) + alphabetlength) % alphabetlength) + 'A' - 1 - (5 * (26 - alphabetlength));
if (decryptedtext[i] < 65) {
decryptedtext[i] = decryptedtext[i] + alphabetlength;
}
if (decryptedtext[i] > 90)
decryptedtext[i] = decryptedtext[i] - alphabetlength;
}
因此,它适用于mod 26,没有问题,但是当我尝试将字母更改为ABCDEFGH,然后尝试将其恢复为解密形式时,我得到的结果并不重要。更改字母长度时找不到任何模式。我想知道如何更改公式或进行加密的新方法。
答案 0 :(得分:0)
让我们分析一下您的代码中第一个字母“ M”的情况。
我将在您的第一行代码中替换它。 顺便说一句,我假设keyText
包含您的关键字重复次数,以便包含与示例相同的字符数:KAIJGKAIJGKAIJGKA...
。 < / p>
encryptedtext[i] = ((text[i] + keytext[i]) % alphabetlength) + 'A' + 1;
这看起来像这样:
encryptedtext[i] = (('M' + 'K')% 25) + 'A' + 1
通过用ascii table替换值,您将得到:
encryptedtext[i] = ((77 + 75)% 25) + 65 + 1
表示encryptedtext[i] = 67
确实是C。
总结:ASCII具有26个字符的字母表,该表可能与您自己的alphabetlength
不同。创建自己的字母映射,不依赖ASCII进行int转换,这只是在麻烦。