📄 rsa.cpp
字号:
// RSA.cpp
//
#include "stdafx.h"
#include "EC1Assignment.h"
#include "EC1AssignmentDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
void CEC1AssignmentDlg::Execute()
{
CString str;
//clear values window
m_values.SetWindowText("");
DumpNotes(CString("\n*********************************"));
DumpNotes(CString("\n正在生成密钥..."));
//Step-1 Generating Random Numbers
GeneratePrimeNumbers();
//Step-2 calculating n=p*q
m_n = m_Prime1 * m_Prime2;
m_prime1=m_Prime1;
m_prime2=m_Prime2;
Invalidate();
str.Format("\n 'n' 的值是 %d",m_n);
DumpNotes(str);
WriteValues(str);
//Step-3 0=(p-1)(q-1)
m_Undef = (m_Prime1-1) * (m_Prime2-1);
//Step-4 Selecting 'e'
SelectE();
//m_e=17;
//Step-5 Calculate 'd'
CalculateD();
//Displaying private and public keys
//(1) Public key KU={e,n}
DumpNotes(CString("\n"));
str.Format("{%d, %d}",m_e,m_n);
DumpNotes(CString("\n公钥 KU="));
WriteValues(CString("\n公钥 KU="));
DumpNotes(str);
WriteValues(str);
m_ku.SetWindowText(str);
//(2) Private key KU={d,n}
str.Format("{%d, %d}",m_d,m_n);
DumpNotes(CString("\n私钥 KR="));
WriteValues(CString("\n私钥 KR="));
DumpNotes(str);
WriteValues(str);
m_kr.SetWindowText(str);
}
//Step-4 Selecting a value for 'e' such that 'e' is relative prime
//to m_Undef
void CEC1AssignmentDlg::SelectE()
{
CString str;
///algo: EUCLID
str.Format("\n>正在选择 'e'...");
DumpNotes(str);
for(float i=2;i<100000;i++)
{
if(IsRelativePrime((float)m_Undef,(float)i))
{
m_e=(long)i;
str.Format("\n 'e' 的值是 %d",m_e);
DumpNotes(str);
WriteValues(str);
return;
}
}
}
bool CEC1AssignmentDlg::IsRelativePrime(float X,float Y)
{
float R;
///algo: EUCLID
//Input: X,Y
if(X<Y)//if X is smaller then swap the values
{
X=X+Y;
Y=X-Y;
X=X-Y;
}
//X is always great than Y at this point
for(;;)
{
if(Y==0)
break;
R=fmod(X,Y);
X=Y;
Y=R;
}
if(X != 1)
return false;
else
return true;//relatively prime
}
//STEP-5
void CEC1AssignmentDlg::CalculateD()
{
float d;
long d_dash;
CString str;
str.Format("\n>正在计算 'd'...");
DumpNotes(str);
for(float k=1;k<100000;k++)
{
d=(m_Undef*k+1)/m_e;
d_dash = (long)((m_Undef*k+1)/m_e);
if(d == d_dash)
{
m_d=d;
str.Format("\n 'd' 的值是 %d",m_d);
DumpNotes(str);
WriteValues(str);
return;
}
}
}
//trancate all MSB which are ZEROS
void CEC1AssignmentDlg::GetOnlyProperBits(char *bits)
{
char tmpb[40];
int ti=0;
//reach till a non zero bit
for(int i=0;i<strlen(bits);i++)
{
if(bits[i]=='1') break;
}
for(;i<strlen(bits);i++)
{
tmpb[ti++]=bits[i];
tmpb[ti]='\0';
}
strcpy(bits,tmpb);
}
//decimal to binary conversion function
void CEC1AssignmentDlg::D_to_B(long no,long noOfBits, char *ou)
{
long y = noOfBits;//8 bits
strcpy(ou,"");
for(long i=0;i<y;i++)
{
int rem=no%2;
no=no/2;
char st[5];
sprintf(st,"%d",rem);
strcat(ou,st);
//if(no==0) break;
}//X of for loop...
strrev(ou);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -