gpt4 book ai didi

c++11 - c++ 中的 vigenere 密码

转载 作者:行者123 更新时间:2023-12-02 01:24:26 32 4
gpt4 key购买 nike

我尝试创建一个 C++ 程序,它接受一些输入并使用 vignere 密码对其进行加密。

我的输入是:

the swift brown fox jumps over the lazy dog

给定键“hello”,输出如下:

alpdvpjemqvayqnenfxozsgpqalpwgcozfg

解密的内容如下:

theshiftbcownfzxjumasovecthelsvkous

超过 50% 的加密是正确的,我不知道我是如何做到这一点的。

我的代码如下:

#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
#include <sstream>
#include <streambuf>
#include <locale>

class Passcode {
private:
std::string passcode;
public:
void set_passcode(const std::string pc){
passcode = pc;
}
char get_char(std::size_t index){
return passcode[index];
}
std::size_t get_size(){
return passcode.length();
}
};

int find_index(char* arr, const std::size_t SIZE, const char flag){
for(std::size_t i=0; i<SIZE; ++i){
if (arr[i]==flag) return i;
}
return -1;
}

int main() {
char alphabet[26] = {'a','b','c','d','e','f','g','h',
'i','j','k','l','m','n','o','p',
'q','r','s','t','u','v','w','x',
'y','z'};

//grab input
std::ifstream input("input.txt");
std::stringstream buf;
buf << input.rdbuf();
std::string str = buf.str();

//codify string
//no spaces, no caps, etc.
std::locale loc;
std::string uncyphered_text;
for(std::size_t i=0; i<str.length(); ++i){
if(str[i]!=' ') uncyphered_text+=std::tolower(str[i],loc);
}

//grab key
std::cout << "Enter your passcode: ";
std::string in; std::cin >> in;
Passcode pass; pass.set_passcode(in);

//encypher text
std::string encyphered_text;
for(std::size_t i=1; i<=uncyphered_text.length(); ++i){
char current_char = pass.get_char(i%pass.get_size()-1);
int current_char_index = find_index(alphabet, 26, current_char);
int current_cypher_index = find_index(alphabet, 26, uncyphered_text[i-1]);
encyphered_text+=alphabet[(current_char_index+current_cypher_index)%26];
}

std::cout << encyphered_text << std::endl;

return 0;
}

我觉得我可能在使用模数运算符时做错了什么。

最佳答案

问题:模数使用不当和索引不当。

  //encypher text
std::string encyphered_text;
for(std::size_t i=0; i<uncyphered_text.length(); ++i){
char current_char = pass.get_char(i%pass.get_size());
int current_char_index = find_index(alphabet, 26, current_char);
int current_cypher_index = find_index(alphabet, 26, uncyphered_text[i]);
encyphered_text+=alphabet[(current_char_index+current_cypher_index)%26];
}

这对我有用。

关于c++11 - c++ 中的 vigenere 密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37965960/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com