📄 rsautildlg.cpp
字号:
m_bCancelGen = false;
m_nProcessingPrivate = 0;
m_dwProcessBeginTick = GetTickCount();
CString str;
int error;
m_bBackgroundCalculating = false;
//Ctrl + Alt
if ((GetAsyncKeyState(VK_LCONTROL) & 0x8000)
&&
(GetAsyncKeyState(VK_LMENU) & 0x8000)
&&
nKeySize >= 2048)
{
m_bBackgroundCalculating = true;
ShowWindow(SW_MINIMIZE);
}
_try_next_key:
m_nGenProcessRetryCount = 0;
int nResult;
do
{
m_nGenProcessRetryCount++;
nResult = m_rsa.RsaPrimesGen(nKeySize, e.AsInt(), _GenProcessing, this, &error);
if (nResult)
{
nResult = m_rsa.RsaKeyGen(e.AsInt(), _GenProcessing, this, &error);
if (nResult)
{
BYTE by1[8192];
BYTE by2[8192];
for (int i = 0; i < sizeof(by1); i++)
{
by1[i] = i & 0xff;
}
int bytes = BITS2BYTES(bnBits(&m_rsa.n));
bytes = min(bytes, sizeof(by1));
CBigNumber bn;
m_rsa.rsaPrivateEncrypt(&bn, by1, bytes - 8);
memset(by2, 0, sizeof(by2));
nResult = m_rsa.rsaPublicDecrypt(by2, sizeof(by2), &bn) >= 0;
nResult = 0 == memcmp(by1, by2, bytes - 8);
}
}
}
while(!nResult && !m_bCancelGen);
int nTicks = GetTickCount() - m_dwProcessBeginTick;
if (nResult)
{
OnButtonSaveToDb();
_ReformatOutputString(m_strPrimeP, m_rsa.p);
_ReformatOutputString(m_strPrimeQ, m_rsa.q);
_ReformatOutputString(m_strKeyN, m_rsa.n);
_ReformatOutputString(m_strPrivateD, m_rsa.d);
str.Format("Done. (%d.%d s), primes tested = %d, primes-per-second = %d", nTicks / 1000, nTicks % 1000, m_nProcessingPrivate, m_nProcessingPrivate * 1000 / nTicks);
m_strMessage = str;
UpdateData(false);
if (m_bBackgroundCalculating)
{
goto _try_next_key;
}
}
else
{
str.Format("Error = %d! (%d.%d s)", error, nTicks / 1000, nTicks % 1000);
m_strMessage = str;
}
m_staticMessage.SetWindowText(str);
UpdateData(false);
m_btnGenerate.SetWindowText("Generate now !");
m_bGenWorking = false;
m_bBackgroundCalculating = false;
}
void CRSAUtilDlg::OnButtonCalculateND()
{
UpdateData();
m_rsa.p.StringHexFrom(m_strPrimeP);
m_rsa.q.StringHexFrom(m_strPrimeQ);
if (m_rsa.p.GetBits() < 64)
{
m_strPrivateD = "Invalidate prime P, bits(P) >= 64";
UpdateData(false);
return;
}
if (m_rsa.q.GetBits() < 64)
{
m_strPrivateD = "Invalidate prime Q, bits(Q) >= 64";
UpdateData(false);
return;
}
CBigNumber e;
if (!_GetPublicE(e))
{
m_strPrivateD =
"Public exponent is not relatively prime to (p-1)(q-1)!\n"
"Try again with other primes or choose a different value for E.";
UpdateData(false);
return;
}
CString str;
int error = 0;
int nResult = m_rsa.RsaKeyGen(e.AsInt(), _GenProcessing, this, &error);
if (nResult)
{
_ReformatOutputString(m_strKeyN, m_rsa.n);
_ReformatOutputString(m_strPrivateD, m_rsa.d);
str.Format("Done. N && D are OK");
m_strMessage = str;
}
else
{
str.Format("Error = %d!", error);
m_strMessage = str;
}
m_staticMessage.SetWindowText(str);
UpdateData(false);
}
BOOL CRSAUtilDlg::_ReformatOutputString(CString& str, const CBigNumber& b)
{
UpdateData();
int nSize = 1024 * 16;
char* szBuffer = new char [1024 * 16];
switch(m_nCombViewAs)
{
case 0: //16
b.ToStringHex(szBuffer, nSize);
break;
case 1: //10
b.ToStringDec(szBuffer, nSize);
break;
case 2: //C-String
b.ToStringC(szBuffer, nSize);
break;
}
str = szBuffer;
delete szBuffer;
UpdateData(false);
return true;
}
void CRSAUtilDlg::OnSelchangeComboViewAs()
{
UpdateData();
_ReformatOutputString(m_strPrimeP, m_rsa.p);
_ReformatOutputString(m_strPrimeQ, m_rsa.q);
_ReformatOutputString(m_strKeyN, m_rsa.n);
_ReformatOutputString(m_strPrivateD, m_rsa.d);
UpdateData(false);
}
static void _AppendString(CString& str, const char* name, const char* szBuffer)
{
CString strTemp;
strTemp.Format("static BYTE s_byte_%s[] = ", name); str += strTemp;
int len = strlen(szBuffer);
for (int i = 0; i < len / 64 + 1; i++)
{
int nUsedLen = min(64, len - i * 64);
if (nUsedLen)
{
char szTemp[128];
memcpy(szTemp, szBuffer + i * 64, nUsedLen);
szTemp[nUsedLen] = 0;
str += "\\\r\n\t\"";
str += szTemp;
str += "\"";
}
}
str += ";\r\n";
}
BOOL CRSAUtilDlg::_BuildStringC(CString& str)
{
char szBuffer[1024 * 16];
m_rsa.p.ToStringC(szBuffer, sizeof(szBuffer));
_AppendString(str, "p", szBuffer);
m_rsa.q.ToStringC(szBuffer, sizeof(szBuffer));
_AppendString(str, "q", szBuffer);
m_rsa.n.ToStringC(szBuffer, sizeof(szBuffer));
_AppendString(str, "n", szBuffer);
m_rsa.d.ToStringC(szBuffer, sizeof(szBuffer));
_AppendString(str, "d", szBuffer);
m_rsa.e.ToStringC(szBuffer, sizeof(szBuffer));
_AppendString(str, "e", szBuffer);
m_rsa.u.ToStringC(szBuffer, sizeof(szBuffer));
_AppendString(str, "u", szBuffer);
return true;
}
void CRSAUtilDlg::OnButtonCStringToClipboard()
{
CString str;
_BuildStringC(str);
if (!OpenClipboard())
{
m_staticRandomMessage.SetWindowText("can NOT open clipboard!");
return;
}
HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, str.GetLength() + 1);
if (hglbCopy == NULL)
{
m_staticRandomMessage.SetWindowText("Out of memory!");
CloseClipboard();
return;
}
// Lock the handle and copy the text to the buffer.
PVOID pv = GlobalLock(hglbCopy);
memcpy(pv, PCSTR(str), str.GetLength() + 1);
GlobalUnlock(hglbCopy);
// Place the handle on the clipboard.
SetClipboardData(CF_TEXT, hglbCopy);
CloseClipboard();
}
void CRSAUtilDlg::OnChangeEditMessageM()
{
UpdateData();
UpdateData(false);
}
#include "RSA.h"
void CRSAUtilDlg::OnButtonEncrypt()
{
UpdateData();
CBigNumber b;
m_pbDE.SetRange(0, 100);
DWORD dwTicks = GetTickCount();
for (int i = 0; i < m_nEncryptionDecryptionTestTimes; i++)
{
//m_rsa.rsaTestPrivateE(&b, (const PBYTE)PCSTR(m_strMessageM), m_strMessageM.GetLength());
m_rsa.rsaPrivateEncrypt(&b, (const PBYTE)PCSTR(m_strMessageM), m_strMessageM.GetLength());
m_pbDE.SetPos(i * 100 / m_nEncryptionDecryptionTestTimes);
};
dwTicks = GetTickCount() - dwTicks + 1;
m_pbDE.SetPos(0);
_ReformatOutputString(m_strMessageC, b);
m_strMessage.Format(
"Encryption %d times, used %d.%d seconds, EPS = %d",
m_nEncryptionDecryptionTestTimes,
dwTicks / 1000, dwTicks % 1000,
m_nEncryptionDecryptionTestTimes * 1000 / dwTicks);
UpdateData(false);
}
void CRSAUtilDlg::OnButtonDecrypt()
{
UpdateData();
CBigNumber cipher;
cipher.StringHexFrom(m_strMessageC);
BYTE by[8192];
m_pbDE.SetRange(0, 100);
DWORD dwTicks = GetTickCount();
for (int i = 0; i < m_nEncryptionDecryptionTestTimes; i++)
{
memset(by, 0, sizeof(by));
//int n = m_rsa.rsaTestPublicD(by, sizeof(by), &cipher);
int n = m_rsa.rsaPublicDecrypt(by, sizeof(by), &cipher);
m_pbDE.SetPos(i * 100 / m_nEncryptionDecryptionTestTimes);
}
dwTicks = GetTickCount() - dwTicks + 1;
m_pbDE.SetPos(0);
m_strMessageC = by;
m_strMessage.Format(
"Decryption %d times, used %d.%d seconds, DPS = %d",
m_nEncryptionDecryptionTestTimes,
dwTicks / 1000, dwTicks % 1000,
m_nEncryptionDecryptionTestTimes * 1000 / dwTicks);
UpdateData(false);
}
void CRSAUtilDlg::OnButtonSaveToDb()
{
UpdateData();
int nKeySize = atoi(m_strKeySize);
if (nKeySize < MIN_KEY_SIZE || nKeySize > MAX_KEY_SIZE)
{
AfxMessageBox("Key Size must between 512 -> 4096");
return;
}
CString strFileName;
CString strFullName;
strFileName.Format("%s.%04d.txt", c_str_db_base_name, nKeySize);
strFullName = m_strAppPath + strFileName;
CTime time;
time = time.GetCurrentTime();
FILE* fp;
fp = fopen(strFullName, "rb+");
if (NULL == fp)
{
fp = fopen(strFullName, "wb");
if (NULL == fp)
{
AfxMessageBox(CString("can not open Database file: ") + strFullName);
return;
}
fprintf(fp, "//[+]------------------------------------------------------------------[+]\n");
fprintf(fp, "// | RSA Utility V(1.00) by aSprite 2004 |\n");
fprintf(fp, "// | |\n");
fprintf(fp, "// | File Created on: %04d-%02d-%02d %02d-%02d-%02d |\n", time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
fprintf(fp, "//[+]------------------------------------------------------------------[+]\n");
}
fseek(fp, 0, 2);
CString str;
_BuildStringC(str);
fprintf(fp, "\n\n");
fprintf(fp, "//[+]------------------------------------------------------------------[+]\n");
fprintf(fp, "// | Key created on: %04d-%02d-%02d %02d-%02d-%02d |\n", time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
fprintf(fp, "//[+]------------------------------------------------------------------[+]\n");
fwrite(str, 1, str.GetLength(), fp);
fclose(fp);
str.Format("Key has been saved in file: %s", strFileName);
m_staticMessage.SetWindowText(str);
return;
}
void CRSAUtilDlg::OnClose()
{
if (m_bGenWorking)
{
m_bCancelGen = true;
}
CDialog::OnClose();
}
void CRSAUtilDlg::OnOK()
{
if (m_bGenWorking)
{
m_bCancelGen = true;
}
CDialog::OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -