我有一个秘密的“使命”来编写Vigenère密码,用ascii字母表进行分析。
我在加密文字方面遇到了一些麻烦。
它们有两种:
1)如果我使用整个ascii表,解密文本会有一些麻烦,因为我使用“系统”字符来杀死我的文本(顺便说一下,它是托尔斯泰写的“战争与和平”)。我应该使用截断版吗? 如果是,那么 - 我可以使用截断的ascii表从下一个问题进行操作吗?
2)我希望将整个文本放在一个字符串中。我可以这样做:
string s;
string p = "";
ifstream in("text_for_encryption.txt");
while (getline(in, s))
{
p+=s;
p+="\n";
}
“s”是临时字符串,“p”是包含文件中所有文本的字符串(使用endl,当然还有EOF) 我将为“p”创建一个循环,看起来像
while (not eof in p)
{
take first keyword.length() chars from "p"? check every of them for EOF and encrypt them. (they will be deleted from p)
kick them in file "encrypted_text.txt"
}
在伪代码中(是的,它像狗屎一样:()。
所以,问题是 - 如何将字符串元素与eof进行比较? 也许,我不能谷歌好,但我找不到这个问题的答案。
提前感谢您的每一条建议!
更新: 如果我将逐个字符串加密,它将很容易通过Fridman的方法得到一个密钥的长度(如果密钥非常小)。 所以我想用endl加密文本以获得更高的安全性
答案 0 :(得分:4)
对于加密,它在很大程度上取决于您要加密的内容, 以及你想用加密文本做什么。通常 解决方案是加密字节值(而不是字符); 这意味着您必须读取和写入加密文件 在二进制模式下,但因为它无论如何都不是可读的, 这通常不是问题。
对于其余部分,字符串没有“EOF”字符。事实上,
没有EOF角色这样的东西[1]。 (Nor endl
事实上,EOF是一个“事件”
从溪流中读书时;事实上,在C ++中,它被视为
一种错误。 std::istream
可以返回的函数
EOF(例如std::istream::get()
)返回int
,而不是char
,
为了能够返回带外值。
字符串确实具有已知长度。要访问所有角色 在一个字符串中:
for ( std::string::const_iterator current = s.begin();
current != s.end();
++ current ) {
// Do something with *current...
}
(如果您有C ++ 11,则可以替换
std::string::const_iterator
auto
std::istream::get()
。这更简单
键入,但直到你掌握迭代器习语,它可能
最好写出类型,以确保你理解是什么
继续。)
[1]历史上,文本文件中有一些EOF字符 系统。这是不您看到的文件末尾 {{1}},但即使在今天,如果你打开一个文件 在Windows下的文本模式下,文件中的0x1A将触发结束 输入中的文件事件。