如何使用OPENSSL中的AES算法加密文件。 本帖最后由 lcy_888 于 2010-03-31 12:39:06 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 aes源代码也有的是吧,俺在csdn下载频道下载过。 openssl的版权好像是GPL的,建议使用这个无版权的:http://www.gladman.me.uk。winzip和PilotEdit都用它。 一样的,我开始的时候用的是openssl,后来因为版权问题,改用http://www.gladman.me.uk。开始时,担心不兼容,后来经过测试后,发现两个算法的加密结果是一样的。 可惜我的基础不好,代码下到了,但不明白aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1])中第三个参数的意义,楼上的能不能给个示例,谢谢了。 先大概讲讲:AES加密是按照块来进行的。比如,大概多少字节为一块,记不太清楚了。最初的加密算法是各个块之间没有任何联系,这样相同的块加密后的密文肯定是相同的。这样不是很强壮。改进后的算法,加上了一个参数,这个参数从前面一个块生成,然后传到后面一个块中,这样相同的块,加密后生成的密文是不同的(取决于它的上下文)。这里的aes_encrypt_ctx cx就是这个参数,你把前一个块生成的值传到后一个块中就可以了。 BCB模式和另外一种模式,名字忘了 就是不知道如何用啊,还有,就是LIB在哪得到啊,是不是还需要用源代码编译,我下了源代码,但没编译成功。请赐教。 你用的是那个版本的Vistual Studio?有一个yasm.rule文件需要拷贝到Visual Studio的某个路径下网站上有说明 有那么复杂?http://search.download.csdn.net/search/aes到处的代码。 无法解析的外部符号,我想应该是没有引入LIB所致 是这样的,你从网站上下载了Visual studio (比如2008)的工程后,要首先编译这个工程,生成lib文件。然后把头文件和lib文件加入你自己的工程。 你用的是Visual Studio 2008吗,这里http://gladman.plushost.co.uk/oldsite/AES/aes-vs2008-07-10-08.zip Visual Studio 2005这里:http://gladman.plushost.co.uk/oldsite/AES/aes-vs2005-16-04-07.zip 在编译DLL中找不到aes_dll_main.c 我上次是编译成LIB,是成功的另外,你用的是哪个版本的Visual Studio? LIB我也编译成功了,请问客户端程序在运行时需要用到DLL吗,还有,就是不知道如何用它实现加密解密啊,主要是一些参数的设置。 如果是LIB,就不需要DLL,我把我的代码给你看看吧头文件:#if !defined(AFX_CAESENCRYPT_H_8ED34430_0FC9_466C_82FC_452D4F52F992__INCLUDED_)#define AFX_CAESENCRYPT_H_8ED34430_0FC9_466C_82FC_452D4F52F992__INCLUDED_#include "AES\aes.h"#pragma once//1024 * 128#define ENC_DEC_BUF_SIZE 131072class CAESEncrypt{public: CAESEncrypt(void);public: virtual ~CAESEncrypt(void); public: static char szPEEncryptionPrefix[100];static void GetErrorMessage(CString & p_sResultDesc);static void ShowErrorMessage();static BOOL PEEncryptFile(CString p_sFileName, CString p_sMsgFileName, CString p_sPassword, CString & p_sResultDesc, BOOL p_bSaveBackup = FALSE, BOOL p_ShowMsg = TRUE);static BOOL PEDecryptFile(CString p_sFileName, CString p_sMsgFileName, CString p_sPassword, CString & p_sResultDesc, BOOL p_bSaveBackup = FALSE, BOOL p_ShowMsg = TRUE);};#endif // !defined(AFX_CAESENCRYPT_H_8ED34430_0FC9_466C_82FC_452D4F52F992__INCLUDED_) cpp文件: #include "StdAfx.h"#include "AESEncrypt.h"#include "GlobalComponent.h"#include "MainFrm.h"CAESEncrypt::CAESEncrypt(void){}CAESEncrypt::~CAESEncrypt(void){}char CAESEncrypt::szPEEncryptionPrefix[100] = "ENCRYPTED BY PilotEdit 1.5.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";void CAESEncrypt::GetErrorMessage(CString & p_sResultDesc){ int nErrorCode = GetLastError(); LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, nErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); // Display the string. p_sResultDesc = (LPCTSTR)lpMsgBuf; // Free the buffer. LocalFree(lpMsgBuf);}void CAESEncrypt::ShowErrorMessage(){ int nErrorCode = GetLastError(); LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, nErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); // Display the string. AfxMessageBox((LPCTSTR)lpMsgBuf, MB_ICONERROR | MB_OK); // Free the buffer. LocalFree(lpMsgBuf);}BOOL CAESEncrypt::PEEncryptFile(CString p_sFileName, CString p_sMsgFileName, CString p_sPassword, CString & p_sResultDesc, BOOL p_bSaveBackup, BOOL p_ShowMsg){ //set p_bSaveBackup to false p_bSaveBackup = FALSE; // int i, j, u, v, offset; int offset; unsigned char key[CL_MAX_PATH_LEN];// unsigned char buf[16];// unsigned char prv[16]; unsigned char iv[ENC_DEC_BUF_SIZE]; unsigned char szOutputBuff[ENC_DEC_BUF_SIZE]; aes_encrypt_ctx ctx; memset( key, 0, CL_MAX_PATH_LEN ); memset( iv , 0, ENC_DEC_BUF_SIZE ); offset = 0;// memset( prv, 0, 16 );// memset( buf, 0, 16 ); TCHAR wszKey[CL_MAX_PATH_LEN]; _snwprintf_s6(wszKey, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s"), p_sPassword); int nKeyLen = WideCharToMultiByte(CP_ACP, 0, p_sPassword, (int)wcslen(wszKey), (LPSTR)key, CL_MAX_PATH_LEN, NULL, NULL); key[nKeyLen] = 0x00; //Set key, the key length must be 128, 196, 256 aes_encrypt_key(key, 256, &ctx); //Begin Encryption/Decryption CWaitCursor wait; //Open source file and target file HANDLE hFile1 = CreateFile(p_sFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)0); if(hFile1 == NULL) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } return FALSE; } CL_INT64 m_nFile1Size = 0; ASSERT(sizeof(DWORD) == 4); DWORD *pFile1SizeLower = ((DWORD *)&m_nFile1Size); DWORD *pFile1SizeHeigher = (DWORD *)&m_nFile1Size + 1; *pFile1SizeLower = GetFileSize(hFile1, pFile1SizeHeigher);// if(m_nFile1Size == 0)// {// if(p_ShowMsg)// {// _snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("File \"%s\" is not encrypted by PilotEdit! Decryption cancelled!")), p_sMsgFileName);// AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK);// } //CloseHandle(hFile1Mapping);// CloseHandle(hFile1);// return TRUE;// } HANDLE hFile1Mapping = CreateFileMapping(hFile1, NULL, PAGE_READONLY, 0, 0, NULL); if(m_nFile1Size > 0 && hFile1Mapping == NULL) { _snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("PilotEdit can't open file \"%s\"! Encryption cancelled!")), p_sMsgFileName); p_sResultDesc = CGlobalComponent::m_wszTempBuffer; if(p_ShowMsg) { AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK); } CloseHandle(hFile1); return FALSE; } BOOL bBreak = FALSE; BOOL bReturn = TRUE; CL_INT64 nFileOffset = 0; DWORD *pFileOffsetLower = ((DWORD *)&nFileOffset); DWORD *pFileOffsetHeigher = (DWORD *)&nFileOffset + 1; //Get File Size if(m_nFile1Size > 64) { nFileOffset = (m_nFile1Size - 64) / ENC_DEC_BUF_SIZE * ENC_DEC_BUF_SIZE; void * pFile1Mapping = MapViewOfFile(hFile1Mapping, FILE_MAP_READ, *pFileOffsetHeigher, *pFileOffsetLower, (unsigned int)(m_nFile1Size - nFileOffset)); if(pFile1Mapping == NULL) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } CloseHandle(hFile1Mapping); CloseHandle(hFile1); return FALSE; } unsigned char * pTagStart = (unsigned char *)pFile1Mapping + (m_nFile1Size - nFileOffset - 64); if(!memcmp(pTagStart, szPEEncryptionPrefix, 48)) { _snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("File \"%s\" has already been encrypted by PilotEdit! Encryption cancelled!")), p_sMsgFileName); p_sResultDesc = CGlobalComponent::m_wszTempBuffer; if(p_ShowMsg) { AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK); } CloseHandle(hFile1Mapping); CloseHandle(hFile1); UnmapViewOfFile(pFile1Mapping); return TRUE; } UnmapViewOfFile(pFile1Mapping); nFileOffset = 0; } //Open output file TCHAR wszFileNameTemp[CL_MAX_PATH_LEN]; _snwprintf_s6(wszFileNameTemp, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s$PE$ENC"), p_sFileName); CFileException eFile; CFile fileDest; if(!fileDest.Open(wszFileNameTemp, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive, &eFile)) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } CloseHandle(hFile1Mapping); CloseHandle(hFile1); return FALSE; } fileDest.SetLength(0); if(CMainFrame::m_pdlgFTPTransferStatus != NULL) { CMainFrame::m_pdlgFTPTransferStatus->SetProgressPosition(0); } while((!bBreak) && nFileOffset < m_nFile1Size) { CL_INT64 nMapSize = ENC_DEC_BUF_SIZE; if(m_nFile1Size - nFileOffset < ENC_DEC_BUF_SIZE) { nMapSize = m_nFile1Size - nFileOffset; } void * pFile1Mapping = MapViewOfFile(hFile1Mapping, FILE_MAP_READ, *pFileOffsetHeigher, *pFileOffsetLower, (unsigned int)nMapSize); if(pFile1Mapping == NULL) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } bBreak = TRUE; bReturn = FALSE; } else { //begin encryption memcpy(szOutputBuff, pFile1Mapping, (size_t)nMapSize); if(nMapSize < ENC_DEC_BUF_SIZE) { memset(szOutputBuff + nMapSize, 0x00, (size_t)(ENC_DEC_BUF_SIZE - nMapSize)); nMapSize = (nMapSize + 15) / 16 * 16; } //aes_crypt_cfb( &ctx, AES_ENCRYPT, (int)nMapSize, &offset, iv, (unsigned char *)pFile1Mapping, szOutputBuff ); //0924 aes_crypt_cbc( &ctx, AES_ENCRYPT, (int)nMapSize, iv, szOutputBuff, szOutputBuff ); aes_cbc_encrypt(szOutputBuff, szOutputBuff, (int)nMapSize, iv, &ctx); fileDest.Write(szOutputBuff, (unsigned int)nMapSize); } UnmapViewOfFile(pFile1Mapping); nFileOffset += ENC_DEC_BUF_SIZE; if(bBreak) { break;; } //CL_INT64 nProgressStatus = (nFileOffset * 100) / m_nFile1Size; CL_INT64 nProgressStatus = 100; if(m_nFile1Size != 0) { nProgressStatus = (nFileOffset * 100) / m_nFile1Size; } if(CMainFrame::m_pdlgFTPTransferStatus != NULL) { CMainFrame::m_pdlgFTPTransferStatus->SetProgressPosition((int)nProgressStatus); } if(CMainFrame::IsThreadToBeStopped()) { p_sResultDesc = CGlobalComponent::GetLocalDesc(_T("Cancelled!")); bReturn = FALSE; break; } } CloseHandle(hFile1Mapping); CloseHandle(hFile1); //Write Tail into encrytepd file TCHAR wszFileSize[100]; char szFileSize[100]; _snwprintf_s(wszFileSize, 100, 100, _T("%015I64d"), m_nFile1Size); int nSizeLen = WideCharToMultiByte(CP_ACP, 0, wszFileSize, (int)wcslen(wszFileSize), (LPSTR)szFileSize, 100, NULL, NULL); szFileSize[nSizeLen] = 0x00; szFileSize[nSizeLen + 1] = 0x00; fileDest.Write(szPEEncryptionPrefix, 48); fileDest.Write(szFileSize, 16); fileDest.Close(); if(bReturn) { if(p_bSaveBackup) { TCHAR wszFileNameBak[CL_MAX_PATH_LEN]; _snwprintf_s6(wszFileNameBak, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s.PE.BAK"), p_sFileName); DeleteFile(wszFileNameBak); if(!CopyFile(p_sFileName, wszFileNameBak, FALSE)) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } bReturn = FALSE; } } if(!DeleteFile(p_sFileName)) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } bReturn = FALSE; } } if(bReturn) { if(!MoveFile(wszFileNameTemp, p_sFileName)) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } bReturn = FALSE; } } else { DeleteFile(wszFileNameTemp); } return bReturn; } cpp文件: BOOL CAESEncrypt::PEDecryptFile(CString p_sFileName, CString p_sMsgFileName, CString p_sPassword, CString & p_sResultDesc, BOOL p_bSaveBackup, BOOL p_ShowMsg){ //set p_bSaveBackup to false p_bSaveBackup = FALSE; // int i, j, u, v, offset; int offset; unsigned char key[CL_MAX_PATH_LEN];// unsigned char buf[16];// unsigned char prv[16]; unsigned char iv[ENC_DEC_BUF_SIZE]; unsigned char szOutputBuff[ENC_DEC_BUF_SIZE]; aes_decrypt_ctx ctx; memset( key, 0, CL_MAX_PATH_LEN ); memset( iv , 0, ENC_DEC_BUF_SIZE ); offset = 0;// memset( prv, 0, 16 );// memset( buf, 0, 16 ); TCHAR wszKey[CL_MAX_PATH_LEN]; _snwprintf_s6(wszKey, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s"), p_sPassword); int nKeyLen = WideCharToMultiByte(CP_ACP, 0, p_sPassword, (int)wcslen(wszKey), (LPSTR)key, CL_MAX_PATH_LEN, NULL, NULL); key[nKeyLen] = 0x00; //Set key, the key length must be 128, 196, 256 aes_decrypt_key(key, 256, &ctx); //aes_setkey_dec( &ctx, key, 256 ); //Begin Encryption/Decryption CWaitCursor wait; //Open source file and target file HANDLE hFile1 = CreateFile(p_sFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)0); if(hFile1 == NULL) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } return FALSE; } CL_INT64 m_nFile1Size = 0; ASSERT(sizeof(DWORD) == 4); DWORD *pFile1SizeLower = ((DWORD *)&m_nFile1Size); DWORD *pFile1SizeHeigher = (DWORD *)&m_nFile1Size + 1; *pFile1SizeLower = GetFileSize(hFile1, pFile1SizeHeigher); if(m_nFile1Size == 0) { _snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("File \"%s\" is not encrypted by PilotEdit! Decryption cancelled!")), p_sMsgFileName); p_sResultDesc = CGlobalComponent::m_wszTempBuffer; if(p_ShowMsg) { AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK); } //CloseHandle(hFile1Mapping); CloseHandle(hFile1); return TRUE; } HANDLE hFile1Mapping = CreateFileMapping(hFile1, NULL, PAGE_READONLY, 0, 0, NULL); //AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); if(hFile1Mapping == NULL) { _snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("PilotEdit can't open file \"%s\"! Decryption cancelled!")), p_sMsgFileName); p_sResultDesc = CGlobalComponent::m_wszTempBuffer; if(p_ShowMsg) { AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK); } CloseHandle(hFile1); return FALSE; } BOOL bBreak = FALSE; BOOL bReturn = TRUE; CL_INT64 nFileOffset = 0; DWORD *pFileOffsetLower = ((DWORD *)&nFileOffset); DWORD *pFileOffsetHeigher = (DWORD *)&nFileOffset + 1; //Get File Size if(m_nFile1Size < 64) { _snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("File \"%s\" is not encrypted by PilotEdit! Decryption cancelled!")), p_sMsgFileName); p_sResultDesc = CGlobalComponent::m_wszTempBuffer; if(p_ShowMsg) { AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK); } CloseHandle(hFile1Mapping); CloseHandle(hFile1); return TRUE; } nFileOffset = (m_nFile1Size - 64) / ENC_DEC_BUF_SIZE * ENC_DEC_BUF_SIZE; void * pFile1Mapping = MapViewOfFile(hFile1Mapping, FILE_MAP_READ, *pFileOffsetHeigher, *pFileOffsetLower, (unsigned int)(m_nFile1Size - nFileOffset)); if(pFile1Mapping == NULL) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } CloseHandle(hFile1Mapping); CloseHandle(hFile1); return FALSE; } unsigned char * pTagStart = (unsigned char *)pFile1Mapping + (m_nFile1Size - nFileOffset - 64); if(memcmp(pTagStart, szPEEncryptionPrefix, 48)) { _snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("File \"%s\" is not encrypted by PilotEdit! Decryption cancelled!")), p_sMsgFileName); p_sResultDesc = CGlobalComponent::m_wszTempBuffer; if(p_ShowMsg) { AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK); } CloseHandle(hFile1Mapping); CloseHandle(hFile1); UnmapViewOfFile(pFile1Mapping); return TRUE; } CL_INT64 nDecryptedFileSize = _atoi64((char *)pTagStart + 48); UnmapViewOfFile(pFile1Mapping); nFileOffset = 0; m_nFile1Size -= 64; //Open output file TCHAR wszFileNameTemp[CL_MAX_PATH_LEN]; _snwprintf_s6(wszFileNameTemp, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s$PE$DEC"), p_sFileName); CFileException eFile; CFile fileDest; if(!fileDest.Open(wszFileNameTemp, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive, &eFile)) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } CloseHandle(hFile1Mapping); CloseHandle(hFile1); return FALSE; } fileDest.SetLength(0); if(CMainFrame::m_pdlgFTPTransferStatus != NULL) { CMainFrame::m_pdlgFTPTransferStatus->SetProgressPosition(0); } while((!bBreak) && nFileOffset < m_nFile1Size) { CL_INT64 nMapSize = ENC_DEC_BUF_SIZE; if(m_nFile1Size - nFileOffset < ENC_DEC_BUF_SIZE) { nMapSize = m_nFile1Size - nFileOffset; } void * pFile1Mapping = MapViewOfFile(hFile1Mapping, FILE_MAP_READ, *pFileOffsetHeigher, *pFileOffsetLower, (unsigned int)nMapSize); if(pFile1Mapping == NULL) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } bBreak = TRUE; bReturn = FALSE; } else { //begin decryption //aes_crypt_cfb( &ctx, AES_DECRYPT, (int)nMapSize, &offset, iv, (unsigned char *)pFile1Mapping, szOutputBuff ); //0924 aes_crypt_cbc( &ctx, AES_DECRYPT, (int)nMapSize, iv, (unsigned char *)pFile1Mapping, szOutputBuff ); aes_cbc_decrypt((unsigned char *)pFile1Mapping, szOutputBuff, (int)nMapSize, iv, &ctx); if(nFileOffset + nMapSize > nDecryptedFileSize) { nMapSize = nDecryptedFileSize - nFileOffset; if(nMapSize < 0) { nMapSize = 0; } } fileDest.Write(szOutputBuff, (unsigned int)nMapSize); } UnmapViewOfFile(pFile1Mapping); nFileOffset += ENC_DEC_BUF_SIZE; if(bBreak) { break;; } //CL_INT64 nProgressStatus = (nFileOffset * 100) / m_nFile1Size; CL_INT64 nProgressStatus = 100; if(m_nFile1Size != 0) { nProgressStatus = (nFileOffset * 100) / m_nFile1Size; } if(CMainFrame::m_pdlgFTPTransferStatus != NULL) { CMainFrame::m_pdlgFTPTransferStatus->SetProgressPosition((int)nProgressStatus); } if(CMainFrame::IsThreadToBeStopped()) { p_sResultDesc = CGlobalComponent::GetLocalDesc(_T("Cancelled!")); bReturn = FALSE; break; } } CloseHandle(hFile1Mapping); CloseHandle(hFile1); fileDest.Close(); if(bReturn) { if(p_bSaveBackup) { TCHAR wszFileNameBak[CL_MAX_PATH_LEN]; _snwprintf_s6(wszFileNameBak, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s.PE.BAK"), p_sFileName); DeleteFile(wszFileNameBak); if(!CopyFile(p_sFileName, wszFileNameBak, FALSE)) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } bReturn = FALSE; } } if(!DeleteFile(p_sFileName)) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } bReturn = FALSE; } } if(bReturn) { if(!MoveFile(wszFileNameTemp, p_sFileName)) { GetErrorMessage(p_sResultDesc); if(p_ShowMsg) { AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK); } bReturn = FALSE; } } else { DeleteFile(wszFileNameTemp); } return bReturn; } 谢谢,我几天没来了,我编译了下代码,有以下问题没解决,谢谢。1、GlobalComponent.h文件是您工程中的文件或是别的定义文件?2、宏CL_MAX_PATH_LEN是自定义的还是系统预定义的?如果是自定义的,其值是多少因为我在有的文章中看到AES加密的长度分为几种,况且有的长度不适应有些加密模式。 还有:“_snwprintf_s6”: 找不到标识符“wcslen”: 不能将参数 1 从“TCHAR [1]”转换为“const wchar_t *” 因为上次不能连续回三个贴,所以没贴GlobalComponent.h,现在贴上(只贴了对你有用的部分) :// GlobalComponent.h: interface for the CGlobalComponent class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_GLOBALCOMPONENT_H__64C1630B_E16F_4838_B081_29AC3C6BDD7A__INCLUDED_)#define AFX_GLOBALCOMPONENT_H__64C1630B_E16F_4838_B081_29AC3C6BDD7A__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include "stdafx.h"#include <afxtempl.h>#include "CryptoLib\rsa.h"#include "CryptoLib\osrng.h" // PRNG#include "CryptoLib\hex.h" // Hex Encoder/Decoder#include "CryptoLib\files.h" // File Source and Sink#define CLFR_MATCHCASE 0x01#define CLFR_WHOLEWORD 0x02#define CLFR_ALLFILES 0x04#define CLFR_REGULAREXP 0x08#define CLFR_HEXMODE 0x10#define CLFR_FROMTOP 0x20#define CLFR_PROMPT 0x40#define CLFR_NEWBUFFSTEP 0x80#define CLFR_UPDATEVIEW 0x100#define CLFR_REPLACEALL 0x200#define CLFR_OUTPUTWINDOW2 0x400#define CLFR_PROC_SCRIPT 0x800#define CLFR_FROM_TOP_WHEN_NONE 0x1000//#define CLFR_KEEP_CURSOR_POS_WHEN_NONE 0x2000//在查找UTF16和UTF16BE时,有可能混淆"4E 00" 和"00 4E 00 **",所以需要对齐WORD#define CLFR_UTF16_WORD_ALIGN 0x2000#define CL_MAX_PATH_LEN 1050#define FTP_HUGE_SIZE_BOUNDARY 4000000000#define LENGTH_MAX_TEXT 2000#define LENGTH_MAX_BUFF 10000#define CLFR_MAX_TEXT 2000#define CLFR_MAX_BUFF 10000#define CL_MAX_TAG_LEN 50#define CL_MAX_TAG_LEN_500 500#define MAX_TCHAR_TO_CHAR_NUM 8#define CL_64#ifdef CL_64 #define CL_INT64 __int64 #define CL_INT64_MAX 0X7FFFFFFFFFFFFFFF//#define CL_INT64 char//#define CL_INT64_MAX 0X7F#else #define CL_INT64 int #define CL_INT64_MAX 0X7FFFFFFF#endif#define CL_INT_32_BASE 0X100000000//#define CL_INT64 char//#define CL_INT64_MAX 0X7F#include <stdio.h>//#ifdef VC6// int strcat_s(char *strDestination, size_t sizeInBytes, const char *strSource);// int wcscat_s(wchar_t *strDestination, size_t sizeInWords, const wchar_t *strSource);// #define _snwprintf_s(a, b, c, d, e) _snwprintf(a, b, d, e)// #define _snwprintf_s6(a, b, c, d, e, f) _snwprintf(a, b, d, e, f)// #define _snwprintf_s7(a, b, c, d, e, f, g) _snwprintf(a, b, d, e, f, g)// #define _snwprintf_s8(a, b, c, d, e, f, g, h) _snwprintf(a, b, d, e, f, g, h)// #define _snwprintf_s9(a, b, c, d, e, f, g, h, i) _snwprintf(a, b, d, e, f, g, h, i)//#else #define _snwprintf_s6 _snwprintf_s #define _snwprintf_s7 _snwprintf_s #define _snwprintf_s8 _snwprintf_s #define _snwprintf_s9 _snwprintf_s//#endif 谢谢,我几天没来了,我编译了下代码,有以下问题没解决,谢谢。1、GlobalComponent.h文件是您工程中的文件或是别的定义文件?[回答]自定义的2、宏CL_MAX_PATH_LEN是自定义的还是系统预定义的?如果是自定义的,其值是多少因为我在有的文章中看到AES加密的长度分为几种,况且有的长度不适应有些加密模式。[回答]CL_MAX_PATH_LEN是自定义的,是路径的最大长度,和AES加密的长度无关. 还有:“_snwprintf_s6”: 找不到标识符[回答]就是_snwprintf_s“wcslen”: 不能将参数 1 从“TCHAR [1]”转换为“const wchar_t *”[回答]这个问题你自己解决吧,应该不是我的代码造成的. 用VC搞WEB游戏辅助器出现的问题! RichEdit 1.0怎么换成RichEdit 2.0??? [讨论]上TB级的三元组数据存储与查找 请问:关于程序调试时链接顺序错误的问题 自己写的软件里怎么引入工程的概念?实现方式是什么? 我公司请人 如何使鼠标移到某个控件上就变成手形 高分在线等待,关于数据库字段中插入特殊字符的问题! 如何将HCURSOR转换为HBITMAP? 有那位大虾正在读或曾经读过《C++编程思想》吗?小弟不才以为书中有一个问题无法解释 请进 up有分 如何把内存DC中绘制的图像图像数据和调色板等数据信息? vc 6.0 连接oracle9i的问题
建议使用这个无版权的:http://www.gladman.me.uk。winzip和PilotEdit都用它。
后来因为版权问题,改用http://www.gladman.me.uk。
开始时,担心不兼容,后来经过测试后,发现两个算法的加密结果是一样的。
AES加密是按照块来进行的。比如,大概多少字节为一块,记不太清楚了。
最初的加密算法是各个块之间没有任何联系,这样相同的块加密后的密文肯定是相同的。这样不是很强壮。
改进后的算法,加上了一个参数,这个参数从前面一个块生成,然后传到后面一个块中,这样相同的块,加密后生成的密文是不同的(取决于它的上下文)。
这里的aes_encrypt_ctx cx就是这个参数,你把前一个块生成的值传到后一个块中就可以了。
有一个yasm.rule文件需要拷贝到Visual Studio的某个路径下
网站上有说明
你从网站上下载了Visual studio (比如2008)的工程后,要首先编译这个工程,生成lib文件。
然后把头文件和lib文件加入你自己的工程。
http://gladman.plushost.co.uk/oldsite/AES/aes-vs2008-07-10-08.zip
http://gladman.plushost.co.uk/oldsite/AES/aes-vs2005-16-04-07.zip
另外,你用的是哪个版本的Visual Studio?
头文件:#if !defined(AFX_CAESENCRYPT_H_8ED34430_0FC9_466C_82FC_452D4F52F992__INCLUDED_)
#define AFX_CAESENCRYPT_H_8ED34430_0FC9_466C_82FC_452D4F52F992__INCLUDED_
#include "AES\aes.h"
#pragma once//1024 * 128
#define ENC_DEC_BUF_SIZE 131072class CAESEncrypt
{
public:
CAESEncrypt(void);
public:
virtual ~CAESEncrypt(void);
public:
static char szPEEncryptionPrefix[100];
static void GetErrorMessage(CString & p_sResultDesc);
static void ShowErrorMessage();
static BOOL PEEncryptFile(CString p_sFileName, CString p_sMsgFileName, CString p_sPassword, CString & p_sResultDesc, BOOL p_bSaveBackup = FALSE, BOOL p_ShowMsg = TRUE);
static BOOL PEDecryptFile(CString p_sFileName, CString p_sMsgFileName, CString p_sPassword, CString & p_sResultDesc, BOOL p_bSaveBackup = FALSE, BOOL p_ShowMsg = TRUE);};#endif // !defined(AFX_CAESENCRYPT_H_8ED34430_0FC9_466C_82FC_452D4F52F992__INCLUDED_)
#include "AESEncrypt.h"
#include "GlobalComponent.h"
#include "MainFrm.h"CAESEncrypt::CAESEncrypt(void)
{
}CAESEncrypt::~CAESEncrypt(void)
{
}char CAESEncrypt::szPEEncryptionPrefix[100] = "ENCRYPTED BY PilotEdit 1.5.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";void CAESEncrypt::GetErrorMessage(CString & p_sResultDesc)
{
int nErrorCode = GetLastError();
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
nErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
p_sResultDesc = (LPCTSTR)lpMsgBuf;
// Free the buffer.
LocalFree(lpMsgBuf);
}void CAESEncrypt::ShowErrorMessage()
{
int nErrorCode = GetLastError();
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
nErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
AfxMessageBox((LPCTSTR)lpMsgBuf, MB_ICONERROR | MB_OK);
// Free the buffer.
LocalFree(lpMsgBuf);
}
BOOL CAESEncrypt::PEEncryptFile(CString p_sFileName, CString p_sMsgFileName, CString p_sPassword, CString & p_sResultDesc, BOOL p_bSaveBackup, BOOL p_ShowMsg)
{
//set p_bSaveBackup to false
p_bSaveBackup = FALSE;
// int i, j, u, v, offset;
int offset;
unsigned char key[CL_MAX_PATH_LEN];
// unsigned char buf[16];
// unsigned char prv[16];
unsigned char iv[ENC_DEC_BUF_SIZE];
unsigned char szOutputBuff[ENC_DEC_BUF_SIZE];
aes_encrypt_ctx ctx; memset( key, 0, CL_MAX_PATH_LEN );
memset( iv , 0, ENC_DEC_BUF_SIZE );
offset = 0;
// memset( prv, 0, 16 );
// memset( buf, 0, 16 );
TCHAR wszKey[CL_MAX_PATH_LEN];
_snwprintf_s6(wszKey, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s"), p_sPassword);
int nKeyLen = WideCharToMultiByte(CP_ACP, 0, p_sPassword, (int)wcslen(wszKey), (LPSTR)key, CL_MAX_PATH_LEN, NULL, NULL);
key[nKeyLen] = 0x00;
//Set key, the key length must be 128, 196, 256
aes_encrypt_key(key, 256, &ctx); //Begin Encryption/Decryption
CWaitCursor wait;
//Open source file and target file
HANDLE hFile1 = CreateFile(p_sFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)0);
if(hFile1 == NULL)
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
return FALSE;
} CL_INT64 m_nFile1Size = 0;
ASSERT(sizeof(DWORD) == 4);
DWORD *pFile1SizeLower = ((DWORD *)&m_nFile1Size);
DWORD *pFile1SizeHeigher = (DWORD *)&m_nFile1Size + 1;
*pFile1SizeLower = GetFileSize(hFile1, pFile1SizeHeigher);
// if(m_nFile1Size == 0)
// {
// if(p_ShowMsg)
// {
// _snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("File \"%s\" is not encrypted by PilotEdit! Decryption cancelled!")), p_sMsgFileName);
// AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK);
// }
//CloseHandle(hFile1Mapping);
// CloseHandle(hFile1);
// return TRUE;
// } HANDLE hFile1Mapping = CreateFileMapping(hFile1, NULL, PAGE_READONLY, 0, 0, NULL);
if(m_nFile1Size > 0 && hFile1Mapping == NULL)
{
_snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("PilotEdit can't open file \"%s\"! Encryption cancelled!")), p_sMsgFileName);
p_sResultDesc = CGlobalComponent::m_wszTempBuffer;
if(p_ShowMsg)
{
AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK);
}
CloseHandle(hFile1);
return FALSE;
}
BOOL bBreak = FALSE;
BOOL bReturn = TRUE; CL_INT64 nFileOffset = 0;
DWORD *pFileOffsetLower = ((DWORD *)&nFileOffset);
DWORD *pFileOffsetHeigher = (DWORD *)&nFileOffset + 1;
//Get File Size
if(m_nFile1Size > 64)
{
nFileOffset = (m_nFile1Size - 64) / ENC_DEC_BUF_SIZE * ENC_DEC_BUF_SIZE;
void * pFile1Mapping = MapViewOfFile(hFile1Mapping, FILE_MAP_READ, *pFileOffsetHeigher, *pFileOffsetLower, (unsigned int)(m_nFile1Size - nFileOffset));
if(pFile1Mapping == NULL)
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
CloseHandle(hFile1Mapping);
CloseHandle(hFile1);
return FALSE;
}
unsigned char * pTagStart = (unsigned char *)pFile1Mapping + (m_nFile1Size - nFileOffset - 64);
if(!memcmp(pTagStart, szPEEncryptionPrefix, 48))
{
_snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("File \"%s\" has already been encrypted by PilotEdit! Encryption cancelled!")), p_sMsgFileName);
p_sResultDesc = CGlobalComponent::m_wszTempBuffer;
if(p_ShowMsg)
{
AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK);
}
CloseHandle(hFile1Mapping);
CloseHandle(hFile1);
UnmapViewOfFile(pFile1Mapping);
return TRUE;
}
UnmapViewOfFile(pFile1Mapping);
nFileOffset = 0;
}
//Open output file
TCHAR wszFileNameTemp[CL_MAX_PATH_LEN];
_snwprintf_s6(wszFileNameTemp, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s$PE$ENC"), p_sFileName);
CFileException eFile;
CFile fileDest;
if(!fileDest.Open(wszFileNameTemp, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive, &eFile))
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
CloseHandle(hFile1Mapping);
CloseHandle(hFile1);
return FALSE;
}
fileDest.SetLength(0);
if(CMainFrame::m_pdlgFTPTransferStatus != NULL)
{
CMainFrame::m_pdlgFTPTransferStatus->SetProgressPosition(0);
}
while((!bBreak) && nFileOffset < m_nFile1Size)
{
CL_INT64 nMapSize = ENC_DEC_BUF_SIZE;
if(m_nFile1Size - nFileOffset < ENC_DEC_BUF_SIZE)
{
nMapSize = m_nFile1Size - nFileOffset;
}
void * pFile1Mapping = MapViewOfFile(hFile1Mapping, FILE_MAP_READ, *pFileOffsetHeigher, *pFileOffsetLower, (unsigned int)nMapSize);
if(pFile1Mapping == NULL)
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
bBreak = TRUE;
bReturn = FALSE;
}
else
{
//begin encryption
memcpy(szOutputBuff, pFile1Mapping, (size_t)nMapSize);
if(nMapSize < ENC_DEC_BUF_SIZE)
{
memset(szOutputBuff + nMapSize, 0x00, (size_t)(ENC_DEC_BUF_SIZE - nMapSize));
nMapSize = (nMapSize + 15) / 16 * 16;
}
//aes_crypt_cfb( &ctx, AES_ENCRYPT, (int)nMapSize, &offset, iv, (unsigned char *)pFile1Mapping, szOutputBuff );
//0924 aes_crypt_cbc( &ctx, AES_ENCRYPT, (int)nMapSize, iv, szOutputBuff, szOutputBuff );
aes_cbc_encrypt(szOutputBuff, szOutputBuff, (int)nMapSize, iv, &ctx);
fileDest.Write(szOutputBuff, (unsigned int)nMapSize);
} UnmapViewOfFile(pFile1Mapping);
nFileOffset += ENC_DEC_BUF_SIZE; if(bBreak)
{
break;;
}
//CL_INT64 nProgressStatus = (nFileOffset * 100) / m_nFile1Size;
CL_INT64 nProgressStatus = 100;
if(m_nFile1Size != 0)
{
nProgressStatus = (nFileOffset * 100) / m_nFile1Size;
}
if(CMainFrame::m_pdlgFTPTransferStatus != NULL)
{
CMainFrame::m_pdlgFTPTransferStatus->SetProgressPosition((int)nProgressStatus);
}
if(CMainFrame::IsThreadToBeStopped())
{
p_sResultDesc = CGlobalComponent::GetLocalDesc(_T("Cancelled!"));
bReturn = FALSE;
break;
}
}
CloseHandle(hFile1Mapping);
CloseHandle(hFile1); //Write Tail into encrytepd file
TCHAR wszFileSize[100];
char szFileSize[100];
_snwprintf_s(wszFileSize, 100, 100, _T("%015I64d"), m_nFile1Size);
int nSizeLen = WideCharToMultiByte(CP_ACP, 0, wszFileSize, (int)wcslen(wszFileSize), (LPSTR)szFileSize, 100, NULL, NULL);
szFileSize[nSizeLen] = 0x00;
szFileSize[nSizeLen + 1] = 0x00;
fileDest.Write(szPEEncryptionPrefix, 48);
fileDest.Write(szFileSize, 16);
fileDest.Close();
if(bReturn)
{
if(p_bSaveBackup)
{
TCHAR wszFileNameBak[CL_MAX_PATH_LEN];
_snwprintf_s6(wszFileNameBak, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s.PE.BAK"), p_sFileName);
DeleteFile(wszFileNameBak);
if(!CopyFile(p_sFileName, wszFileNameBak, FALSE))
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
bReturn = FALSE;
}
}
if(!DeleteFile(p_sFileName))
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
bReturn = FALSE;
}
}
if(bReturn)
{
if(!MoveFile(wszFileNameTemp, p_sFileName))
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
bReturn = FALSE;
}
}
else
{
DeleteFile(wszFileNameTemp);
}
return bReturn;
}
BOOL CAESEncrypt::PEDecryptFile(CString p_sFileName, CString p_sMsgFileName, CString p_sPassword, CString & p_sResultDesc, BOOL p_bSaveBackup, BOOL p_ShowMsg)
{
//set p_bSaveBackup to false
p_bSaveBackup = FALSE;
// int i, j, u, v, offset;
int offset;
unsigned char key[CL_MAX_PATH_LEN];
// unsigned char buf[16];
// unsigned char prv[16];
unsigned char iv[ENC_DEC_BUF_SIZE];
unsigned char szOutputBuff[ENC_DEC_BUF_SIZE];
aes_decrypt_ctx ctx; memset( key, 0, CL_MAX_PATH_LEN );
memset( iv , 0, ENC_DEC_BUF_SIZE );
offset = 0;
// memset( prv, 0, 16 );
// memset( buf, 0, 16 );
TCHAR wszKey[CL_MAX_PATH_LEN];
_snwprintf_s6(wszKey, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s"), p_sPassword);
int nKeyLen = WideCharToMultiByte(CP_ACP, 0, p_sPassword, (int)wcslen(wszKey), (LPSTR)key, CL_MAX_PATH_LEN, NULL, NULL);
key[nKeyLen] = 0x00;
//Set key, the key length must be 128, 196, 256
aes_decrypt_key(key, 256, &ctx);
//aes_setkey_dec( &ctx, key, 256 ); //Begin Encryption/Decryption
CWaitCursor wait;
//Open source file and target file
HANDLE hFile1 = CreateFile(p_sFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)0);
if(hFile1 == NULL)
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
return FALSE;
} CL_INT64 m_nFile1Size = 0;
ASSERT(sizeof(DWORD) == 4);
DWORD *pFile1SizeLower = ((DWORD *)&m_nFile1Size);
DWORD *pFile1SizeHeigher = (DWORD *)&m_nFile1Size + 1;
*pFile1SizeLower = GetFileSize(hFile1, pFile1SizeHeigher);
if(m_nFile1Size == 0)
{
_snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("File \"%s\" is not encrypted by PilotEdit! Decryption cancelled!")), p_sMsgFileName);
p_sResultDesc = CGlobalComponent::m_wszTempBuffer;
if(p_ShowMsg)
{
AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK);
}
//CloseHandle(hFile1Mapping);
CloseHandle(hFile1);
return TRUE;
} HANDLE hFile1Mapping = CreateFileMapping(hFile1, NULL, PAGE_READONLY, 0, 0, NULL);
//AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
if(hFile1Mapping == NULL)
{
_snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("PilotEdit can't open file \"%s\"! Decryption cancelled!")), p_sMsgFileName);
p_sResultDesc = CGlobalComponent::m_wszTempBuffer;
if(p_ShowMsg)
{
AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK);
}
CloseHandle(hFile1);
return FALSE;
}
BOOL bBreak = FALSE;
BOOL bReturn = TRUE; CL_INT64 nFileOffset = 0;
DWORD *pFileOffsetLower = ((DWORD *)&nFileOffset);
DWORD *pFileOffsetHeigher = (DWORD *)&nFileOffset + 1; //Get File Size
if(m_nFile1Size < 64)
{
_snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("File \"%s\" is not encrypted by PilotEdit! Decryption cancelled!")), p_sMsgFileName);
p_sResultDesc = CGlobalComponent::m_wszTempBuffer;
if(p_ShowMsg)
{
AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK);
}
CloseHandle(hFile1Mapping);
CloseHandle(hFile1);
return TRUE;
}
nFileOffset = (m_nFile1Size - 64) / ENC_DEC_BUF_SIZE * ENC_DEC_BUF_SIZE;
void * pFile1Mapping = MapViewOfFile(hFile1Mapping, FILE_MAP_READ, *pFileOffsetHeigher, *pFileOffsetLower, (unsigned int)(m_nFile1Size - nFileOffset));
if(pFile1Mapping == NULL)
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
CloseHandle(hFile1Mapping);
CloseHandle(hFile1);
return FALSE;
}
unsigned char * pTagStart = (unsigned char *)pFile1Mapping + (m_nFile1Size - nFileOffset - 64);
if(memcmp(pTagStart, szPEEncryptionPrefix, 48))
{
_snwprintf_s(CGlobalComponent::m_wszTempBuffer, LENGTH_MAX_BUFF, LENGTH_MAX_BUFF, CGlobalComponent::GetLocalDesc(_T("File \"%s\" is not encrypted by PilotEdit! Decryption cancelled!")), p_sMsgFileName);
p_sResultDesc = CGlobalComponent::m_wszTempBuffer;
if(p_ShowMsg)
{
AfxMessageBox(CGlobalComponent::m_wszTempBuffer, MB_ICONERROR | MB_OK);
}
CloseHandle(hFile1Mapping);
CloseHandle(hFile1);
UnmapViewOfFile(pFile1Mapping);
return TRUE;
}
CL_INT64 nDecryptedFileSize = _atoi64((char *)pTagStart + 48);
UnmapViewOfFile(pFile1Mapping);
nFileOffset = 0;
m_nFile1Size -= 64;
//Open output file
TCHAR wszFileNameTemp[CL_MAX_PATH_LEN];
_snwprintf_s6(wszFileNameTemp, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s$PE$DEC"), p_sFileName);
CFileException eFile;
CFile fileDest;
if(!fileDest.Open(wszFileNameTemp, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive, &eFile))
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
CloseHandle(hFile1Mapping);
CloseHandle(hFile1);
return FALSE;
}
fileDest.SetLength(0); if(CMainFrame::m_pdlgFTPTransferStatus != NULL)
{
CMainFrame::m_pdlgFTPTransferStatus->SetProgressPosition(0);
}
while((!bBreak) && nFileOffset < m_nFile1Size)
{
CL_INT64 nMapSize = ENC_DEC_BUF_SIZE;
if(m_nFile1Size - nFileOffset < ENC_DEC_BUF_SIZE)
{
nMapSize = m_nFile1Size - nFileOffset;
}
void * pFile1Mapping = MapViewOfFile(hFile1Mapping, FILE_MAP_READ, *pFileOffsetHeigher, *pFileOffsetLower, (unsigned int)nMapSize);
if(pFile1Mapping == NULL)
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
bBreak = TRUE;
bReturn = FALSE;
}
else
{
//begin decryption
//aes_crypt_cfb( &ctx, AES_DECRYPT, (int)nMapSize, &offset, iv, (unsigned char *)pFile1Mapping, szOutputBuff );
//0924 aes_crypt_cbc( &ctx, AES_DECRYPT, (int)nMapSize, iv, (unsigned char *)pFile1Mapping, szOutputBuff );
aes_cbc_decrypt((unsigned char *)pFile1Mapping, szOutputBuff, (int)nMapSize, iv, &ctx);
if(nFileOffset + nMapSize > nDecryptedFileSize)
{
nMapSize = nDecryptedFileSize - nFileOffset;
if(nMapSize < 0)
{
nMapSize = 0;
}
}
fileDest.Write(szOutputBuff, (unsigned int)nMapSize);
} UnmapViewOfFile(pFile1Mapping);
nFileOffset += ENC_DEC_BUF_SIZE; if(bBreak)
{
break;;
}
//CL_INT64 nProgressStatus = (nFileOffset * 100) / m_nFile1Size;
CL_INT64 nProgressStatus = 100;
if(m_nFile1Size != 0)
{
nProgressStatus = (nFileOffset * 100) / m_nFile1Size;
}
if(CMainFrame::m_pdlgFTPTransferStatus != NULL)
{
CMainFrame::m_pdlgFTPTransferStatus->SetProgressPosition((int)nProgressStatus);
}
if(CMainFrame::IsThreadToBeStopped())
{
p_sResultDesc = CGlobalComponent::GetLocalDesc(_T("Cancelled!"));
bReturn = FALSE;
break;
}
}
CloseHandle(hFile1Mapping);
CloseHandle(hFile1);
fileDest.Close();
if(bReturn)
{
if(p_bSaveBackup)
{
TCHAR wszFileNameBak[CL_MAX_PATH_LEN];
_snwprintf_s6(wszFileNameBak, CL_MAX_PATH_LEN, CL_MAX_PATH_LEN, _T("%s.PE.BAK"), p_sFileName);
DeleteFile(wszFileNameBak);
if(!CopyFile(p_sFileName, wszFileNameBak, FALSE))
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
bReturn = FALSE;
}
}
if(!DeleteFile(p_sFileName))
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
bReturn = FALSE;
}
}
if(bReturn)
{
if(!MoveFile(wszFileNameTemp, p_sFileName))
{
GetErrorMessage(p_sResultDesc);
if(p_ShowMsg)
{
AfxMessageBox(p_sResultDesc, MB_ICONERROR | MB_OK);
}
bReturn = FALSE;
}
}
else
{
DeleteFile(wszFileNameTemp);
}
return bReturn;
}
1、GlobalComponent.h文件是您工程中的文件或是别的定义文件?
2、宏CL_MAX_PATH_LEN是自定义的还是系统预定义的?如果是自定义的,其值是多少因为我在有的文章中看到AES加密的长度分为几种,况且有的长度不适应有些加密模式。
“_snwprintf_s6”: 找不到标识符
“wcslen”: 不能将参数 1 从“TCHAR [1]”转换为“const wchar_t *”
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_GLOBALCOMPONENT_H__64C1630B_E16F_4838_B081_29AC3C6BDD7A__INCLUDED_)
#define AFX_GLOBALCOMPONENT_H__64C1630B_E16F_4838_B081_29AC3C6BDD7A__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#include "stdafx.h"
#include <afxtempl.h>#include "CryptoLib\rsa.h"
#include "CryptoLib\osrng.h" // PRNG
#include "CryptoLib\hex.h" // Hex Encoder/Decoder
#include "CryptoLib\files.h" // File Source and Sink
#define CLFR_MATCHCASE 0x01
#define CLFR_WHOLEWORD 0x02
#define CLFR_ALLFILES 0x04
#define CLFR_REGULAREXP 0x08
#define CLFR_HEXMODE 0x10
#define CLFR_FROMTOP 0x20
#define CLFR_PROMPT 0x40
#define CLFR_NEWBUFFSTEP 0x80
#define CLFR_UPDATEVIEW 0x100
#define CLFR_REPLACEALL 0x200
#define CLFR_OUTPUTWINDOW2 0x400
#define CLFR_PROC_SCRIPT 0x800
#define CLFR_FROM_TOP_WHEN_NONE 0x1000
//#define CLFR_KEEP_CURSOR_POS_WHEN_NONE 0x2000
//在查找UTF16和UTF16BE时,有可能混淆"4E 00" 和"00 4E 00 **",所以需要对齐WORD
#define CLFR_UTF16_WORD_ALIGN 0x2000#define CL_MAX_PATH_LEN 1050
#define FTP_HUGE_SIZE_BOUNDARY 4000000000#define LENGTH_MAX_TEXT 2000
#define LENGTH_MAX_BUFF 10000#define CLFR_MAX_TEXT 2000
#define CLFR_MAX_BUFF 10000#define CL_MAX_TAG_LEN 50
#define CL_MAX_TAG_LEN_500 500
#define MAX_TCHAR_TO_CHAR_NUM 8#define CL_64
#ifdef CL_64
#define CL_INT64 __int64
#define CL_INT64_MAX 0X7FFFFFFFFFFFFFFF
//#define CL_INT64 char
//#define CL_INT64_MAX 0X7F
#else
#define CL_INT64 int
#define CL_INT64_MAX 0X7FFFFFFF
#endif
#define CL_INT_32_BASE 0X100000000
//#define CL_INT64 char
//#define CL_INT64_MAX 0X7F
#include <stdio.h>//#ifdef VC6
// int strcat_s(char *strDestination, size_t sizeInBytes, const char *strSource);
// int wcscat_s(wchar_t *strDestination, size_t sizeInWords, const wchar_t *strSource);
// #define _snwprintf_s(a, b, c, d, e) _snwprintf(a, b, d, e)
// #define _snwprintf_s6(a, b, c, d, e, f) _snwprintf(a, b, d, e, f)
// #define _snwprintf_s7(a, b, c, d, e, f, g) _snwprintf(a, b, d, e, f, g)
// #define _snwprintf_s8(a, b, c, d, e, f, g, h) _snwprintf(a, b, d, e, f, g, h)
// #define _snwprintf_s9(a, b, c, d, e, f, g, h, i) _snwprintf(a, b, d, e, f, g, h, i)
//#else
#define _snwprintf_s6 _snwprintf_s
#define _snwprintf_s7 _snwprintf_s
#define _snwprintf_s8 _snwprintf_s
#define _snwprintf_s9 _snwprintf_s
//#endif
1、GlobalComponent.h文件是您工程中的文件或是别的定义文件?
[回答]自定义的
2、宏CL_MAX_PATH_LEN是自定义的还是系统预定义的?如果是自定义的,其值是多少因为我在有的文章中看到AES加密的长度分为几种,况且有的长度不适应有些加密模式。
[回答]CL_MAX_PATH_LEN是自定义的,是路径的最大长度,和AES加密的长度无关.
“_snwprintf_s6”: 找不到标识符
[回答]就是_snwprintf_s
“wcslen”: 不能将参数 1 从“TCHAR [1]”转换为“const wchar_t *”
[回答]这个问题你自己解决吧,应该不是我的代码造成的.