散分!请求提供des加密算法c++源码 散分!请求提供des算法c++源码或者有其它好的加密算法的源码提供. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://community.csdn.net/Expert/topic/4232/4232783.xml?temp=.1083185 加密算法很多哦从micro上面就能下载到或者去http://www.codeproject.com crypto51 一个提供源码的加密的库,你可以从网上去下载,里面有des // 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_) // 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_FILEstatic 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]); //¸ù¾Ý±í½øÐÐ28λÊý×óÒÆ D[i] = LefMove28(D[i-1],Map[i-1]); //¸ù¾Ý±í½øÐÐ28λÊý×óÒÆ K[i] = C[i]; K[i] = (K[i] << 28) + D[i]; //Éú³É×ÓÃÜÔ¿ result = 0; for(int j = 0;j<48;j++) //56λ×ÖÃÜԿתΪ48λ { temp = 1; temp = temp << (Map2[j] - 1); temp = (K[i] & temp)? 1:0; temp = temp << j; result = temp | result; } K[i] = result; } }//////////////////////////////////////////////////////////////////////////InitKey()×÷Ó㺳õʼ»¯ÃÜÔ¿////////////////////////////////////////////////////////////////////////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;//ת»¯64λԭʼÃÜԿΪ56λ 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; }//¸ù¾ÝÃÜÔ¿µÃµ½C0,R0 C[0] = (int)((_key & 0x00fffffff0000000) >> 28); D[0] = (int)(_key & 0x000000000fffffff);//¸ù¾ÝC(i),R(i)µÃµ½16¸ö×ÓÃÜÔ¿ MakeSubKeys();} //////////////////////////////////////////////////////////////////////////LefMove28()×÷Óãº28λÊýµÄ×óÒƲÙ×÷//int data ----- ²Ù×÷Êý//int bit ----- Òƶ¯µÄλÊý ////////////////////////////////////////////////////////////////////////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()×÷Ó㺽âÃܲÙ×÷//void * pData -------- ´æ·Å½âÃܺóµÄÊý¾Ý//int length -------- ÐèÒª½âÃܵÄÊý¾Ý³¤¶È£¬Ó¦Îª8µÄÕûÊý±¶//__int64 Key -------- ½âÃÜÃÜÔ¿//CFile* pFile -------- ´æ·ÅÐèÒª½âÃÜÊý¾ÝµÄÎļþ////////////////////////////////////////////////////////////////////////void * CDes::DeCode(void * pData,int length,__int64 Key,CFile* pFile){//IP(IP-1) ±í , ÕâÀïÓõ½µÄÊÇ IP-1 £¬½øÐз´Ïòת»» 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};//³õʼ»¯Ò»Ð©Êý¾Ý ............ 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; }//³õʼ»¯ÃÜÔ¿ InitKey();//ÉêÇëÄÚ´æ 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 ²Ù×÷£¬¸ù¾Ýת»¯±íת»»Êý¾Ý MapData(m_Data); //½øÐÐ16´Îµü´ú²Ù×÷ for(i = 1;i<17;i++) Exchange(17 - i); m_Result = R; m_Result = (m_Result << 32) + L; result = 0;// IP-1 ²Ù×÷£¬¸ù¾Ýת»»±í½øÐÐÄæÏòת»» for(i = 0;i<64;i++) { Temp = m_Result >> i; Temp = Temp & 0x01; result = (Temp << (Map[i]-1)) | result; }//µÃµ½Êý¾Ý£¬½øÐÐÏÂÒ»¸öÊý¾Ý¼ÓÃÜ m_Result = result; *pDataOut = m_Result; j += sizeof(__int64); pDataIn++; pDataOut++; }// pFile->Seek(-length,CFile::current);// pFile->Write(pOut,buffer_len);//Ëͻػº³åÇø 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;}//////////////////未完!!!待续!!! idAnts(Coil & Nova Since 1985)是否能把源代码直接发给我啦,不想浪费你太多时间在这里贴..先谢了 很感谢 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); http://www.vckbase.com/document/viewdoc/?id=623http://www.vckbase.com/document/viewdoc/?id=352http://www.vckbase.com/code/findcode.asp?keyword=des 问题基本解决了,刚刚是我自己太心急没做好,感谢大家,特别感谢idAnts(Coil & Nova Since 1985) 先回去吃饭了,明天回来揭贴 哦,你需要改动这个解密的接口DeCode,因为当初为了同事的需要,代码是从一个文件当前给定的位置读出指定长度数据,解密后再写回该文件中.代码中写回的部分让我注释掉了。// pFile->Seek(-length,CFile::current);// pFile->Write(pOut,buffer_len);或者是你把下面的// memcpy(pData,pOut,buffer_len);注释去掉,那么解密完的数据在返回的pData里. Cximage库的问题 MainFrame调用View类变量,编译无错,但运行不了~ 内存 怎么越占越大呢。 VC 中关于句柄的问题 比较迷茫~不知道以后工作怎么找类 int,long,double类型的网络传递 请问---------------------------------------- 请问什么叫事件内核对象呢?很白痴的问题。 一个棘手的问题!100分 关于进程的问题,请大家帮忙。 哪位朋友可以给出《THINK IN C++》第一卷 第三章 第28道练习题的程序啊 关于p2sp的多源超线程传输策略
从micro上面就能下载到
或者去http://www.codeproject.com
////
//////////////////////////////////////////////////////////////////////#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_)
//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]); //¸ù¾Ý±í½øÐÐ28λÊý×óÒÆ
D[i] = LefMove28(D[i-1],Map[i-1]); //¸ù¾Ý±í½øÐÐ28λÊý×óÒÆ
K[i] = C[i];
K[i] = (K[i] << 28) + D[i]; //Éú³É×ÓÃÜÔ¿
result = 0;
for(int j = 0;j<48;j++) //56λ×ÖÃÜԿתΪ48λ
{
temp = 1;
temp = temp << (Map2[j] - 1);
temp = (K[i] & temp)? 1:0;
temp = temp << j;
result = temp | result;
}
K[i] = result;
}
}////////////////////////////////////////////////////////////////////////
//InitKey()×÷Ó㺳õʼ»¯ÃÜÔ¿
////////////////////////////////////////////////////////////////////////
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;//ת»¯64λԭʼÃÜԿΪ56λ
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;
}//¸ù¾ÝÃÜÔ¿µÃµ½C0,R0
C[0] = (int)((_key & 0x00fffffff0000000) >> 28);
D[0] = (int)(_key & 0x000000000fffffff);//¸ù¾ÝC(i),R(i)µÃµ½16¸ö×ÓÃÜÔ¿
MakeSubKeys();
}
//LefMove28()×÷Óãº28λÊýµÄ×óÒƲÙ×÷
//int data ----- ²Ù×÷Êý
//int bit ----- Òƶ¯µÄλÊý
////////////////////////////////////////////////////////////////////////
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()×÷Ó㺽âÃܲÙ×÷
//void * pData -------- ´æ·Å½âÃܺóµÄÊý¾Ý
//int length -------- ÐèÒª½âÃܵÄÊý¾Ý³¤¶È£¬Ó¦Îª8µÄÕûÊý±¶
//__int64 Key -------- ½âÃÜÃÜÔ¿
//CFile* pFile -------- ´æ·ÅÐèÒª½âÃÜÊý¾ÝµÄÎļþ
////////////////////////////////////////////////////////////////////////
void * CDes::DeCode(void * pData,int length,__int64 Key,CFile* pFile)
{
//IP(IP-1) ±í , ÕâÀïÓõ½µÄÊÇ IP-1 £¬½øÐз´Ïòת»»
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};//³õʼ»¯Ò»Ð©Êý¾Ý ............
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;
}
//³õʼ»¯ÃÜÔ¿
InitKey();//ÉêÇëÄÚ´æ
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 ²Ù×÷£¬¸ù¾Ýת»¯±íת»»Êý¾Ý
MapData(m_Data);
//½øÐÐ16´Îµü´ú²Ù×÷
for(i = 1;i<17;i++)
Exchange(17 - i);
m_Result = R;
m_Result = (m_Result << 32) + L;
result = 0;
// IP-1 ²Ù×÷£¬¸ù¾Ýת»»±í½øÐÐÄæÏòת»»
for(i = 0;i<64;i++)
{
Temp = m_Result >> i;
Temp = Temp & 0x01;
result = (Temp << (Map[i]-1)) | result;
}
//µÃµ½Êý¾Ý£¬½øÐÐÏÂÒ»¸öÊý¾Ý¼ÓÃÜ
m_Result = result;
*pDataOut = m_Result;
j += sizeof(__int64);
pDataIn++;
pDataOut++;
}
// pFile->Seek(-length,CFile::current);
// pFile->Write(pOut,buffer_len);//Ëͻػº³åÇø
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;
}
//////////////////未完!!!待续!!!
.先谢了
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);
http://www.vckbase.com/document/viewdoc/?id=352
http://www.vckbase.com/code/findcode.asp?keyword=des
先回去吃饭了,明天回来揭贴
// pFile->Seek(-length,CFile::current);
// pFile->Write(pOut,buffer_len);或者是你把下面的
// memcpy(pData,pOut,buffer_len);
注释去掉,那么解密完的数据在返回的pData里.