Ejemplo n.º 1
0
/// <summary>
/// 获取注册表值
/// </summary>
/// <param name="lpValueKey">键名</param>
/// <returns>键值</returns>
CString CCommon::GetReg(CString lpValueKey)
{
	unsigned char buffer[255]={0};
	unsigned long length;
	unsigned long type;
	HKEY hKey;
	LPCTSTR data_Set= _T("SOFTWARE\\Microsoft");

	RegOpenKey(HKEY_LOCAL_MACHINE,data_Set,&hKey);
	RegQueryValueEx(hKey,lpValueKey,NULL,&type,buffer,&length);
	RegCloseKey(hKey);

	CString ret;
	ret = Char2CString((char *)buffer);

	int Count;
	Count = atoi((const char*)buffer);
	if(Count == 0)
	{
		RegCreateKey(HKEY_LOCAL_MACHINE,data_Set,&hKey);
		RegSetValueEx(hKey,lpValueKey,0,REG_SZ,(const unsigned char *) "0",1);
		RegCloseKey(hKey);

		return "0";
	}

	return ret;
}
Ejemplo n.º 2
0
BOOL CUserLoginDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	
	HICON m_hIcon;
	m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);//修改对话框的图标
	SetIcon(m_hIcon,TRUE);


	// TODO:  在此添加额外的初始化
	ModifyStyleEx(0,WS_EX_APPWINDOW);
	GetClientRect(&m_rect);
	SetBackgroundColor(RGB(247,252,255));
	//初始化全局变量g_CurrentDir(当前目录绝对路径)
	GetCurrentDirectory(MAX_PATH,g_CurrentDir.GetBuffer(MAX_PATH));
	g_CurrentDir.ReleaseBuffer(); 
	//提取之前保存的用户信息,如果有的话,利用sqlite数据库
	sqlite3* UserInfodb = NULL;
	//打开数据库,不存在则创建
	if(sqlite3_open("User\\UserInfo.db3", &UserInfodb) != 0)
	{
		MessageBox(L"打开用户信息列表失败",L"初始化",MB_ICONERROR);
		return FALSE;
	}
	//创建用户信息表格,已存在则创建失败,错误信息保存在szErrmsg中
	char *sqlcmd = "CREATE TABLE UserInfo(\
				     UserName string PRIMARY KEY,\
					 PassWord string )";

	char *szErrmsg = NULL;
	sqlite3_exec(UserInfodb,sqlcmd,0,0,&szErrmsg);
	//查询用户数据
	char *zsql = "SELECT * FROM UserInfo";
	char **szResult = NULL;
	int nRow = 0;
	int nColumn = 0;
	sqlite3_get_table(UserInfodb,zsql,&szResult,&nRow,&nColumn,&szErrmsg);

	char username[MAX_USERNAMELEN] = {0};
	char passwordEncodeHex[500] = {0};
	char *passwordEncode = NULL;
	memset(username,0,MAX_USERNAMELEN);
	memset(passwordEncodeHex,0,500);
	int l = strlen(szResult[3]);
	if(nRow)
	{
		memcpy(username,szResult[2],strlen(szResult[2]));
		memcpy(passwordEncodeHex,szResult[3],strlen(szResult[3]));
	}

	m_UserIniFilePath = g_CurrentDir;
	m_UserIniFilePath+=L"\\config\\config.ini";
	m_UserName = Char2CString(username);
	m_CheckPW=GetPrivateProfileInt(L"UserSetting",L"SavePassword",0,m_UserIniFilePath);
	if(strlen(passwordEncodeHex))
	{
		//如果密码不为空,则解密
		char *userKey = "1234567887654321"; // 原始密钥128位,16字节
		CString sDataLen;
		GetPrivateProfileString(L"UserSetting",L"PasswordEnCodeLen",L"",sDataLen.GetBuffer(10),10,m_UserIniFilePath);
		int datalen = _wtoi(sDataLen);
		char keyDecode[256]; //解密密钥
		char *PassWordDecoded = NULL;
		//char *dataSrc = NULL; //补齐的数据
		//将转为16进制串的密码转为初始状态

		int L=strlen(passwordEncodeHex);
		passwordEncode = (char*)malloc(sizeof(char)*(L));
		memset(passwordEncode,0,L);
		int  x;
		for(int i=0;i<L/2;i++) 
		{		
			sscanf(passwordEncodeHex+i*2,"%02X",&x);
			passwordEncode[i]=(char)x;//(x&0xFFu);
		}
		unsigned char in[16];
		unsigned char out[16];
		PassWordDecoded = (char*)malloc(sizeof(char)*datalen);
		if(!PassWordDecoded)
		{
			return -1;
		}
		memset(PassWordDecoded,0,datalen);
		//设置解密密钥
		if(0!=AES_set_decrypt_key((const unsigned char *)userKey,128,(AES_KEY *)keyDecode))
		{
			return -1;
		}
		//循环加密,以16字节为单位
		int count = datalen/16;
		//解密
		for(int i = 0;i<count;++i)
		{
			memset(in, 0, 16);             
			memset(out, 0, 16); 	
			memcpy(in,passwordEncode+i*16,16);
			AES_ecb_encrypt(in,out,(AES_KEY *)keyDecode,AES_DECRYPT);
			memcpy(PassWordDecoded+i*16,out,16);
		}
		//初始化密码
		m_PassWord = Char2CString(PassWordDecoded);
		//释放资源
		free(passwordEncode);
		passwordEncode = NULL;
		free(PassWordDecoded);
		PassWordDecoded = NULL;
	}
	//关闭数据库
	sqlite3_close(UserInfodb);
	UserInfodb = NULL;	
	UpdateData(FALSE);
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}