<html>

<head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Population</title>
</head>

<body>



<p align="left"><font size="6" color="#FF0000"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
RSA&nbsp; Encryption&amp;Decryption</b></font></p>

<div align="left">
  <pre><b><font color="#ff0000" size="5">A.<span lang="en-ca">Second</span> Edition</font></b></pre>
</div>
<div align="left">
  <pre><b>This is the <span lang="en-ca">second </span>edition of RSA encryption and decryption program. and <span lang="en-ca">I find out and correct the mistakes </span></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>of GCD.</b></span></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">B</span>.</font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>Idea of program</b></font></span></pre>
</div>
<div align="left">
  <pre><b>1¡£ Basic idea: </b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>Last edition cannot find correct GCD if two number are divisible. Now I made it a special case among all others.</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>In this edition, I add a new function &quot;linearCombination&quot; which gives coefficients of these two numbers to</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>form a linear equations with their GCD.</b></span></pre>
</div>
<div align="left">
  <pre><b>2¡£ Program design: </b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>I made a internal method &quot;internalCalculation&quot; to split function &quot;inverse&quot;.</b></span></pre>
</div>
<div align="left">
  <blockquote>
    <blockquote>
  <pre><b> </b></pre>
    </blockquote>
  </blockquote>
  <pre><b>4¡£ Further improvement£º</b></pre>
  <pre><b>I plan to find two very big prime number to use as &quot;Public Key&quot;, so I write a simple program to search for </b></pre>
  <pre><b>such big primes. <a href="#prime">see here</a>:</b></pre>
  <pre>¡¡</pre>
</div>
<pre>#include &lt;iostream&gt;

using namespace std;

typedef unsigned long ulong;

const ulong Prime1 = 43;
const ulong Prime2 = 59;
const ulong DefaultExp = 13;


enum DivName
{Quotient, Remainder};

class RSA
{
private:
	int counter;
	int exp;
	long divident;
	long divisor;
	ulong enModular;
	ulong deModular;
	ulong deExp;
	ulong gcd;
	long temp[100][2];
	bool testExp(ulong e);
	void initialize(ulong e= DefaultExp);
	void internalCalculate(long number, long mod);
public:
	RSA();
	RSA(ulong e);
	void setExp(ulong e);
	void linearCombination(long number, long mod);
	long inverse(long number, long mod);
	ulong GCD(long number, long mod);
	ulong modularExp(ulong base, ulong exp, ulong mod);
	ulong encryption(ulong input);
	ulong decryption(ulong input);
};

int main()
{
	int a, b, i=0;
	RSA R;
	while (i&lt;5)
	{
		cin&gt;&gt;a;//&gt;&gt;b;
		cout&lt;&lt;R.decryption(a)&lt;&lt;endl;
		//cout&lt;&lt;R.decryption(R.encryption(a))&lt;&lt;endl;
		//R.linearCombination(a, b);
		//cout&lt;&lt;R.GCD(a, b)&lt;&lt;endl;
		//cout&lt;&lt;R.inverse(a, b)&lt;&lt;endl;
		i++;
	}
	return 0;
}

void RSA::linearCombination(long number, long mod)
{

	internalCalculate(number, mod);
	cout&lt;&lt;&quot;\nThe linear combination is: &quot;&lt;&lt;number&lt;&lt;&quot; x &quot;&lt;&lt;divident&lt;&lt;&quot; - &quot;;
	cout&lt;&lt;&quot; &quot;&lt;&lt;divisor&lt;&lt;&quot; x &quot;&lt;&lt;mod&lt;&lt;&quot; = &quot;&lt;&lt;gcd&lt;&lt;endl; 
}

void RSA::setExp(ulong e)
{
	if (!testExp(e))
	{
		cout&lt;&lt;&quot;Input exponent is not relative prime to modular!\n&quot;;
		cout&lt;&lt;&quot;Default exponent is used!\n&quot;;
		exp = DefaultExp;
	}
	else
	{
		exp = e;	
	}
	deExp = inverse(exp, deModular);
}

ulong RSA::encryption(ulong input)
{
	return modularExp(input, exp, enModular);
}

ulong RSA::decryption(ulong input)
{
	return modularExp(input, deExp, enModular);
}

void RSA::initialize(ulong e)
{
	counter =0;
	enModular = Prime1* Prime2;
	deModular = (Prime1 -1)*(Prime2 -1);
	setExp(e);	
}

RSA::RSA(ulong e)
{
	initialize(e);
}


bool RSA::testExp(ulong e)
{
	return GCD(e, deModular)==1;
}

RSA::RSA()
{
	initialize();
}


ulong RSA::modularExp(ulong base, ulong exp, ulong mod)
{
	ulong shifts = exp; //in order to shift to test each bit
	ulong test;   //mask and also temp result to see bit value
	ulong power; //the base modular 
	ulong result =1;  //final result
	power = base % mod;

	for (int i=0; i&lt; 32; i++)
	{
		test =1;
		test &amp;= shifts;  //bit-and assignment
		if (test)  //if it is 1, then result times power
		{
			result *= power;
			result %= mod;
		}
		power *= power;
		power %= mod;
		shifts&gt;&gt;= 1;
		if (shifts==0)
		{
			break;
		}
	}
	return result;
}




ulong RSA::GCD(long number, long mod)
{
	div_t result;
	long tempDivident, tempDivisor;
	tempDivident = number;
	tempDivisor = mod;
	counter = 0;

	result = div(tempDivident, tempDivisor);
	
	//if they are not relative prime
	if (result.rem == 0)
	{
		temp[counter][Quotient] = result.quot;
		temp[counter][Remainder] = result.rem;
		counter++;
		gcd = mod;
		return gcd;
	}
	
	while (result.rem != 0)
	{			
		temp[counter][Quotient] = result.quot;
		temp[counter][Remainder] = result.rem;
		counter++;
		tempDivident = tempDivisor;
		tempDivisor = result.rem;	
		result = div(tempDivident, tempDivisor);
	}
	gcd = temp[counter-1][Remainder];
	return gcd;

}

void RSA::internalCalculate(long number, long mod)
{
	long scale =0;
	GCD(number, mod);
	//these are quotient for 
	counter--;
	if (counter ==0&amp;&amp;temp[counter][Remainder] ==0)//this is mod|number!!!
	{
		divident = 1;
		divisor = divisor =temp[counter][Quotient] -1;
		return;
	}
	divident = 1;
	divisor = temp[counter][Quotient];
	
	while (counter&gt;0)
	{
		scale = -1 * divisor;
		divisor = temp[counter-1][Quotient]* scale - divident;
		divident = scale;
		counter--;
	}
}


long RSA::inverse(long number, long mod)
{
	//counter =0; //initialize 

	internalCalculate(number, mod);
	if (gcd == 1)
	{
		

		return divident;
	}
	else
	{
		cout&lt;&lt;&quot;\nThese two number are not relative prime!&quot;&lt;&lt;endl;
		return 0;
	}
}


			
			</pre>
<pre>
</pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>
<pre></pre>

<p>¡¡          


</p>

<p>¡¡</p>

<p><font color="#FF0000"><a name="prime"></a>The following is a small silly 
program to search for all prime numbers. It use the simplest algorithms, so</font></p>

<p><font color="#FF0000">it runs hours to finish. I simply save every prime 
number I find in an array and future number just test </font></p>

<p><font color="#FF0000">if it is divisable by the prime in array. And as the 
factor of a composite is less or equal to its square </font></p>

<p><font color="#FF0000">root, so it can save some time.</font></p>

<pre>#include &lt;iostream&gt;
#include &lt;cmath&gt;

using namespace std;

typedef unsigned long ulong;

const ulong MaxNum = 0xFFFFFFFE;

ulong array[59999999];

ulong counter =0;

bool test(ulong number)
{
	ulong temp;
	temp = sqrt(number);
	for (int i =0; i&lt;counter; i++)
	{		
		if (array[i]&gt;temp+1&amp;&amp;number%array[i]==0)
		{
			return false;
		}
	}
	array[counter] = number;
	counter++;
	return true;
}

void addPrime(ulong prime)
{
	array[counter] = prime;
	counter++;
}

void initialize()
{
	addPrime(2);
	//addPrime(3);
}

void display()
{
	for (int i=0; i&lt;counter; i++)
	{
		cout&lt;&lt;&quot;Prime no.&quot;&lt;&lt;i&lt;&lt;&quot; is &quot;&lt;&lt;array[i]&lt;&lt;endl;
	}
}
	


int main()
{
	ulong i =2;
	initialize();
	
	while (i&lt;MaxNum)
	{
		test(i);
	
		i++;
	}
	display();

	return 0;
}
			



</pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                                   
&nbsp;&nbsp;&nbsp; <a href="WhoAmI.htm">                  







                       <img src="picture/back.gif" style="border: medium none" alt="back.gif (341 bytes)" width="32" height="35"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="index.htm"><img src="picture/up.gif" style="border: medium none" alt="up.gif (335 bytes)" width="35" height="32"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                         
<img src="picture/next.gif" style="border: medium none" alt="next.gif (337 bytes)" width="32" height="35">          


</p>

</body>

</html>