本帖最后由 lcy_888 于 2010-03-31 12:39:06 编辑

解决方案 »

  1.   

    aes源代码也有的是吧,俺在csdn下载频道下载过。
      

  2.   

    openssl的版权好像是GPL的,
    建议使用这个无版权的:http://www.gladman.me.uk。winzip和PilotEdit都用它。
      

  3.   

    一样的,我开始的时候用的是openssl,
    后来因为版权问题,改用http://www.gladman.me.uk。
    开始时,担心不兼容,后来经过测试后,发现两个算法的加密结果是一样的。
      

  4.   

    可惜我的基础不好,代码下到了,但不明白aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1])中第三个参数的意义,楼上的能不能给个示例,谢谢了。
      

  5.   

    先大概讲讲:
    AES加密是按照块来进行的。比如,大概多少字节为一块,记不太清楚了。
    最初的加密算法是各个块之间没有任何联系,这样相同的块加密后的密文肯定是相同的。这样不是很强壮。
    改进后的算法,加上了一个参数,这个参数从前面一个块生成,然后传到后面一个块中,这样相同的块,加密后生成的密文是不同的(取决于它的上下文)。
    这里的aes_encrypt_ctx cx就是这个参数,你把前一个块生成的值传到后一个块中就可以了。
      

  6.   

    BCB模式和另外一种模式,名字忘了
      

  7.   

    就是不知道如何用啊,还有,就是LIB在哪得到啊,是不是还需要用源代码编译,我下了源代码,但没编译成功。请赐教。
      

  8.   

    你用的是那个版本的Vistual Studio?
    有一个yasm.rule文件需要拷贝到Visual Studio的某个路径下
    网站上有说明
      

  9.   

    有那么复杂?http://search.download.csdn.net/search/aes到处的代码。
      

  10.   

    无法解析的外部符号,我想应该是没有引入LIB所致
      

  11.   

    是这样的,
    你从网站上下载了Visual studio (比如2008)的工程后,要首先编译这个工程,生成lib文件。
    然后把头文件和lib文件加入你自己的工程。
      

  12.   

    你用的是Visual Studio 2008吗,这里
    http://gladman.plushost.co.uk/oldsite/AES/aes-vs2008-07-10-08.zip
      

  13.   

    Visual Studio 2005这里:
    http://gladman.plushost.co.uk/oldsite/AES/aes-vs2005-16-04-07.zip
      

  14.   

    在编译DLL中找不到aes_dll_main.c
      

  15.   

    我上次是编译成LIB,是成功的
    另外,你用的是哪个版本的Visual Studio?
      

  16.   

    LIB我也编译成功了,请问客户端程序在运行时需要用到DLL吗,还有,就是不知道如何用它实现加密解密啊,主要是一些参数的设置。
      

  17.   

    如果是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_)
      

  18.   

    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;
    }
      

  19.   

    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;
    }
      

  20.   

    谢谢,我几天没来了,我编译了下代码,有以下问题没解决,谢谢。
    1、GlobalComponent.h文件是您工程中的文件或是别的定义文件?
    2、宏CL_MAX_PATH_LEN是自定义的还是系统预定义的?如果是自定义的,其值是多少因为我在有的文章中看到AES加密的长度分为几种,况且有的长度不适应有些加密模式。
      

  21.   

    还有:
    “_snwprintf_s6”: 找不到标识符
    “wcslen”: 不能将参数 1 从“TCHAR [1]”转换为“const wchar_t *”
      

  22.   

    因为上次不能连续回三个贴,所以没贴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
      

  23.   

    谢谢,我几天没来了,我编译了下代码,有以下问题没解决,谢谢。
    1、GlobalComponent.h文件是您工程中的文件或是别的定义文件?
    [回答]自定义的
    2、宏CL_MAX_PATH_LEN是自定义的还是系统预定义的?如果是自定义的,其值是多少因为我在有的文章中看到AES加密的长度分为几种,况且有的长度不适应有些加密模式。
    [回答]CL_MAX_PATH_LEN是自定义的,是路径的最大长度,和AES加密的长度无关.
      

  24.   

    还有:
    “_snwprintf_s6”: 找不到标识符
    [回答]就是_snwprintf_s
    “wcslen”: 不能将参数 1 从“TCHAR [1]”转换为“const wchar_t *”
    [回答]这个问题你自己解决吧,应该不是我的代码造成的.