自制Vigenere密码;使用acsii字符操作
Homemade Vigenere cipher; working with acsii character manipulation
正如帖子标题所示,我正在努力加强对C++和字符操作的掌握,这次是通过创建Vigenere密码。对于那些不熟悉它的人来说,这是一种相当简单的加密文本文件的方法。
它的基本工作方式是存在一个字符串"key",每个字符(至少在我的情况下)都是小写字母字符。这些被存储到一个数组中,用于"移位"正在编码的文件的值。字符"A"将使目标移动0,而"z"将使其移动25。"移位"是周期性的,这意味着如果"z"移位"b"(1),则应产生"a"。
我目前的方法如下:
//Assume cipher[] contains "[a][b][c][x ][y ][z ]" Cipher is a <string> object
//Assume ptr[] contains "[0][1][2][23][24][25]
#A whole bunch of includes
char c;
ifstream is;
ofstream os;
is.open(argv[3]) //"myinput.txt"
os.open(argv[4]) //"myoutput.txt"
int i = 0;
while( is.good() ) {
c = is.get();
if( is.good() ) { //did we just hit the EoF?
c = tolower( c - 0 ); //just make sure it's lowercase
c = c + ptr[ i % cipher.size() ] % 26;
if( c> 122 )
c = ( c % 123 ) + 97;
i++;
os.put( c );
}
}
我相信我的问题在于我的模运算。也许是因为我花了太多时间讨论这个问题,但我昨晚花了几个小时写了这个,然后又躺在床上花了一个小时,试图把我的思想集中在如何有效地创建我想要的东西上:
grab char.
check char. //let char = 'z'
check the cipher. //let the cipher = 'y'
eval cipher shift //'y' shift value = 24
shift z 24 places (cyclically) //'z'==25, 25+24=49, 49%26=23. 23='x'
问题是:如何使用ACSII做到这一点?('a'=97,z='121')
想象一下,您想将20和29之间的"一"数字0-9"洗牌"两步,使20变为22,29变为21,。你会怎么做?
好吧,我会减去20(我们的基数),然后打乱剩下的数字,然后再加20。
newnum=num-20;newnum%=10;newnum+=20;
同样的原理也适用于ascii——只是基数当然不是20。
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中无符号字符溢出
- 自制Vigenere密码;使用acsii字符操作