Vigenere Encription具有不同的mod

时间:2018-12-19 13:26:10

标签: c++ encryption

我一直在尝试编写一个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,然后尝试将其恢复为解密形式时,我得到的结果并不重要。更改字母长度时找不到任何模式。我想知道如何更改公式或进行加密的新方法。

1 个答案:

答案 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转换,这只是在麻烦。