DES加密解密类 可实现对文件非文件加密,以及自动获取密匙和手动输入
2012-04-20 09:49
429 查看
发一个DES加密解密类。可实现对文件非文件加密,以及自动获取密匙和手动输入。
DES数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用DEA。它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使用费而使用。1977年被美国政府正式采纳。原理大家自己去百度。上代码。
DES.h
// 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_)DES.cpp
// 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; }
maomao 发表于 2011-3-16 23:44
上接DES.cpp
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} } };
maomao 发表于 2011-3-16 23:44
测试用例
main.cpp
#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; }
相关文章推荐
- shell脚本从网络获取文件实现自动输入密码
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
- Java递归实现输入任意目录,列出文件以及文件夹
- JQuery Slider 实现时间刻度滑动条,用以编辑项目/起始时间(手动输入可自动更新到滑动条)
- 混合编程 -- 实现C自动编译以及thrift文件实现生成定义文件
- Android Studio生成签名文件,自动签名,以及获取SHA1和MD5值
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- 输入文本框中输入手机号自动添加空格以及在手机号中间的空格处删除时自动删除末尾号码其他位置则删除直接删除实现
- Android Studio生成签名文件,自动签名,以及获取SHA1和MD5值
- android的aidl-手动实现aidl自动生成的Java文件
- Oracle function实现根据输入的日期以及天数,获取此日期之后的天数的工作日
- JQuery Slider 实现时间刻度滑动条,用以编辑项目/起始时间(手动输入可自动更新到滑动条)
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- TextBox获取输入焦点时自动全选的实现方法
- 更改IP 脚本(自动获取和手动设置多个IP),将内容拷贝到记事本另存为bat批处理文件
- linux之用echo输入数据到文本末尾以及用open ssl命令在证书文件里面获取公钥
- 如何不让EditText不自动获取焦点以及EditText只能输入数字
- Java实现根据输入的日期以及天数,获取此日期之后的天数的工作日
- VBScript脚本实现在目录中自动获取某个文件