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

📄 largeint.h

📁 rsa算法/// ////
💻 H
字号:
// LargeInt.h
// 作者 pAnic 2005年9月22日。
// 大整数类的声明,包含了质数检查,随机数生成,以及RSA密钥生成及加密解密函数。
// 有问题请到
// http://blog.vckbase.com/panic 
// 留言。
//////////////////////////////////////////////////////////////////////////////


#if !defined(LARGEINT_HEADER)
#define LARGEINT_HEADER

#include <vector>

namespace panic
{
	//必须保证T_DWORD是4字节。
	typedef unsigned long T_DWORD;
	
	
	class CLargeInt  
	{
	public:
		//说明:
		//基本的操作函数之所以没有设置成运算符的重载,主要是因为,
		//大数运算的过程中,经常需要额外的参数,例如错位相加减的offset值。
		//以及某些额外的结果
		//例如,除法运算的商和余数。
		//为了代码尽量通用,都写成了静态成员函数。
		//运算符的重载可以通过对这些静态成员函数进一步封装来实现。
		
		//复制
		static void Copy(const CLargeInt& source,CLargeInt& target);
		
		//比较
		static bool LargerEqual(const CLargeInt& source,const CLargeInt& target,T_DWORD offset = 0);
		static bool Equal(const CLargeInt& source,const CLargeInt& target);
		
		//和T_DWORD类型交互的底层操作函数
		static void Mul(const CLargeInt& faciend,T_DWORD multiplier,CLargeInt& product);
		
		static void Div(const CLargeInt& dividend,T_DWORD divisor,CLargeInt& quotient,T_DWORD& residual);
		
		//移位:
		
		//右移一位,用来取代 /2 操作。
		static void RCR(CLargeInt& n);
		
		//左移一位,用来取代 *2 操作。
		static void RCL(CLargeInt& n);
		
		//CLargeInt类型底层操作函数,
		
		static void Add(const CLargeInt& augend,const CLargeInt& addend,CLargeInt& sum,T_DWORD offset = 0);
		
		static void Sub(const CLargeInt& minuend,const CLargeInt& subtrahend,CLargeInt& difference,T_DWORD offset = 0);
		
		static void Mul(const CLargeInt& faciend,const CLargeInt& multiplier,CLargeInt& product);
		
		static void Div(const CLargeInt& dividend,const CLargeInt& divisor,CLargeInt& quotient,CLargeInt& residual);
		
		static void ExpMod(const CLargeInt& source,const CLargeInt& exponent,const CLargeInt& modulo,CLargeInt& result);
		
		//高阶的测试:
		static bool RabinMillerTest(const CLargeInt& source,const CLargeInt& base);
		static bool Coprime(const CLargeInt &source,const CLargeInt &target);
		
		//RSA算法相关函数:
		static bool IsPrime(const CLargeInt &n);
		static void CreatePrime(CLargeInt &n);
		static bool RSACreate( const CLargeInt &p,const CLargeInt & q,const CLargeInt &e,CLargeInt &d,CLargeInt &n);		
		static void RSAEncode( const CLargeInt &n,const CLargeInt &d,const CLargeInt &m,CLargeInt &c);
		static void RSADecode( const CLargeInt &n,const CLargeInt &e,const CLargeInt &c,CLargeInt &m);
		
		//建立随机数。
		static void CreateRandom(CLargeInt &n,T_DWORD bitcount);
	public:
		CLargeInt(T_DWORD value = 0);
		CLargeInt(const char * str);
		CLargeInt(const CLargeInt& other);
		
		~CLargeInt();
	private:
		enum LIMIT{ LENGTH = 0x3FF,SMALLPRIMES = 5000};
		T_DWORD _len;
		mutable T_DWORD _data[LENGTH]; //之所以用 mutable 是因为需要在计算中获取指针,并且有时还需要在不改变数值的情况下修改某些数组元素。
		
		//辅助用的小质数表和相关的函数。
		static std::vector<T_DWORD> _smallPrimes;
		static void InitSmallPrimes(T_DWORD count = SMALLPRIMES);
		static bool SmallPrimeTest(const CLargeInt& n);
		
		
	public:
		
		//临时的打印函数,以16进制字符串形式在标准控制台上输出整个数字。
		void Print() const
		{
			printf("0x");
			for( int i = _len-1 ; i >= 0; i--)
			{
				char str[] = "%08X";
				str[2] = '0' + sizeof(T_DWORD) * 2;
				if( i != (_len-1) )printf(str,_data[i]);
				else printf("%X",_data[i]);
			}
			printf("\n");
		}
	};
}


#endif // LARGEINT_HEADER

⌨️ 快捷键说明

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