QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 763|回复: 5

问一个语句。

[复制链接]
发表于 2005-1-27 12:35:37 | 显示全部楼层 |阅读模式
[code:1]
#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"

void PressExit(){cout<<"Press any key to exit.";getch();}

char XORCHRW(char c,char *key)
{
         char ret=c;
         int i;
         for(i=0;i<strlen(key);i++)
                (ret=c)^=*(key+i);
         return ret;
}

char XORCHRL(char c,char key[])
{
        int i;
        int ret=c;
        for(i=0;i<strlen(key);i++) ret^=key[i];
        return ret;
}


int main()
{
        char fn[255];
        FILE *ifp, *ofp;
        cout<<"Please input source file name which is TO BE ENCRYPTED:"<<endl;
        cin>>fn;
        if((ifp=fopen(fn,"rb"))==NULL)
        {
                //An error occured while opening file, exit.
                cerr<<"Cannot open file!"<<endl;
                PressExit();
                return 0;
        }
        else
        {
                //Input file names and key.
                cout<<"Please input destination file name:"<<endl;
                cin>>fn;
                char key[256];
                cout<<"Please input key: ";
                cin>>key;
                ofp=fopen(fn,"wb");
                char buf=fgetc(ifp);
                while(buf!=EOF)
                {
                        fputc(XORCHRW(buf,key),ofp);
                        buf=fgetc(ifp);
                }
                fclose(ofp);
                fclose(ifp);
                return 1;
        }
}
[/code:1]

(ret=c)^=*(key+i);
哪位帮我解释一下这句?
这个程序是用来用异或加密文件的。
自已做出来了,但是好像和原来想的不一样。
应该就是这句出的问题。
发表于 2005-1-27 20:01:38 | 显示全部楼层
(ret=c)^=*(key+i);
|
v
(ret=c)^=key
|
v
ret=c;
ret^=key
|
v
ret=c;
ret=ret^key
回复

使用道具 举报

 楼主| 发表于 2005-1-29 20:21:27 | 显示全部楼层
主要是这样的问题,原来的设想是用户输入一串key。
然后用明文中的每个字符与key中的每个字符进行xor运算。
这样一来,假如输入的是对称密码的话,那密文应该是和明文一样的了。
但是这个程序没有这个问题,所以不是很明白。
是不是运行级别的问题,还是其他什么的。
我的理解和mozilla是一样的,不知道其他人有没有什么看法。
假如将那一句替换成下面的语句,那又不一样了,这时对称密码的问题就出来了。
char ret = c;
ret ^= *(key + i);
顺便说一句,这个是用TC3编译的结果,看看用GCC会不会这样。
回复

使用道具 举报

发表于 2005-1-29 23:21:56 | 显示全部楼层
如果简单地换成你的语句,就有变量作用域的问题了。出了for,ret还是那个=c的ret。for里面的那个ret非你要返回的ret。
回复

使用道具 举报

 楼主| 发表于 2005-1-30 14:02:21 | 显示全部楼层
作用域没什么问题的。
实际上定义我放在前面,for的外面。
有没有人用GCC编译过啊。
回复

使用道具 举报

发表于 2005-1-30 18:27:03 | 显示全部楼层
[quote:742898fef4="BestMarine"]作用域没什么问题的。
实际上定义我放在前面,for的外面。
有没有人用GCC编译过啊。[/quote]贴出源程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 16:35 , Processed in 0.043502 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表