Vigenere 加密

Posted

技术标签:

【中文标题】Vigenere 加密【英文标题】:The Vigenere encryption 【发布时间】:2012-10-21 19:39:16 【问题描述】:

我写了一些代码,里面使用了 。这是一个用于加密/解密任何文件的简单程序。

#include<stdio.h>
/*
LANGUAGE: C.
STANDARD: C89.

ABOUT PROGRAM:
This is a simple program for encrypting/decrypting any files.
The size of source file coincide with size of result file.
For encryption of file are use any string key. For decrypting, 
you must to use the same key, which was used for encryption.

NOTES:
The Vigenere encryption are used in it. 
Info at the site: http://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher.
This simple algorithm is often used at commercial products. The 
Vigenere's algorithm are using a string key, and 'XOR' for 
encrypting/decrypting information.

WARNING!
The use of this method, doesn't give 100% of a warranty 
for protection of your information. Don't create the keys, 
consisting of identical characters, for example" "aaaaa", 
"zzz", "xxxx" e.t.c. - it is very feeble protection!
Don't forget your encrypting keys... :)

SYNTAX OF USING:

vigenere StringKey SourceFileName ResultFileName

where:
vigenere - program name;
StringKey - string key for encrypting/decrypting;
SourceFileName - source file name;
ResultFileName - result file name;

EXAMPLE OF USING:
vigenere "G5$hj4*df7f3+x" "c:\temp\source.txt" "c:\temp\result.txt"

*/
int main(int argc, char *args[])
    /****************************************************/
    /* All variables must be defined on top in function, otherwise 
    some compilers can't compile this code (for example - MS 
    Visual Studio 2012. */
    char ch; /* The next char for encrypting/decrypting. */
    char *x; /* String key. */
    FILE *srcFile; /* Source file. */
    FILE *trgFile; /* Result file. */   
    /****************************************************/

    /* The first argument always is a program file name. */
    if (4 != argc)
        return 1; /* Invalid arguments count. */

    if (!*args[1] || !*args[2] || !*args[3])
        return 2; /* Contains the empty argument. */

    x = args[1];
    if ((srcFile = fopen(args[2], "rb")) != NULL)
        if ((trgFile = fopen(args[3], "wb")) != NULL)          
            while((ch = getc(srcFile)) != EOF)
                if(!*x++)
                    x = args[1];
                putc((ch ^= *x), trgFile);
                       
            fclose(trgFile);
        
        else
            return 4;  /* Result file wasn't created. */
        fclose(srcFile);
    
    else
        return 3; /* Source file wasn't opened. */
    return 0; /* Successful operation. */

但这段代码并不总是能正常工作。我不明白为什么会发生。我对每个字节进行异或。我已经在such TXT files 上测试了这段代码。我的错在哪里?

【问题讨论】:

这是一个非常糟糕的提问方式,你应该找到一个你知道不工作的特定部分并提出一个特定的问题。 在崩溃时并不总是能正常工作/不能解密到同一个文件/挂起/...? @Joachim Isaksson 对于某些文件结果不包含所有数据。 @ouah:谁说一定要叫argv @Dani 会不会影响代码运行? 【参考方案1】:
 char ch;

 /* ...  */

 while((ch = getc(srcFile)) != EOF)

ch 必须是 intEOF 被定义为否定的int

【讨论】:

这可能是截止文件的答案。 Afaict 任何 0xff 字符都将扩展为 EOF 并停止文件处理。 谢谢!我不专心。现在一切正常。【参考方案2】:

除了 ouah 的回答,指针值的增量看起来是关闭的。

您的 if 声明 if(!*x++) 不好,原因有两个:

    通过在实际 XOR 操作之前执行增量,您将跳过初始循环中键的第一个字符。 如果您已经到达空终止字符,则增加指针是没有意义的。

更好的代码是:

while((ch = getc(srcFile)) != EOF)
    putc((ch ^= *x), trgFile);
    if(!*++x)
        x = args[1];
           

【讨论】:

表达式 *x++ 的工作方式如下(据我所知):首先:*x。第二:x++。 @Bush 你没有注意他说的话:“你跳过了你的钥匙的第一个字符”——你的代码是错误的。您可以使用 JosephH 的代码,或者等价的 putc((ch ^= *x++), trgFile); if(!*x) x = args[1];。或者你可以这样做 if (!*x) x = argv[1]; putc((ch ^= *x++), trgFile); 请注意,如果 argv[1] 是一个空字符串,所有这些都会中断。 谢谢!我现在就给它打补丁。

以上是关于Vigenere 加密的主要内容,如果未能解决你的问题,请参考以下文章

加密 Vigenere 密码

Vigenere 加密

卡在 Vigenere 中加密程序的最后一部分

我的 vigenere 密码加密功能有啥问题?

使用 vigenere 密码加密时出现奇怪的错误

加密大写字母 python vigenere