【问题标题】:Vigenere cipher C++维吉尼亚密码 C++
【发布时间】:2017-05-06 15:47:37
【问题描述】:

HZVIG.cpp:

#include "HZVIG.h"

char ROTEncode(char inchar, int rot)
{
    if (IsBigLetter(inchar))
        return ((int)inchar - (int)'A' + rot) % 26 + 'A' - 1;
    else if (IsSmallLetter(inchar))
        return ((int)inchar - (int)'a' + rot) % 26 + 'a' - 1;
    else
        return inchar;
}
char ROTDecode(char inchar, int rot)
{
    if (IsBigLetter(inchar))
        return ((int)inchar - (int)'A' - rot + 26) % 26 + 'A' - 1;
    else if (IsSmallLetter(inchar))
        return ((int)inchar - (int)'a' + rot + 26) % 26 + 'a' - 1;
    else
        return inchar;
}
std::string VIGDecode(std::string instring, std::string key)
{
    std::string result;
    for (int i = 0; i < instring.length(); i++)
        result += ROTDecode(instring[i], key[i % key.length()] - 'A' + 1);
    return result;
}
std::string VIGEncode(std::string instring, std::string key)
{
    std::string result;
    for (int i = 0; i < instring.length(); i++)
        result += ROTEncode(instring[i], key[i % key.length()] - 'A' + 1);
    return result;
}

HZVIG.h:

#include <string>

#define IsBigLetter(a) a >= 'A' && a <= 'Z'
#define IsSmallLetter(a) a >= 'a' && a <= 'z'

std::string VIGDecode(std::string instring, std::string key);
std::string VIGEncode(std::string instring, std::string key);

此代码有效,但输出错误:

C:\Users\adm1n\Desktop\C\HZToolkit>HZToolkit --evig --key ALPHA HZU18{CLASSICAL_CIPHER}
HKJ18{NAHSSTRHL_NXWHEC}

应该是:HKJ18{JLADHPCAW_RPPHPG} 我认为输入没问题,功能出了问题。 C:\Users\adm1n\Desktop\C\HZToolkit>HZToolkit --evig --key ALPHA ALPHA 输出:AWEOA

【问题讨论】:

    标签: c++ cryptography vigenere


    【解决方案1】:

    为什么你认为这是错误的?请注意,即使明文不是字母,您仍然“提前”密钥(至少,这是您的程序当前所做的)。

    排列纯文本并复制密钥:

         Plain: HZU18{CLASSICAL...
           Key: ALPHAALPHAALPHA...
                ^        ^^   ^
       You get: HKJ18{NAHSSTRHL...
    You expect: HKJ18{JLADHPCAW...
    

    注意标有^的地方:那些是密钥等于A的地方,因此不会进行加密(明文字母变成密文字母)。

    我觉得很好。

    (虽然解密被破坏了。作为提示,请注意ROTDecode 不会以相同的方式处理小写和大写字母)。

    【讨论】:

    • 感谢您的回答。我明白出了什么问题:函数应该忽略非字母符号。
    猜你喜欢
    • 1970-01-01
    • 2015-12-01
    • 2013-10-02
    • 2016-01-18
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多