首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于对文件BASE64加密解密

2012-10-15 
求助:关于对文件BASE64加密解密在下用ATL的Base64Encode及Base64Decode对文件进行加密解密操作时,遇到一点

求助:关于对文件BASE64加密解密
在下用ATL的Base64Encode及Base64Decode对文件进行加密解密操作时,遇到一点问题。先贴源码,编译环境VS2008

C/C++ code
#include "stdafx.h"#include "atlenc.h"int _tmain(int argc, _TCHAR* argv[]){        errno_t err;    FILE *fr;    if (err =(fopen_s(&fr, "a.txt", "rb")) != 0)    {        printf( "The file 'a.txt' was not opened\n" );        return 0;    }    FILE *fw;    if (err = (fopen_s(&fw, "b.txt", "w+")) != 0)    {        printf( "The file 'b.txt' was not opened\n" );        return 0;    }    FILE *fd;    if (err = (fopen_s(&fd, "c.txt", "w+")) != 0)    {        printf( "The file 'c.txt' was not opened\n" );        return 0;    }    char srcbuf[50] = {0};        char dstbuf[50*2 + 1] = {0};    char orgbuf[50] = {0};    int nLen = 0;    long nTotal1 = 0;    long nTotal2 = 0;         //文件加密处理,这里没问题    while(!feof(fr))    {        nLen = fread(srcbuf, sizeof(char), sizeof(srcbuf), fr);        int i = Base64EncodeGetRequiredLength(nLen);        Base64Encode((BYTE*)srcbuf, nLen, dstbuf, &i, NULL);        fwrite(dstbuf, sizeof(char), i, fw);        nTotal1 += i;            }    printf("total file encode: %d\n", nTotal1);    fclose(fr);    fclose(fw);    memset(srcbuf, 0, sizeof(srcbuf));    memset(dstbuf, 0, sizeof(dstbuf));    memset(orgbuf, 0, sizeof(orgbuf));    fopen_s(&fw, "b.txt", "rb");         //文件解密处理,解密出来的文件跟原始文件有差距,文件越大,差距越明显    while(!feof(fw))    {        nLen = fread(srcbuf, sizeof(char), sizeof(srcbuf), fw);        printf("file read: %d\n", nLen);        int i = Base64DecodeGetRequiredLength(nLen);        printf("i encode: %d\n", i);        Base64Decode(srcbuf, nLen, (BYTE*)orgbuf, &i);        int m = fwrite(orgbuf, sizeof(char), i, fd);        nTotal2 += m;     }    printf("total file decode: %d\n", nTotal2);        fclose(fw);    fclose(fd);    return 0;}


对文件加密后,再进行解密操作时出现了问题,解密后文件跟原始文件大小和内容均有差距,用UltraEdit打开也能发现不同,文件越大,差距越明显,请问这是为什么?

[解决办法]
C/C++ code
#include "atlenc.h"errno_t fileBase64Encode(const char *srcFile, const char *dstFile){  FILE *fr = NULL, *fw = NULL;  errno_t err = 0;    if(err == 0)  {    err= fopen_s(&fr, srcFile, "rb");    if(err != 0)    {      printf( "The file '%s' can't be open\n", srcFile );    }  }    if (err == 0)  {    err = fopen_s(&fw, dstFile, "wb");    if(err != 0)    {      printf( "The file '%s' can't be open\n", dstFile );    }  }  if(err == 0)  {    const int tLen = ATLSMTP_MAX_BASE64_LINE_LENGTH; // = 57    BYTE srcBuf[tLen + 1];    char dstBuf[tLen * 4 /3 + 5]; //+\r\n\r\n\0 //    size_t nTotal = 0;    while(!feof(fr))    {      int nLen = fread(srcBuf, 1, tLen, fr);      int i = Base64EncodeGetRequiredLength(nLen);      Base64Encode(srcBuf, nLen, dstBuf, &i);      nTotal += fwrite(dstBuf, 1, i, fw);           }  }  if(fr)    fclose(fr);  if(fw)    fclose(fw);  return err;}errno_t fileBase64Decode(const char *srcFile, const char *dstFile){  FILE *fr = NULL, *fw = NULL;  errno_t err = 0;    if(err == 0)  {    err= fopen_s(&fr, srcFile, "rb");    if(err != 0)    {      printf( "The file '%s' can't be open\n", srcFile );    }  }    if (err == 0)  {    err = fopen_s(&fw, dstFile, "wb");    if(err != 0)    {      printf( "The file '%s' can't be open\n", dstFile );    }  }  if(err == 0)  {    const int tLen = ATLSMTP_MAX_QP_LINE_LENGTH + 2; //76+2    char srcBuf[tLen+1];    BYTE dstBuf[tLen*3/4+1];    size_t nTotal = 0;    while(!feof(fr))    {      int nLen = fread(srcBuf, 1, tLen, fr);      int i = Base64DecodeGetRequiredLength(nLen);      Base64Decode(srcBuf, nLen, dstBuf, &i);      nTotal += fwrite(dstBuf, 1, i, fw);     }  }  if(fr)    fclose(fr);  if(fw)    fclose(fw);  return err;} 


[解决办法]

探讨
"w+" 改成 "w" 试试,
不要追加

热点排行