?? rsa.cpp
字號(hào):
// Rsa.cpp: implementation of the CRsa class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MixedCS.h"
#include "Window.h"
#include "Rsa.h"
#include "GfL.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
///////////////////////////////////////////////////////////////////////////////
// Construction
///////////////////////////////////////////////////////////////////////////////
CRsa::CRsa()
{
Zero = BI.New(0);
key = n = Zero;
}
///////////////////////////////////////////////////////////////////////////////
// CRsa Functions
///////////////////////////////////////////////////////////////////////////////
#define CHECK(x) {if( !(x) ) return false;}
#define CHECK_MSG(x,msg) {if( !(x) ){CWindow::ShowMessage(msg);return false;}}
/******************************************************************************/
// 名稱:Encrypt
// 功能:加密
// 參數(shù):len為加密內(nèi)容的長(zhǎng)度;KeyStr,ModStr為0結(jié)尾的密鑰串,用于設(shè)置RSA密鑰和模n
// 返回:加密(解密)后的密文(明文)長(zhǎng)度
// 備注:
// 更新:2003/1/25
// 作者:0200950原常青
/******************************************************************************/
int CRsa::Encrypt(char *Out,char *In,UINT len,char *KeyStr,char *ModStr)
{
static BigInt a,c;
CHECK( Out && In && len && SetKey(KeyStr,ModStr) )
// 由輸入構(gòu)造一個(gè)大數(shù)a
CHECK_MSG( BI.BuildBIFromByte(a,In,len) && a.len <= n.len, "錯(cuò)誤:RSA加密(解密)的內(nèi)容過長(zhǎng)!" )
// 加密(解密)
CHECK( BI.PowMod(c,a,key,n) )
CGfL::HalfByteToByte(Out,c.bit,c.len);
return (c.len+1)>>1;
}
/******************************************************************************/
// 名稱:SetKey
// 功能:由輸入密鑰串設(shè)置RSA密鑰和模n
// 參數(shù):KeyStr,ModStr為0結(jié)尾的密鑰串,對(duì)應(yīng)密鑰和模n
// 返回:設(shè)置成功返回true,否則返回false
// 備注:
// 更新:2003/1/25
// 作者:0200950原常青
/******************************************************************************/
bool CRsa::SetKey(char *KeyStr,char *ModStr)
{
int klen,nlen;
key = n = Zero;
CHECK_MSG( KeyStr && ModStr && KeyStr && (klen=strlen(KeyStr)) && (nlen=strlen(ModStr)) &&
klen<=nlen && BI.BuildBIFromStr(key,KeyStr,klen) && BI.BuildBIFromStr(n,ModStr,nlen),
"設(shè)置RSA密鑰出錯(cuò):空密鑰,或密鑰太長(zhǎng)!" )
return true;
}
/******************************************************************************/
// 名稱:GetKey
// 功能:獲取RSA密鑰對(duì)
// 參數(shù):
// 返回:獲取成功返回true,否則返回false
// 備注:如果p,q非空,請(qǐng)保證其為素?cái)?shù)。如果需要產(chǎn)生素?cái)?shù)p,q,請(qǐng)?jiān)谡{(diào)用前將p,q置0
// 更新:2003/1/25
// 作者:0200950原常青
/******************************************************************************/
bool CRsa::GetKey(BigInt &p,BigInt &q,BigInt &e,BigInt &d,BigInt &n,
UINT plen,UINT qlen,UINT elen)
{
BigInt p_1,q_1,n_1,tmp;
// 如果p,q=0,則產(chǎn)生素?cái)?shù)
if( !p.len )
CHECK( BI.GetPrime(p,plen) )
if( !q.len )
CHECK( BI.GetPrime(q,qlen) )
CHECK_MSG( p.len>4 && p.len<=BI_MAXLEN/4 && q.len>4 && q.len<=BI_MAXLEN/4 &&
elen>=max(p.len,q.len) && elen<=p.len+q.len, "長(zhǎng)度不在合法范圍之內(nèi)! " )
CHECK_MSG( BI.Cmp(p,q), "錯(cuò)誤:素?cái)?shù)p,q相同! " )
// 計(jì)算n
CHECK( BI.Mul(n,p,q) )
// 防止密鑰長(zhǎng)度超過N,以免造成死循環(huán)
if( elen>n.len )
elen = n.len;
p_1 = p; p_1.bit[0] -= 1;
q_1 = q; q_1.bit[0] -= 1;
CHECK( BI.Mul(n_1,p_1,q_1) )
while( true )
{
BI.RandVal(e,elen);
if( BI.Cmp(e,n)<0 && BI.Inverse(e,d,n_1,tmp) )
return true;
}
}
///////////////////////////////////////////////////////////////////////////////
// End of Files
///////////////////////////////////////////////////////////////////////////////
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -