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

📄 rsautildlg.cpp

📁 RSA 高级实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -