【问题标题】:Vigenere Encription with different modVigenere 加密与不同的 mod
【发布时间】:2023-03-19 18:34:01
【问题描述】:

我一直在尝试编写一个 C++ 程序,它可以将给定的字母加密为 Vigenere 加密的字母。如果字母表长度为 26 个字母,则它可以工作,但是当我尝试让它们与不同大小的字母表一起工作时(在这个例子中假设为 25),我得到了不相关的代码。


例如:

字母:ABCDEFGHIJKLMNOPQRSTUVWXY(字母长度为 25)
文字:MUADGRATRYINGTOMAKEITWORK
KEY: 凯捷
加密文本: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,然后尝试将其恢复为解密形式时,我得到了不相关的结果。更改字母长度时我找不到任何模式。我想知道如何更改我的公式或进行加密的新方法。

【问题讨论】:

  • keytext[i] 应该是keytext[i % len(key) ]
  • 或者在此之前他可以在代码中根据需要重复多次,我们不知道......
  • 什么都没有改变。结果是一样的

标签: c++ encryption


【解决方案1】:

例如,让我们分析一下您的代码在此处发生的情况,例如第一个字母“M”。

我将在您的第一行代码中替换它。 顺便说一句,我认为keyText 包含您的关键字的重复次数,以便包含与您的示例相同数量的字符:KAIJGKAIJGKAIJGKA...

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 的翻译,那是自找麻烦。

【讨论】:

  • 是的,keyText 是我的关键字的重复。很抱歉没有指出来。我想创建自己的字母表,但也想要一个捷径,但如果没有,那我就必须这样做......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多