⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsa.cpp

📁 经典算法全集:DES算法
💻 CPP
字号:
// 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
//	功能:加密
//  参数:len为加密内容的长度;KeyStr,ModStr为0结尾的密钥串,用于设置RSA密钥和模n
//	返回:加密(解密)后的密文(明文)长度
//  备注:
//	更新: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) )
    // 由输入构造一个大数a
	CHECK_MSG( BI.BuildBIFromByte(a,In,len) && a.len <= n.len, "错误:RSA加密(解密)的内容过长!" )
	// 加密(解密)
	CHECK( BI.PowMod(c,a,key,n) )
    CGfL::HalfByteToByte(Out,c.bit,c.len);

	return	(c.len+1)>>1;
}
/******************************************************************************/
//	名称:SetKey
//	功能:由输入密钥串设置RSA密钥和模n
//  参数:KeyStr,ModStr为0结尾的密钥串,对应密钥和模n
//	返回:设置成功返回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), 
			   "设置RSA密钥出错:空密钥,或密钥太长!" )

	return true;
}
/******************************************************************************/
//	名称:GetKey
//	功能:获取RSA密钥对
//  参数:
//	返回:获取成功返回true,否则返回false
//  备注:如果p,q非空,请保证其为素数。如果需要产生素数p,q,请在调用前将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,则产生素数
	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, "长度不在合法范围之内! " )
	CHECK_MSG( BI.Cmp(p,q), "错误:素数p,q相同!  " )
    // 计算n
	CHECK( BI.Mul(n,p,q) )
	// 防止密钥长度超过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
///////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -