?? mcs.cpp
字號:
// MixedCS.cpp: implementation of the CMcs class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Mcs.h"
#include "MixedCS.h"
#include "Window.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
///////////////////////////////////////////////////////////////////////////////
// CMcs Functions
///////////////////////////////////////////////////////////////////////////////
#define CHECK(x) {if( !(x) ) return false;}
#define FILE_CHECK(x,file) {if( !(x) ) {RunError(file);return false;}}
#define FILE_CHECK_MSG(x,file,msg) {if( !(x) ) {CWindow::ShowMessage(msg);\
RunError(file);return false;}}
/******************************************************************************/
// 名稱:Encrypt
// 功能:加密
// 參數(shù):KeyStr,ModStr為0結(jié)尾的密鑰串,用于設(shè)置RSA密鑰和模n;Is3DES—3次DES標(biāo)志
// 返回:加密成功返回true,否則返回false
// 備注:無須保存3次DES標(biāo)志,因為DES會根據(jù)密鑰長度自動切換
// 更新:2003/1/30
// 作者:0200935王俊川
/******************************************************************************/
bool CMcs::Encrypt(char *OutFile,char *InFile,char *RsaKeyStr,char *RsaModStr,bool Is3DES)
{
CHECK( RsaKeyStr && RsaModStr && OpenFile(OutFile,InFile) )
char deskey[17];
CWindow wnd;
// 版本信息
mcshead.Ver = 1;
// 顯示等待光標(biāo)
wnd.ShowWaitCursor();
wnd.SetWindowCaption("RSA正在加密DES密鑰......");
// 產(chǎn)生隨機(jī)密鑰串
des.RandKeyStr(deskey);
// 如果使用3次DES加密,則再產(chǎn)生一個密鑰
if( Is3DES )
des.RandKeyStr(&deskey[8]);
// 加密DES密鑰串
FILE_CHECK( mcshead.KeyLen=rsa.Encrypt(mcshead.DesKey,deskey,Is3DES?16:8,
RsaKeyStr,RsaModStr),OutFile )
// 結(jié)束等待光標(biāo)
wnd.EndWaitCursor();
// 寫入信息頭
_lwrite(fh_out,(char*)&mcshead,sizeof(mcshead));
// 進(jìn)行DES加密
FILE_CHECK( des.Encrypt(fh_out,fh_in,deskey),OutFile )
CloseFile();
return true;
}
/******************************************************************************/
// 名稱:Decrypt
// 功能:解密
// 參數(shù):KeyStr,ModStr為0結(jié)尾的密鑰串,用于設(shè)置RSA密鑰和模n
// 返回:解密成功返回true,否則返回false
// 備注:
// 更新:2003/1/30
// 作者:0200935王俊川
/******************************************************************************/
bool CMcs::Decrypt(char *OutFile,char *InFile,char *RsaKeyStr,char *RsaModStr)
{
CHECK( RsaKeyStr && RsaModStr && OpenFile(OutFile,InFile) )
CWindow wnd;
// 讀取信息頭并檢查長度
FILE_CHECK_MSG( _lread(fh_in,&mcshead,sizeof(mcshead))==sizeof(mcshead),
OutFile, "錯誤:該文件不是有效的MCS加密文件!" )
// 版本控制
FILE_CHECK_MSG( mcshead.Ver==1,OutFile,"該版程序無法解密此文件。\n請使用該程序的最新版。")
// 顯示等待光標(biāo)
wnd.ShowWaitCursor();
wnd.SetWindowCaption("RSA正在解密DES密鑰......");
// 解密DES密鑰串
int len = rsa.Decrypt(mcshead.DesKey,mcshead.DesKey,mcshead.KeyLen,RsaKeyStr,RsaModStr);
// 結(jié)束等待光標(biāo)
wnd.EndWaitCursor();
// 檢查RSA密鑰的正確性
FILE_CHECK( len, OutFile )
FILE_CHECK_MSG( len<=16, OutFile,"錯誤:RSA密鑰不正確! ")
mcshead.DesKey[len] = '\0';
// 進(jìn)行DES解密
FILE_CHECK( des.Decrypt(fh_out,fh_in,mcshead.DesKey),OutFile )
CloseFile();
return true;
}
///////////////////////////////////////////////////////////////////////////////
// End of Files
///////////////////////////////////////////////////////////////////////////////
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -