散分!请求提供des算法c++源码
或者有其它好的加密算法的源码提供.

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/4232/4232783.xml?temp=.1083185
      

  2.   

    加密算法很多哦
    从micro上面就能下载到
    或者去http://www.codeproject.com
      

  3.   

    crypto51 一个提供源码的加密的库,你可以从网上去下载,里面有des
      

  4.   

    // Des.h: interface for the CDes class.
    ////
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_DES_H__3F7397C3_6BF7_4F9B_A69F_7CDD6CE760C0__INCLUDED_)
    #define AFX_DES_H__3F7397C3_6BF7_4F9B_A69F_7CDD6CE760C0__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000class CDes  
    {
    public:
    CDes();
    virtual ~CDes();
    void * DeCode(void * pData,int length,__int64 Key,CFile* result);
    BOOL EnCode(CFile *pFile,__int64 Key,int length,void *pData);

    private:
    void MakeSubKeys();
    void InitKey();
    int LefMove28(int data,int bit);
    __int64 MapData(__int64 data);
    void Exchange(int index); __int64 m_key;
    __int64 K[17];
    int C[17];
    int D[17];
    DWORD L;
    DWORD R;
    __int64 m_Data;
    __int64 m_Result;
    void *pIn;
    void *pOut;
    int buffer_len;
    };#endif // !defined(AFX_DES_H__3F7397C3_6BF7_4F9B_A69F_7CDD6CE760C0__INCLUDED_)
      

  5.   

    // Des.cpp: implementation of the CDes class.
    //Author : ZZj 2004.04.06
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "TestDES.h"
    #include "Des.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CDes::CDes()
    {
    pIn = NULL;
    pOut = NULL;
    }CDes::~CDes()
    {
    if(pIn)
    delete [] pIn;
    if(pOut)
    delete [] pOut;
    }////////////////////////////////////////////////////////////////////////
    //MakeSubKeys()×÷Ó㺲úÉú×ÓÃÜÔ¿
    ////////////////////////////////////////////////////////////////////////
    void CDes::MakeSubKeys()
    {
    int Map[] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
    int Map2[] = {14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,
    41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32};

    __int64 temp,result;//¼ÆËã×Ó16¸öÃÜÔ¿
    for(int i = 1;i<17;i++)
    {
    C[i] = LefMove28(C[i-1],Map[i-1]); //&cedil;ù&frac34;&Yacute;±í&frac12;&oslash;&ETH;&ETH;28&Icirc;&raquo;&Ecirc;&yacute;×ó&Ograve;&AElig;
    D[i] = LefMove28(D[i-1],Map[i-1]); //&cedil;ù&frac34;&Yacute;±í&frac12;&oslash;&ETH;&ETH;28&Icirc;&raquo;&Ecirc;&yacute;×ó&Ograve;&AElig;
    K[i] = C[i];
    K[i] = (K[i] << 28) + D[i]; //&Eacute;ú&sup3;&Eacute;×&Oacute;&Atilde;&Uuml;&Ocirc;&iquest;
    result = 0;
    for(int j = 0;j<48;j++) //56&Icirc;&raquo;×&Ouml;&Atilde;&Uuml;&Ocirc;&iquest;×&ordf;&Icirc;&ordf;48&Icirc;&raquo;
    {
    temp = 1;
    temp = temp << (Map2[j] - 1);
    temp = (K[i] & temp)? 1:0;
    temp = temp << j;
    result = temp | result;
    }
    K[i] = result;
    }

    }////////////////////////////////////////////////////////////////////////
    //InitKey()×÷&Oacute;&Atilde;&pound;&ordm;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&Atilde;&Uuml;&Ocirc;&iquest;
    ////////////////////////////////////////////////////////////////////////
    void CDes::InitKey()
    {
    int Map[] = {57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,
    63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4};
    __int64 _key = 0,temp;//×&ordf;&raquo;&macr;64&Icirc;&raquo;&Ocirc;&shy;&Ecirc;&frac14;&Atilde;&Uuml;&Ocirc;&iquest;&Icirc;&ordf;56&Icirc;&raquo;
    for(int i = 0;i<56;i++)
    {
    temp = 1;
    temp = temp << (Map[i] - 1);
    temp = (m_key & temp)?1:0;
    temp = temp << i;
    _key = temp | _key;
    }//&cedil;ù&frac34;&Yacute;&Atilde;&Uuml;&Ocirc;&iquest;&micro;&Atilde;&micro;&frac12;C0,R0
    C[0] = (int)((_key & 0x00fffffff0000000) >> 28);
    D[0] = (int)(_key & 0x000000000fffffff);//&cedil;ù&frac34;&Yacute;C(i),R(i)&micro;&Atilde;&micro;&frac12;16&cedil;&ouml;×&Oacute;&Atilde;&Uuml;&Ocirc;&iquest;
    MakeSubKeys();
    }
      

  6.   

    ////////////////////////////////////////////////////////////////////////
    //LefMove28()×÷&Oacute;&Atilde;&pound;&ordm;28&Icirc;&raquo;&Ecirc;&yacute;&micro;&Auml;×ó&Ograve;&AElig;&sup2;&Ugrave;×÷
    //int data ----- &sup2;&Ugrave;×÷&Ecirc;&yacute;
    //int bit  ----- &Ograve;&AElig;&para;&macr;&micro;&Auml;&Icirc;&raquo;&Ecirc;&yacute;
    ////////////////////////////////////////////////////////////////////////
    int CDes::LefMove28(int data,int bit)
    {
    int result = data << bit;
    int temp = result & 0xf0000000;
    temp = temp >> 28;
    result = (result & 0x0fffffff) | temp;
    return result;
    }////////////////////////////////////////////////////////////////////////
    //DeCode()×÷&Oacute;&Atilde;&pound;&ordm;&frac12;&acirc;&Atilde;&Uuml;&sup2;&Ugrave;×÷
    //void * pData -------- &acute;&aelig;·&Aring;&frac12;&acirc;&Atilde;&Uuml;&ordm;ó&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;
    //int length -------- &ETH;è&Ograve;&ordf;&frac12;&acirc;&Atilde;&Uuml;&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;&sup3;¤&para;&Egrave;&pound;&not;&Oacute;&brvbar;&Icirc;&ordf;8&micro;&Auml;&Otilde;&ucirc;&Ecirc;&yacute;±&para;
    //__int64 Key -------- &frac12;&acirc;&Atilde;&Uuml;&Atilde;&Uuml;&Ocirc;&iquest;
    //CFile* pFile -------- &acute;&aelig;·&Aring;&ETH;è&Ograve;&ordf;&frac12;&acirc;&Atilde;&Uuml;&Ecirc;&yacute;&frac34;&Yacute;&micro;&Auml;&Icirc;&Auml;&frac14;&thorn;
    ////////////////////////////////////////////////////////////////////////
    void * CDes::DeCode(void * pData,int length,__int64 Key,CFile* pFile)
    {
    //IP(IP-1) ±í , &Otilde;&acirc;&Agrave;&iuml;&Oacute;&Atilde;&micro;&frac12;&micro;&Auml;&Ecirc;&Ccedil; IP-1 &pound;&not;&frac12;&oslash;&ETH;&ETH;·&acute;&Iuml;ò×&ordf;&raquo;&raquo;
    int Map[] = {58,50,42,34,26,18,10,2,
    60,52,44,36,28,20,12,4,
    62,54,46,38,30,22,14,6,
    64,56,48,40,32,24,16,8,
    57,49,41,33,25,17,9,1,
    59,51,43,35,27,19,11,3,
    61,53,45,37,29,21,13,5,
    63,55,47,39,31,23,15,7};//&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&Ograve;&raquo;&ETH;&copy;&Ecirc;&yacute;&frac34;&Yacute; ............
    int i;
    __int64 Temp,result = 0; if(pIn)
    delete [] pIn;
    if(pOut)
    delete [] pOut;
    pIn = NULL;
    pOut = NULL; m_key = Key;
    for(i = 0;i<17;i++)
    {
    K[i] = 0;
    C[i] = 0;
    D[i] = 0;
    }
    //&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&Atilde;&Uuml;&Ocirc;&iquest;
    InitKey();//&Eacute;ê&Ccedil;&euml;&Auml;&Uacute;&acute;&aelig;
    if(length%8)
    buffer_len = (length/8 + 1) * 8;
    else
    buffer_len = length;
    pIn = new char [buffer_len];
    if(!pIn)
    {
    return FALSE;
    }
    pOut = new char [buffer_len];
    if(!pOut)
    {
    delete [] pIn;
    return FALSE;
    }
    memset(pIn,0,buffer_len);
    memset(pOut,0,buffer_len);
    __int64 *pDataIn = (__int64 *)pIn;
    __int64 *pDataOut = (__int64 *)pOut;
    pFile->Read(pIn,length); for(int j = 0;j<buffer_len;)
    {
    m_Data = *pDataIn;
    //IP &sup2;&Ugrave;×÷&pound;&not;&cedil;ù&frac34;&Yacute;×&ordf;&raquo;&macr;±í×&ordf;&raquo;&raquo;&Ecirc;&yacute;&frac34;&Yacute;
    MapData(m_Data);

    //&frac12;&oslash;&ETH;&ETH;16&acute;&Icirc;&micro;ü&acute;ú&sup2;&Ugrave;×÷
    for(i = 1;i<17;i++)
    Exchange(17 - i);
    m_Result = R;
    m_Result = (m_Result << 32) + L;
    result = 0;
    // IP-1 &sup2;&Ugrave;×÷&pound;&not;&cedil;ù&frac34;&Yacute;×&ordf;&raquo;&raquo;±í&frac12;&oslash;&ETH;&ETH;&Auml;&aelig;&Iuml;ò×&ordf;&raquo;&raquo;
    for(i = 0;i<64;i++)
    {
    Temp = m_Result >> i;
    Temp = Temp & 0x01;
    result = (Temp << (Map[i]-1)) | result;
    }
    //&micro;&Atilde;&micro;&frac12;&Ecirc;&yacute;&frac34;&Yacute;&pound;&not;&frac12;&oslash;&ETH;&ETH;&Iuml;&Acirc;&Ograve;&raquo;&cedil;&ouml;&Ecirc;&yacute;&frac34;&Yacute;&frac14;&Oacute;&Atilde;&Uuml;
    m_Result = result;
    *pDataOut = m_Result;
    j += sizeof(__int64);
    pDataIn++;
    pDataOut++;
    }
    // pFile->Seek(-length,CFile::current);
    // pFile->Write(pOut,buffer_len);//&Euml;&Iacute;&raquo;&Oslash;&raquo;&ordm;&sup3;&aring;&Ccedil;&oslash;
    if(pData)
    memcpy(pData,pOut,length); // ...buffer_len >= length,maybe overflow.....
    // memcpy(pData,pOut,buffer_len); delete [] pIn;
    delete [] pOut;
    pIn = NULL;
    pOut = NULL; return pData;
    }
    //////////////////未完!!!待续!!!
      

  7.   

    idAnts(Coil & Nova Since 1985)是否能把源代码直接发给我啦,不想浪费你太多时间在这里贴.
    .先谢了
      

  8.   

    很感谢 idAnts 提供的源码,加密部分初步测试可以实现,但解密部分好象有问题.我贴下我的源码,解出来的文件和原来不一样
    unsigned char digest[16];  //解密
    CString path;
    path = "c:\\new.dat";//加密后的文件.
    DWORD flen;
    CFile *file;
    file = new CFile;
    if ( !file->Open(path, CFile::shareDenyNone|CFile::modeReadWrite))
    {
    return;
    }
    flen = file->GetLength();
    data = new unsigned char[(int)flen]; INT64 sKey;
    sKey = 123;   //密码 CDes  de;
    //de.EnCode(file,sKey,flen,data);
    de.DeCode(data,flen,sKey,file);
    FILE* fWrite = _tfopen(_T("C:\\decode1.dat"), _T("wb")); //解密后的文件 fwrite(data, flen, sizeof(unsigned char), fWrite);
    fclose(fWrite);
      

  9.   

    http://www.vckbase.com/document/viewdoc/?id=623
    http://www.vckbase.com/document/viewdoc/?id=352
    http://www.vckbase.com/code/findcode.asp?keyword=des
      

  10.   

    问题基本解决了,刚刚是我自己太心急没做好,感谢大家,特别感谢idAnts(Coil & Nova Since 1985) 
     先回去吃饭了,明天回来揭贴
      

  11.   

    哦,你需要改动这个解密的接口DeCode,因为当初为了同事的需要,代码是从一个文件当前给定的位置读出指定长度数据,解密后再写回该文件中.代码中写回的部分让我注释掉了。
    // pFile->Seek(-length,CFile::current);
    // pFile->Write(pOut,buffer_len);或者是你把下面的
    // memcpy(pData,pOut,buffer_len);
    注释去掉,那么解密完的数据在返回的pData里.