自制的 Vigenere 密码;使用 ascii 字符操作

Posted

技术标签:

【中文标题】自制的 Vigenere 密码;使用 ascii 字符操作【英文标题】:Homemade Vigenere cipher; working with acsii character manipulation 【发布时间】:2013-02-08 19:48:04 【问题描述】:

正如帖子标题所示,我正在努力加强对 C++ 和字符操作的掌握,这次是通过创建 Vigenere Cipher。对于那些不熟悉它的人来说,这是一种加密文本文件的相当简单的方法。

它的基本工作方式是存在一个字符串“key”,并且每个字符(至少在我的情况下)都是一个小写字母字符。这些存储在一个数组中,用于“移动”被编码文件的值。字符“a”会将目标移动 0,而“z”会将目标移动 25。“移位”是循环的,这意味着如果“z”移动“b”(1),它应该会导致'一个'。


我目前的方法如下:

//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')

【问题讨论】:

【参考方案1】:

假设您想通过两步将“1”数字 0-9 在 20 和 29 之间“洗牌”,使 20 变为 22,而 29 变为 21。你会怎么做?

好吧,我会减去 20 [我们的基数],然后将剩余的数字洗牌,然后再加 20。

newnum = 数字 - 20; 新数字 %= 10; 新数字 += 20;

同样的原则也适用于 ascii - 当然基数不是 20。

【讨论】:

以上是关于自制的 Vigenere 密码;使用 ascii 字符操作的主要内容,如果未能解决你的问题,请参考以下文章

C语言的Vigenere Cypher程序

Python:解码使用仿射密码编码的 Vigenere 密码

尝试加密和解密 vigenere 密码

Vigenere 密码语法错误

为啥 Vigenere 密码只能正确加密部分消息?

使用从文件中读取明文的 Vigenere 密码进行加密 (JAVA)