2011-09-06 187 views
-1

我一直想在一个非常简单的加密日常工作,它应该是这样的:

生成随机ASCII

- 生成ASCII字符的随机密钥(ASCII表只是置换)
- 对于要加密的文件中的每个字符,获取其十进制表示(X),然后将其替换为索引X处的字符。

问题是它损坏了一些文件,我不知道为什么。
任何帮助,将不胜感激。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 
int main() 
{ 
    int temp,used[256]; 
    char *key,*mFile; 
    long i,fSize; 

    memset(used,0,sizeof(used)); 

    srand(time(NULL)); 

    FILE *pInput = fopen("Input.in","rb"); 
    FILE *pOutput = fopen("Encrypted.out","wb"); 
    FILE *pKeyOutput = fopen("Key.bin","wb"); 

    if(pInput==NULL||pOutput==NULL||pKeyOutput==NULL) 
    { 
     printf("File I/O Error\n"); 
     return 1; 
    } 
    key = (char*)malloc(255); 
    for(i=0;i<256;i++) 
    { 
     temp = rand()%256; 
     while(used[temp]) 
      temp = rand()%256; 
     key[i] = temp; 
     used[temp] = 1; 
    } 
    fwrite(key,1,255,pKeyOutput); 

    fseek(pInput,0,SEEK_END); 
    fSize = ftell(pInput); 
    rewind(pInput); 

    mFile = (char*)malloc(fSize); 
    fread(mFile,1,fSize,pInput); 

    for(i=0;i<fSize;i++) 
    { 
     temp = mFile[i]; 
     fputc(key[temp],pOutput); 
    } 

    fclose(pInput); 
    fclose(pOutput); 
    fclose(pKeyOutput); 
    free(mFile); 
    free(key); 
    return 0; 
} 



解密例程:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    int temp,j; 
    char *key,*mFile; 
    long i,fSize; 

    FILE *pKeyInput = fopen("key.bin","rb"); 
    FILE *pInput = fopen("Encrypted.out","rb"); 
    FILE *pOutput = fopen("Decrypted.out","wb"); 

    if(pInput==NULL||pOutput==NULL||pKeyInput==NULL) 
    { 
     printf("File I/O Error\n"); 
     return 1; 
    } 

    key = (char*)malloc(255); 
    fread(key,1,255,pKeyInput); 

    fseek(pInput,0,SEEK_END); 
    fSize = ftell(pInput); 
    rewind(pInput); 
    mFile = (char*)malloc(fSize); 
    fread(mFile,1,fSize,pInput); 

    for(i=0;i<fSize;i++) 
    { 
     temp = mFile[i]; 
     for(j=0;j<256;j++) 
     { 
      if(key[j]==temp) 
       fputc(j,pOutput); 
     } 
    } 

    fclose(pInput); 
    fclose(pOutput); 
    fclose(pKeyInput); 
    free(mFile); 
    free(key); 
    return 0; 
} 
+2

没有检查,没有意见,没有调试打印 - >错误的代码 - >行为可能不可预测 – pmod

+0

哪些文件是腐败? – Chriszuma

+0

@pmod代码很简单,不需要任何评论。 –

回答

2

请确保您使用unsigned char;如果char已签名,则在处理0x80..0xFF范围内的字符时,将出错。具体来说,您将在“映射表”中访问负面的索引。

当然,严格说来,ASCII是一个7位代码集和0x00..0x7F不是ASCII范围以外的任何字符。


您只分配255个字节,但您继续覆盖超出您分配的一个字节。这是一个基本的缓冲区溢出;你调用未定义的行为(这意味着任何事情都可能发生,包括它似乎在不引起麻烦的情况下正常工作的可能性 - 在某些机器上)。

另一个问题是,你写映射了256个可能的字节代码,这是令人费解的255。其他字节值会发生什么?

当然,因为你写的256字节映射到“加密”文件,这将是孩子们的游戏进行解码;这个方案的安全性可以忽略不计。但是,作为编程练习,它仍然有一些优点。

没有理由啜整个文件,然后按字节写出来的字节。你可以很好地逐字节读取它,并逐字节地写入它。或者,您可以啜泣整个文件,将其原位映射,然后一次写入整个文件。一致性在编程中很重要。

+0

可能要编辑走,如果... –

+0

非常感谢,它现在工作正常。 –

+0

改变了缓冲区大小为256(DA地狱是我在想什么^ _ ^) –