求助:关于对文件BASE64加密解密
在下用ATL的Base64Encode及Base64Decode对文件进行加密解密操作时,遇到一点问题。先贴源码,编译环境VS2008
#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;}
#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;}
[解决办法]