维吉尼亚密码 C++

Posted

技术标签:

【中文标题】维吉尼亚密码 C++【英文标题】:Vigenere cipher 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 HZU18CLASSICAL_CIPHER
HKJ18NAHSSTRHL_NXWHEC

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

【问题讨论】:

【参考方案1】:

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

排列纯文本并复制密钥:

     Plain: HZU18CLASSICAL...
       Key: ALPHAALPHAALPHA...
            ^        ^^   ^
   You get: HKJ18NAHSSTRHL...
You expect: HKJ18JLADHPCAW...

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

我觉得很好。

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

【讨论】:

感谢您的回答。我明白出了什么问题:函数应该忽略非字母符号。

以上是关于维吉尼亚密码 C++的主要内容,如果未能解决你的问题,请参考以下文章

简单的加密算法——维吉尼亚密码

密码那些事儿|(十)“钥匙”打开维吉尼亚的锁

维吉尼亚密码(Vigenère cipher)

维吉尼亚密码:加密强悍,却为何没人用?

《密码学》维吉尼亚密码。

凯撒简单替换维吉尼亚密码 CRC 破解