| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 493 人关注过本帖, 1 人收藏
标题:文本小加密的這個錯誤幫忙看看
只看楼主 加入收藏
a1946794276
Rank: 1
等 级:新手上路
帖 子:3
专家分:3
注 册:2013-10-11
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:9 
文本小加密的這個錯誤幫忙看看
char udm_string[1024];
FILE *fp1,FILE *fp2
其他部分略去了
***********************
    char lochar[32];
    int i,j,len;
   
        if(f==1) //加密
        {
            printf("請輸入一串字符作為密鑰\n");
            scanf("%s",lochar);
            len=strlen(lochar) ;
            while(!feof(fp1))
            {   
                j=0;
                 fgets (udm_string,1024,fp1);
                 for(i=0;i<strlen(udm_string);i++)
                        if(udm_string[i]!='\n')
                    {    udm_string[i]^=lochar[j]; j++; if(j>len) j=0;}
                    else
                        break ;
                 fputs(udm_string ,fp2);
            }
             fclose(fp1);
             fclose(fp2);
        }
        else if(f==2) //解密
        {
            printf("請輸入密鑰\n");
            scanf("%s",lochar);
            len=strlen(lochar) ;
            while(!feof(fp1))
            {   
                j=0 ;
                fgets (udm_string,1024,fp1);
                for(i=0;i<strlen(udm_string);i++)
                    if(udm_string[i]!='\n')
                    {    udm_string[i]^=lochar[j]; j++; if(j>len) j=0;}
                 fputs(udm_string ,fp2);
             }
             fclose(fp1);
             fclose(fp2);
        }

          printf("Done!\n");

測試的時候 密鑰用的:123456 用來加密一個沒幾個特殊符號文本沒有任何錯誤的還原了
再測試    密鑰也是:123456
---------------------------------------------
あいうえお 123456 , hjdwb hyHDSYEA ,發可以
ASDAFAQWEKJQWEHJABGSKJDHAKLJSDH
绝唱↗逝去
あ 醉意

…昔┃枫影

 雨ㄟ依然ャ
唯爱゛‰
落╰╮ 沫~
╭ァ往、昔..
 红颜灬醉
 花开花落
 何必执著
个性签名 www.
受够了我¢

超完美。伤口
 你能
 尾声°
欠你的幸福
printf("覺得哦看\n");
            scanf("%s",lochar);
            for (i=0;i<sizeof(lochar);i+
--------------------------------------------
這個文本的時候解密出來的就只有
--------------------------------------------
あいうえお 123456 , hjdwb hyHDSYEA ,發可以
ASDAFAQWEKJQWEHJABGSKJDHAKLJSDH
绝唱↗逝去
あ 醉意

…昔┃枫影

 雨ㄟ依然ャ
唯爱゛‰
落╰╮ 沫~
╭ァ往、昔
--------------------------------------------
到底出了什麼問題呢?
搜索更多相关主题的帖子: 加密 
2013-10-11 22:15
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:4 
啥文字都有啊

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-10-12 07:03
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:4 
利用异或运算加密解密,解密不全,可能是原文太长超范围或设置的加密条件语句不全至未完全加密。

www.qunxingw.wang
2013-10-12 10:39
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:0 
1024改大些试试

www.qunxingw.wang
2013-10-12 10:58
heroinearth
Rank: 10Rank: 10Rank: 10
来 自:云南曲靖
等 级:青峰侠
帖 子:430
专家分:1506
注 册:2011-10-24
收藏
得分:4 
以前只做过一个字节一个字节进行加解密,因对异或的理解有限不知道可以同时进行多少个字节异或计算,还有就是一个字节一个字节可以对所有字符进行处理。座等高人
2013-10-12 11:26
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:0 
楼主看似也只对原文进行了单次加密,在对原文开始小于密钥的字符长度之内,加密的字符是变化的,但随后加密字符全是密钥的第1个字符了。

www.qunxingw.wang
2013-10-12 11:48
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:4 
代码垃圾,当然这是题外话
回正题,你能确保异或之后仍然还是文本格式,也就是不存在控制字符(小于0x20的字符)?
如果你不能确保这一点,你也就不能用文本方式来读写加密后的文件。
2013-10-12 11:54
zhaogay
Rank: 7Rank: 7Rank: 7
来 自:宫
等 级:黑侠
帖 子:151
专家分:586
注 册:2013-10-10
收藏
得分:4 
我试过LZ思路,是可以解出来的。不知道为什么LZ的数据会断掉。
程序代码:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
    FILE *fp,*fp1;
    int i = 0, j = 0;
    char m[7]="123456";
    char buf[1024];
    fp = fopen(argv[1], "r+");
    if (fp == NULL) {
        fprintf(stderr, "open err\n");
        return -1;
    }
    fp1 = fopen(argv[2], "w+");
    if (fp1 == NULL) {
        fprintf(stderr, "open err\n");
        return -1;
    }
    while( !feof(fp) ) {
        memset(buf, 0x00, sizeof(buf));
        fgets(buf, 1024, fp);
        i = 0, j = 0;
        while(i++<strlen(buf)){
            if (buf[i-1] != '\n'){
                buf[i-1] ^= m[j];
                if (++j>5)

                    j=0;
            }
            else
                break;
        }
        fputs(buf ,fp1);
    }
    fclose(fp);
    fclose(fp1);
    return 0;
}
根据LZ思路写了个简洁版测试,复制出问题的数据,之后解密是没有问题的。
还有LZ j>len是有问题的,当j=6时,lochar[j]会出界的。 (补充,也不能算出界,应该为'\0',但是,测试了下,最后一行有时候会断掉,有时候正常,还不知道为什么,坐等解释)



[ 本帖最后由 zhaogay 于 2013-10-12 16:01 编辑 ]

好好学习,天天想上
2013-10-12 13:39
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
收藏
得分:4 
加密解密你也敢用fgets、fputs?
2013-10-12 14:05
a1946794276
Rank: 1
等 级:新手上路
帖 子:3
专家分:3
注 册:2013-10-11
收藏
得分:0 
回复 8楼 zhaogay
哦哦,謝謝提醒,原來這個地方疏漏了
2013-10-12 19:18
快速回复:文本小加密的這個錯誤幫忙看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017792 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved