DES加密解密类 可实现对文件非文件加密,以及自动获取密匙和手动输入

来源:互联网 发布:卡宝软件怎么样 编辑:程序博客网 时间:2024/05/16 10:20

发一个DES加密解密类。可实现对文件非文件加密,以及自动获取密匙和手动输入。

DES数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用DEA。它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使用费而使用。1977年被美国政府正式采纳。

原理大家自己去百度。上代码。
DES.h[code]// DES.h: interface for the DES class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DES_H__97A93961_015D_4BDF_914E_F4386FEE39CD__INCLUDED_)
#define AFX_DES_H__97A93961_015D_4BDF_914E_F4386FEE39CD__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <windows.h>



class DES  
{
public:
        DES();
        virtual ~DES();
        
        BOOL  EncryptFile(PTCHAR szpOPath,PTCHAR szpDPath);        //对文件加密 第一个参数为原文路径 第二个参数是 密文路径
        BOOL  EncryptNonFile(PTCHAR szpInput,PTCHAR szpOutput,int nLength);// 对非文件加密 第一个参数是 输入 第二个参数是加密后输出,第三个参数是带价密字符串大小
        BOOL  DecryptFile(PTCHAR szpEPath,PTCHAR szpOrPath);//对文件解密 第一个参数是密文文件路径 第二个参数是解密后文件路径
        BOOL  DecryptNonFile(PTCHAR szpInput, PTCHAR szpOutPut,int nLength);//对非文件解密 第一个参数是 待解密类容 第二个参数是解密后输出
        BOOL  SetMethosOfKey(BOOL bSetByMyself, PTCHAR szpKey);//选择获取密钥的方法,随机获得或者人工输入 bSetBySelf为真则自己输入
        PSTR  GetKey();// 取得密匙

private:
        BOOL GetARandomKey();//得到一个随机密匙
        BOOL ByteToBit(TCHAR cByte, PTCHAR szpBite);//字节转换二进制位
        BOOL BitToByte(PTCHAR szpBite, PTCHAR cByte);//二进制位转换为字节
        BOOL Byte8ToBit64(PTCHAR szpByte, PTCHAR szpBit);//长度为8的字符串转换为二进制位
        BOOL Bit64ToByte8(PTCHAR szp64Data, PTCHAR szp8Byte);//将64位二进制数据转换为8长度的字符串
        BOOL MakeSubKey(PTCHAR szpKey);//生成16个子密钥
        BOOL SplitKey(PTCHAR szpKey, PTCHAR szpCKey, PTCHAR szpDKey);//分拆密钥
        BOOL LeftMove(TCHAR data[56], int time);//左移
        //BOOL LeftMove(PTCHAR szpCKey, PTCHAR szpDKey, int nTime);//左移
        BOOL MergeKey(PTCHAR szpCKey, PTCHAR szpDKey, PTCHAR szpTemp);//合并密码
        BOOL IpTransform(PTCHAR szpData);//IP置换
        BOOL SplitData(PTCHAR szpOrData, PTCHAR szpLData, PTCHAR szpRData);//分拆64输入为两个 32 分组
        BOOL FFuction(PTCHAR szpInputData, int nCount);// f函数
        BOOL Xor(PTCHAR szpData, PTCHAR szpSubKey);//与子密钥异或
        BOOL SBox(PTCHAR szp48Data, PTCHAR szp32Data);//s盒转换
        BOOL XorWithL(PTCHAR szLData, PTCHAR szRData);//与L分组数据异或
        BOOL Swap(PTCHAR szpLData, PTCHAR szpRData);//交换分组数据
        BOOL MergeData(PTCHAR szp64Bit, PTCHAR szpLData, PTCHAR szpRData);
        BOOL EncryptA64Data(PTCHAR szp8ByteInput, PTCHAR sz8ByteOutput);//加密一个64位分组数据
        BOOL DecryptA64Data(PTCHAR szp8ByteInput, PTCHAR sz8ByteOutput);
        BOOL Ip_1Transform(PTCHAR szpData);//ip-1置换
        BOOL PTransform(PTCHAR szp32Data, PTCHAR szpOuptData);
        BOOL ETransform(PTCHAR szpData32, PTCHAR szpData48);
        BOOL Pc_1Transform(PTCHAR szpKey, PTCHAR szpTemp);//pc-1置换
        BOOL Pc_2Transform(PTCHAR szpKey, PTCHAR szpSubKey);//pc-2置换
        

private:
    TCHAR m_szKey[8];
        TCHAR m_szSubKey[16][48];

private:
const static int m_nIP_1[64];        
const static int m_nIP[64];
const static int m_nE[48];
const static int m_nP[32];
const static int m_nPC_1[56];
const static int m_nPC_2[56];
const static int m_nLeft_Move[16];
const static int m_nS_Box[8][4][16];



};

#endif // !defined(AFX_DES_H__97A93961_015D_4BDF_914E_F4386FEE39CD__INCLUDED_)
[/code]DES.cpp[code]// DES.cpp: implementation of the DES class.
//
//////////////////////////////////////////////////////////////////////

#include "DES.h"
#include <iostream>
#include <tchar.h>
#include <time.h>



//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

DES::DES()
{
        memset(m_szKey,0,sizeof(TCHAR)*8);
}

DES::~DES()
{

}

PSTR DES::GetKey()
{
        return m_szKey;
}

BOOL DES::SetMethosOfKey(BOOL bSetByMyse,PTCHAR szpKey)//bSetByMeself为Ture 则自己设置 否则随机设置
{
        if (TRUE == bSetByMyse)
        {
                memcpy(m_szKey,szpKey,sizeof(TCHAR)*_tcslen(szpKey));
        }
        else
        {
                GetARandomKey();
        }
        return TRUE;
}

BOOL DES::GetARandomKey()
{

        memset(m_szKey,0,sizeof(TCHAR)*8);
        srand((unsigned)time(NULL));
        for (int i = 0;i < 8; i++)
        {
                m_szKey[i] = (char)(128*rand()/(RAND_MAX+1.0));
        }
        return TRUE;
}

BOOL DES::ByteToBit(TCHAR cByte, PTCHAR szpBite)
{
        for (int i = 0;i < 8;i++)
        {
                *(szpBite + i) = (cByte >> i)&1;
        }
        return TRUE;
}

BOOL DES::BitToByte(PTCHAR szpBite, PTCHAR cByte)
{
        for (int i = 0; i < 8; i++)
        {
                *cByte |= *(szpBite + i) << i;
        }
        return TRUE;
}

BOOL DES::Byte8ToBit64(PTCHAR szpByte, PTCHAR szpBit)
{
        for (int i = 0; i < 8; i++)
        {
                ByteToBit(*(szpByte + i),szpBit + (i << 3));
        }
        return TRUE;
}

BOOL DES::MakeSubKey(PTCHAR szpKey)//生成子密钥
{
        TCHAR szTemp[56] = {0};
        TCHAR szBitKey[64] = {0};
        
        Byte8ToBit64(szpKey,szBitKey);
        
        Pc_1Transform(szBitKey,szTemp);
        
        TCHAR szCKey[28] = {0},szDKey[28] = {0};
        
        //SplitKey(szTemp,szCKey,szDKey);

        for (int i = 0; i < 16; i++)
        {
                //LeftMove(szCKey,szDKey,i);
                //MergeKey(szCKey,szDKey,szTemp);
                LeftMove(szTemp, m_nLeft_Move[i]);
                
                
                Pc_2Transform(szTemp,m_szSubKey[i]);
        }
        
        return TRUE;
        
}

BOOL DES::MergeKey(PTCHAR szpCKey, PTCHAR szpDKey, PTCHAR szpTemp)//输出一个子密匙
{
        memcpy(szpTemp,szpCKey,sizeof(TCHAR)*28);
        memcpy(szpTemp + 28,szpDKey,sizeof(TCHAR)*28);

        return TRUE;
}

BOOL DES::Pc_2Transform(PTCHAR szpKey, PTCHAR szpSubKey)//PC-2置换
{
        for (int i = 0; i < 48; i++)
        {
                *(szpSubKey + i) = *(szpKey + m_nPC_2[i]);
        }

        return TRUE;
}
//
//BOOL DES::LeftMove(PTCHAR szpCKey, PTCHAR szpDKey, int nTime)//左移
//{
//        TCHAR szTemp[28] = {0};
//
//        memcpy(szTemp,szpCKey + m_nLeft_Move[nTime],sizeof(TCHAR)*(28 - m_nLeft_Move[nTime]));
//        memcpy(szTemp + 28 - m_nLeft_Move[nTime],szpCKey,sizeof(TCHAR)*m_nLeft_Move[nTime]);
//        memcpy(szpCKey,szTemp,sizeof(TCHAR)*28);
//
//        memcpy(szTemp,szpDKey + m_nLeft_Move[nTime],sizeof(TCHAR)*(28 - m_nLeft_Move[nTime]));
//        memcpy(szTemp + 28 - m_nLeft_Move[nTime],szpDKey,sizeof(TCHAR)*m_nLeft_Move[nTime]);
//        memcpy(szpDKey,szTemp,sizeof(TCHAR)*28);
//
//        return TRUE;
//}

BOOL DES::Pc_1Transform(PTCHAR szpKey, PTCHAR szpTemp)//pc-1置换
{
        for (int i = 0; i < 56; i++)
        {
                *(szpTemp + i) = *(szpKey + m_nPC_1[i]);
        }
        return TRUE;
}
BOOL DES::SplitKey(PTCHAR szpKey, PTCHAR szpCKey, PTCHAR szpDKey)//分拆密钥
{
        memcpy(szpCKey,szpKey,sizeof(TCHAR)*28);
        memcpy(szpDKey,szpKey + 28,sizeof(TCHAR)*28);
        
        return TRUE;
}

BOOL DES::IpTransform(PTCHAR szpData)//ip置换
{
        TCHAR szTemp[64] = {0};

        for (int i = 0; i < 64; i++)
        {
                szTemp[i] = *(szpData + m_nIP[i]);
        }
        memcpy(szpData,szTemp,sizeof(TCHAR)*64); 
        
        return TRUE;
}

BOOL DES::SplitData(PTCHAR szpOrData, PTCHAR szpLData, PTCHAR szpRData)
{
        memcpy(szpLData,szpOrData,sizeof(TCHAR)*32);
        memcpy(szpRData,szpOrData + 32,sizeof(TCHAR)*32);
        
        return TRUE;
}

BOOL DES::FFuction(PTCHAR szpInputData, int nCount)//f函数
{
        TCHAR szData[48] = {0};
        TCHAR sz32Data[32] = {0};
        TCHAR szOututData[32] = {0};
        ETransform(szpInputData,szData);
        Xor(szData,m_szSubKey[nCount]);
        SBox(szData,sz32Data);
        PTransform(sz32Data,szOututData);
        memcpy(szpInputData,szOututData,sizeof(TCHAR)*32);

        return TRUE;
}

BOOL DES::SBox(PTCHAR szp48Data, PTCHAR szp32Data)//s盒转化
{

        for (int i = 0; i < 8; i++)
        {
                int nCur = i*6;
                int nLine = (*(szp48Data + nCur) << 1) + (*(szp48Data +nCur + 5));
                int nRow = (*(szp48Data +nCur + 1) << 3) + (*(szp48Data +nCur + 2) << 2) + (*(szp48Data +nCur + 3) << 1) + (*(szp48Data +nCur + 4));
                int OutPut = m_nS_Box[i][nLine][nRow];
                
                *(szp32Data + 4 * i) = (OutPut & 8) >> 3;
                *(szp32Data + 4 * i + 1) = (OutPut & 4) >> 2;
                *(szp32Data + 4 * i + 2) = (OutPut & 2) >> 1;
                *(szp32Data + 4 * i + 3) = OutPut & 1;

        }
        return TRUE;
}
BOOL DES::PTransform(PTCHAR szp32Data, PTCHAR szpOuptData)//p置换
{
        for (int i = 0; i < 32; i++)
        {
                *(szpOuptData + i) = *(szp32Data + m_nP[i]);
        }

        return TRUE;
}
BOOL DES::Xor(PTCHAR szpData, PTCHAR szpSubKey)//异或///////////////////////调试到此处
{
        for (int i = 0; i < 48; i++)
        {
                *(szpData + i) ^= *(szpSubKey + i);
        }
        return TRUE;
}

BOOL DES::ETransform(PTCHAR szpData32, PTCHAR szpData48)//扩展置换
{
        for (int i = 0; i < 48; i++)
        {
                *(szpData48 + i) = *(szpData32 + m_nE[i]);
        }
        return TRUE;
}

BOOL DES::XorWithL(PTCHAR szLData, PTCHAR szRData)
{
        for (int i = 0; i < 32; i++)
        {
                *(szLData + i) ^= *(szRData + i);
        }
        return TRUE;
}

BOOL DES::Swap(PTCHAR szpLData, PTCHAR szpRData)
{
        TCHAR szTemp[32];
        memcpy(szTemp,szpLData,sizeof(TCHAR)*32);
        memcpy(szpLData,szpRData,sizeof(TCHAR)*32);
        memcpy(szpRData,szTemp,sizeof(TCHAR)*32);

        return TRUE;
}

BOOL DES::EncryptA64Data(PTCHAR szp8ByteInput, PTCHAR sz8ByteOutput)//加密一个64位分组数据
{
        TCHAR szBite[64] = {0};

        Byte8ToBit64(szp8ByteInput,szBite);
        IpTransform(szBite);
        TCHAR szLData[32] = {0},szRData[32] = {0};
        SplitData(szBite,szLData,szRData);

        for (int i = 0; i < 16; i++)
        {
                TCHAR szTemp[32] = {0};
                memcpy(szTemp,szRData,sizeof(TCHAR)*32);
                FFuction(szRData,i);
                XorWithL(szLData,szRData);
                memcpy(szRData,szTemp,sizeof(TCHAR)*32);
                if (i != 15)
                {
                        Swap(szLData,szRData);
                }
        }
        MergeData(szBite,szLData,szRData);
        Ip_1Transform(szBite);
        Bit64ToByte8(szBite,sz8ByteOutput);

        return TRUE;

}
[/code]

maomao 发表于 2011-3-16 23:44

上接DES.cpp[code]BOOL DES::DecryptA64Data(PTCHAR szp8ByteInput, PTCHAR sz8ByteOutput)
{
        TCHAR szBite[64] = {0};

        Byte8ToBit64(szp8ByteInput,szBite);
        IpTransform(szBite);
        TCHAR szLData[32] = {0},szRData[32] = {0};
        SplitData(szBite,szLData,szRData);

        for (int i = 15; i >= 0; i--)
        {
                TCHAR szTemp[32] = {0};
                memcpy(szTemp,szRData,sizeof(TCHAR)*32);
                FFuction(szRData,i);
                XorWithL(szLData,szRData);
                memcpy(szRData,szTemp,sizeof(TCHAR)*32);
                if (i != 0)
                {
                        Swap(szLData,szRData);
                }
        }
        MergeData(szBite,szLData,szRData);
        Ip_1Transform(szBite);
        Bit64ToByte8(szBite,sz8ByteOutput);

        return TRUE;
}

BOOL DES::Ip_1Transform(PTCHAR szpData)
{
        TCHAR szBit[64] = {0};
        for (int i = 0; i < 64; i++)
        {
                szBit[i] = *(szpData + m_nIP_1[i]);
        }
        memcpy(szpData,szBit,sizeof(TCHAR)*64);
        
        return TRUE;
}

BOOL DES::MergeData(PTCHAR szp64Bit, PTCHAR szpLData, PTCHAR szpRData)
{
        memcpy(szp64Bit,szpLData,sizeof(TCHAR)*32);
        memcpy(szp64Bit + 32,szpRData,sizeof(TCHAR)*32);

        return 0;
}

BOOL DES::Bit64ToByte8(PTCHAR szp64Data, PTCHAR szp8Byte)
{
        memset(szp8Byte,0,8);
        for (int i = 0; i < 8; i++)
        {
                BitToByte(szp64Data + (i << 3), szp8Byte + i);
        }
        return TRUE;
}

BOOL DES::LeftMove(TCHAR data[56], int time)
{      
    TCHAR temp[56];   
  
    //保存将要循环移动到右边的位   
    memcpy(temp,data,time);   
    memcpy(temp+time,data+28,time);   
       
    //前28位移动   
    memcpy(data,data+time,28-time);   
    memcpy(data+28-time,temp,time);   
  
    //后28位移动   
    memcpy(data+28,data+28+time,28-time);   
    memcpy(data+56-time,temp+time,time);       
  
    return TRUE;   
}


BOOL DES::EncryptNonFile(PTCHAR szpInput,PTCHAR szpOutput,int nLength)
{
        int nLen = 0;
        BOOL bJudge = FALSE;
        MakeSubKey(m_szKey);
        if (nLength % 8 != 0)
        {
                nLen += (nLength / 8 + 1)<<3;
                bJudge = TRUE;
        }
        else
        {
                nLen = nLength;
        }
        
        int i = 0;
        while (TRUE)
        {
                TCHAR sz8Byte[8] = {0};        
                if ((i == nLen - 8) && (bJudge == TRUE))
                {
                        memset(sz8Byte,'\0',sizeof(TCHAR)*8);
                        memcpy(sz8Byte,szpInput + i,sizeof(TCHAR)*(nLength - 1 - i));
                        sz8Byte[7] = 8 - nLength + i + 1;
                }
                else
                {                
                        memcpy(sz8Byte,szpInput + i,sizeof(TCHAR)*8);
                }
                TCHAR szOutPut[8];
                EncryptA64Data(sz8Byte,szOutPut);
                memcpy(szpOutput + i,szOutPut,sizeof(TCHAR) * 8);
                if (i == nLen - 8)
                {
                        break;
                }
                i += 8;
        }
        return TRUE;
}

BOOL DES::DecryptNonFile(PTCHAR szpInput, PTCHAR szpOutPut,int nLength)
{
        MakeSubKey(m_szKey);
        for (int i = 0; i < nLength/8 ; i++)
        {
                TCHAR sz8Byte[8] = {0};
                TCHAR szTemp[8] = {0};
                memcpy(sz8Byte,szpInput + i*8,sizeof(TCHAR)*8);
                DecryptA64Data(sz8Byte,szTemp);
                memcpy(szpOutPut + i*8,szTemp,sizeof(TCHAR)*8);
        }
        return TRUE;
}

BOOL DES::EncryptFile(PTCHAR szpOPath,PTCHAR szpDPath)
{
        MakeSubKey(m_szKey);
        FILE *fOrTxt = NULL,*fETxt = NULL;
        if((fOrTxt = fopen(szpOPath,"rb")) == NULL)
        {
                return FALSE;
        }
        if ((fETxt = fopen(szpDPath,"wb")) == NULL)
        {
                return FALSE;
        }
        TCHAR szInput[8] = {0},szOutPut[8] = {0};
        int nCount = 0;
        while (!feof(fOrTxt))
        {
                if ((nCount = fread(szInput,sizeof(TCHAR),8,fOrTxt)) == 8)
                {
                        EncryptA64Data(szInput,szOutPut);
                        fwrite(szOutPut,sizeof(TCHAR),8,fETxt);
                }
                
        }
        if (nCount > 0)
        {
                memset(szInput + nCount,'\0',7 - nCount);
                szInput[7] = 8 - nCount;
                EncryptA64Data(szInput,szOutPut);
                fwrite(szOutPut,sizeof(TCHAR),8,fETxt);
        }
        fclose(fETxt);
        fclose(fOrTxt);

        return TRUE;
}

BOOL DES::DecryptFile(PTCHAR szpEPath,PTCHAR szpOrPath)
{
        MakeSubKey(m_szKey);
        FILE *fOrTxt = NULL,*fETxt = NULL;
        if((fOrTxt = fopen(szpOrPath,"wb")) == NULL)
        {
                return FALSE;
        }
        if ((fETxt = fopen(szpEPath,"rb")) == NULL)
        {
                return FALSE;
        }
        
        fseek(fETxt,0,SEEK_END);
        int nLength = ftell(fETxt);
        rewind(fETxt);

        TCHAR szInput[8] = {0},szOutPut[8] = {0};
        int nCount = 0;
        while (TRUE)
        {
                fread(szInput,sizeof(TCHAR),8,fETxt);
                DecryptA64Data(szInput,szOutPut);
                nCount += 8;
                if (nCount < nLength)
                {
                        fwrite(szOutPut,sizeof(TCHAR),8,fOrTxt);
                }
                else
                {
                        break;
                }
        }
        int nLen = 0;
        if (szOutPut[7] < 8)
        {
                for (nLen = 8 - szOutPut[7]; nLen < 7; nLen++)
                {
                        if (szOutPut[nLen] != '\0')
                        {
                                break;
                        }
                }
        }
        if (nLen == 7)
        {
                fwrite(szOutPut,sizeof(TCHAR),8 - szOutPut[7],fOrTxt);
        }
        else
        {
                fwrite(szOutPut,sizeof(TCHAR),8,fOrTxt);
        }
        
        fclose(fETxt);
        fclose(fOrTxt);
        return TRUE;
}






const  int DES::m_nIP_1[64] =         
{
        39,7,47,15,55,23,63,31,   
        38,6,46,14,54,22,62,30,   
        37,5,45,13,53,21,61,29,   
        36,4,44,12,52,20,60,28,   
        35,3,43,11,51,19,59,27,   
        34,2,42,10,50,18,58,26,   
        33,1,41, 9,49,17,57,25,   
        32,0,40, 8,48,16,56,24 

};

const  int DES::m_nIP[64] = 
{
        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,   
        56,48,40,32,24,16,8,0,   
        58,50,42,34,26,18,10,2,   
        60,52,44,36,28,20,12,4,   
        62,54,46,38,30,22,14,6                 
};

const int DES::m_nP[32] = 
{
        15,6,19,20,28,11,27,16,   
        0,14,22,25,4,17,30,9,   
        1,7,23,13,31,26,2,8,   
        18,12,29,5,21,10,3,24
};

const int DES::m_nPC_1[56] = 
{
        56,48,40,32,24,16,8,   
        0,57,49,41,33,25,17,   
        9,1,58,50,42,34,26,   
        18,10,2,59,51,43,35,   
        62,54,46,38,30,22,14,   
        6,61,53,45,37,29,21,   
        13,5,60,52,44,36,28,   
        20,12,4,27,19,11,3  
};

const int DES::m_nPC_2[56] = 
{
        13,16,10,23,0,4,2,27,   
  14,5,20,9,22,18,11,3,   
  25,7,15,6,26,19,12,1,   
  40,51,30,36,46,54,29,39,   
  50,44,32,46,43,48,38,55,   
  33,52,45,41,49,35,28,31
}; 

const int DES::m_nE[48] = 
{
        31, 0, 1, 2, 3, 4,   
        3,  4, 5, 6, 7, 8,   
        7,  8,9,10,11,12,   
        11,12,13,14,15,16,   
        15,16,17,18,19,20,   
        19,20,21,22,23,24,   
        23,24,25,26,27,28,   
        27,28,29,30,31, 0
};

const int DES::m_nLeft_Move[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

const int DES::m_nS_Box[8][4][16] =
{
        {
                {14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},   
                {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},   
                {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},   
                {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}
        },   
        //S2   
        {
                {15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},   
                {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},   
                {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},   
                {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}
        },   
        //S3   
        {
                {10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},   
                {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},   
                {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},   
                {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}
        },   
        //S4   
        {
                {7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},   
                {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},   
                {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},   
                {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}
        },   
        //S5   
        {
                {2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},   
                {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},   
                {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},   
                {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}
        },   
        //S6   
        {
                {12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},   
                {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},   
                {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},   
                {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}
        },   
        //S7   
        {
                {4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},   
                {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},   
                {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},   
                {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}
        },   
        //S8   
        {
                {13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},   
                {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},   
                {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},   
                {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}
        }
};   
[/code]

maomao 发表于 2011-3-16 23:44

测试用例
main.cpp[code]#include <iostream>
#include "DES.h"
using namespace std;
int main()
{
        DES desObject;
//        TCHAR szKeyy[8] = {0};
//        TCHAR str[] = "12345678";
//        memcpy(szKeyy,str,8);
        desObject.SetMethosOfKey(FALSE,NULL);
        desObject.EncryptFile("G:\\1.txt","G:\\2.txt");
        desObject.DecryptFile("G:\\2.txt","G:\\3.txt");
//        TCHAR szKey[9] = {0};
//        memcpy(szKey,desObject.GetKey(),8);
//        cout<<"密匙为:"<<szKey<<endl;
//        TCHAR szData[30] = {"龙珠爱打飞机!"};// 实验数据
//        //cout <<"请输入数据"<<endl;
//        //cin>>szData;
//        TCHAR szOutPutData[16] = {0};
//        desObject.EncryptNonFile(szData,szOutPutData,30);
//        cout<<"密文为:"<<szOutPutData<<endl;
//        FILE *fpFile = fopen("1.txt","at+");
//        fprintf(fpFile,"%s",szOutPutData);
//        TCHAR sz[16] = {0};
//        desObject.DecryptNonFile(szOutPutData,sz,16);
//        cout<<"明文为:"<<sz<<endl;
        return 0;
}[/code]