生成随机ASCII
我一直想在一个非常简单的加密日常工作,它应该是这样的:
生成随机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;
}
请确保您使用unsigned char
;如果char
已签名,则在处理0x80..0xFF范围内的字符时,将出错。具体来说,您将在“映射表”中访问负面的索引。
当然,严格说来,ASCII是一个7位代码集和0x00..0x7F不是ASCII范围以外的任何字符。
您只分配255个字节,但您继续覆盖超出您分配的一个字节。这是一个基本的缓冲区溢出;你调用未定义的行为(这意味着任何事情都可能发生,包括它似乎在不引起麻烦的情况下正常工作的可能性 - 在某些机器上)。
另一个问题是,你写映射了256个可能的字节代码,这是令人费解的255。其他字节值会发生什么?
当然,因为你写的256字节映射到“加密”文件,这将是孩子们的游戏进行解码;这个方案的安全性可以忽略不计。但是,作为编程练习,它仍然有一些优点。
没有理由啜整个文件,然后按字节写出来的字节。你可以很好地逐字节读取它,并逐字节地写入它。或者,您可以啜泣整个文件,将其原位映射,然后一次写入整个文件。一致性在编程中很重要。
可能要编辑走,如果... –
非常感谢,它现在工作正常。 –
改变了缓冲区大小为256(DA地狱是我在想什么^ _ ^) –
没有检查,没有意见,没有调试打印 - >错误的代码 - >行为可能不可预测 – pmod
哪些文件是腐败? – Chriszuma
@pmod代码很简单,不需要任何评论。 –