首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

写了个帐号加密的小软件,代码共享了,来见见,有点意思

2013-07-11 
写了个帐号加密的小软件,代码共享了,来看看,有点意思//加密原理 ,理解这个^这个符号的作用,自己看代码吧ch

写了个帐号加密的小软件,代码共享了,来看看,有点意思
//加密原理 ,理解这个^这个符号的作用,自己看代码吧

char p[] = "this is test\n中文字符";
int nlen = strlen(p);
for (int i=0;i<nlen;i++)
{
p[i] ^= 0xFF;
}
for (int i=0;i<nlen;i++)
{
p[i] ^= 0xFF;
}




// strongbox.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "strongbox.h"
#include "stdio.h"
#include <direct.h>
#define MAX_LOADSTRING 100
#define  IDC_EDIT 10001

const char *g_key ="henry";
void mycode(char* p ,int nlen);

// 全局变量:
HINSTANCE hInst;// 当前实例
TCHAR szTitle[MAX_LOADSTRING];// 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];// 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOMMyRegisterClass(HINSTANCE hInstance);
BOOLInitInstance(HINSTANCE, int);
LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{

//加密原理
char p[] = "this is test\n中文字符";
/*int nlen = strlen(p);
for (int i=0;i<nlen;i++)
{
p[i] ^= 0xFF;
}
for (int i=0;i<nlen;i++)
{
p[i] ^= 0xFF;
}*/



/*int nlen = strlen(p);
int nlen_key = strlen(g_key);
for (int i=0;i<nlen;i++)
{
for (int j=0;j<nlen_key;j++)
{
p[i] ^= g_key[j];
}
}
for (int i=0;i<nlen;i++)
{
for (int j=0;j<nlen_key;j++)
{
p[i] ^= g_key[j];
}
}*/





char szFilePath[MAX_PATH];
if(GetModuleFileNameA(NULL,szFilePath,MAX_PATH)>0)
{
(*strrchr(szFilePath,'\\'))='\0';//丢掉文件名,得到路径   
}
_chdir(szFilePath);


 // TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;


// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_STRONGBOX, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow)) 
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_STRONGBOX);

// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0)) 
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
//  注释: 
//
//    仅当希望在已添加到 Windows 95 的
//    “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
//    才需要此函数及其用法。调用此函数
//    十分重要,这样应用程序就可以获得关联的
//   “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX); 

wcex.style= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc= (WNDPROC)WndProc;
wcex.cbClsExtra= 0;
wcex.cbWndExtra= 0;
wcex.hInstance= hInstance;
wcex.hIcon= LoadIcon(hInstance, (LPCTSTR)IDI_STRONGBOX);
wcex.hCursor= LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName= (LPCTSTR)IDC_STRONGBOX;
wcex.lpszClassName= szWindowClass;
wcex.hIconSm= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);
}

//
//   函数: InitInstance(HANDLE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释: 
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;


   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

HWND m_hwndedit = NULL;
HWND CreateEdit(HWND parentWnd)
{
RECT rct;
::GetClientRect(parentWnd,&rct);
HWND hEd=0;
hEd = CreateWindow(_T("EDIT"),
NULL,
WS_CHILD| WS_TABSTOP |WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_WANTRETURN|ES_AUTOVSCROLL,
0, 0, rct.right-rct.left, rct.bottom-rct.top, 
parentWnd, (HMENU)IDC_EDIT, 
(HINSTANCE) GetWindowLong(parentWnd, GWL_HINSTANCE), 
NULL);


FILE* fp = fopen("1.txt","rb");
if (fp==NULL)
{
SetWindowText(hEd,_T("输入需要加密的字符串,可以换行"));
}
else
{
fseek(fp,0,SEEK_END);
int nsize = ftell(fp);
fseek(fp,0,SEEK_SET);
char* p = new char[nsize];
fread(p,sizeof(char),nsize,fp);
mycode(p,nsize);

fclose(fp);


SetWindowText(hEd,LPCTSTR(p));
delete[] p;
}
return hEd;
}

void save_file()
{
int nlen = GetWindowTextLength(m_hwndedit)+1;
TCHAR* pchar  = new TCHAR[nlen];
::GetWindowText(m_hwndedit,pchar,nlen);
pchar[nlen-1]=0;
//OutputDebugString(pchar);
int nsize = nlen*sizeof(TCHAR);
char* p = (char *)pchar;
mycode(p,nsize);
FILE* fp = fopen("1.txt","wb");
fwrite(p,sizeof(char),nsize,fp);
fclose(fp);
delete[] pchar;
}

void mycode(char* p ,int nlen)
{
int nlen_key = strlen(g_key);
for (int i=0;i<nlen;i++)
{
for (int j=0;j<nlen_key;j++)
{
p[i] ^= g_key[j];
}
}
}

//
//  函数: WndProc(HWND, unsigned, WORD, LONG)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND- 处理应用程序菜单
//  WM_PAINT- 绘制主窗口
//  WM_DESTROY- 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message) 
{
case WM_CREATE:
{
m_hwndedit = CreateEdit(hWnd);
}
break;
case WM_SIZE:
{
int nWidth = LOWORD(lParam); // width of client area 
int nHeight = HIWORD(lParam); // height of client area 


::MoveWindow(m_hwndedit,0,0,nWidth-20,nHeight,TRUE);

}
break;
case WM_COMMAND:
wmId    = LOWORD(wParam); 
wmEvent = HIWORD(wParam); 
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
//DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
::MessageBox(hWnd,_T("CSDN 会员:henry3695 设计,qq:6102435 "),_T("说明"),MB_OK);
break;
case IDM_ENSAVE:
{
save_file();
}
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
TCHAR* pstr = _T("this is test!");
::TextOut(hdc,0,0,pstr,_tcslen(pstr));
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
save_file();
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// “关于”框的消息处理程序。
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}





项目下载地址,
http://download.csdn.net/download/henry3695/5670153
帐号太多了,自己写了个工具,加密一下帐号
网上的感觉没有源代码,不放心

大伙需要用的话,直接把g_key改一下就可以了,哈哈
用了都说好
[解决办法]
keepass, 应该有源代码:使用master password打开密码文件,文件也是加密了的。 只需要记住主密码即可。

[解决办法]
就一个异或, key 在代码里还是明文字符串, 岂不是很容易被破解? 只能防君子不防小人吧.
OpenSSL 里面有大量的加密算法源码.
------解决方案--------------------


这算法有些简单了吧?
[解决办法]
大家不要只盯着“加密”的算法,这是一个“如何使用WindowsAPI编写GUI应用程序”的例子。
[解决办法]
LZ太厉害了~~~
[解决办法]
不会写破解程序,不过手工破解不难。
[解决办法]
其实写破解程序也不难。

你这不过是个8位的key,有效密钥不过才256个.枚举一遍就行了。

你一个加密文件,分别用'\0'到'\xff'对所有字节进行异或,生成256个文件,然后人工筛选一下就行了。
[解决办法]

引用:
其实写破解程序也不难。

你这不过是个8位的key,有效密钥不过才256个.枚举一遍就行了。

你一个加密文件,分别用'\0'到'\xff'对所有字节进行异或,生成256个文件,然后人工筛选一下就行了。


key 不是 8 位, 是一个字符串 

const char *g_key ="henry";

这种明文的字符串, 用记事本打开 exe 文件都能看到...
[解决办法]
引用:
Quote: 引用:

其实写破解程序也不难。

你这不过是个8位的key,有效密钥不过才256个.枚举一遍就行了。

你一个加密文件,分别用'\0'到'\xff'对所有字节进行异或,生成256个文件,然后人工筛选一下就行了。


key 不是 8 位, 是一个字符串 

const char *g_key ="henry";

这种明文的字符串, 用记事本打开 exe 文件都能看到...


key分明就是8位,g_key中所有的字符都对每一个明文异或了一次:

    for (int i=0;i<nlen;i++)
    {
        for (int j=0;j<nlen_key;j++)
        {
            p[i] ^= g_key[j];
        }
    }

key就是:'h'^'e'^'n'^'r'^'y'
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

其实写破解程序也不难。

你这不过是个8位的key,有效密钥不过才256个.枚举一遍就行了。

你一个加密文件,分别用'\0'到'\xff'对所有字节进行异或,生成256个文件,然后人工筛选一下就行了。


key 不是 8 位, 是一个字符串 

const char *g_key ="henry";

这种明文的字符串, 用记事本打开 exe 文件都能看到...


key分明就是8位,g_key中所有的字符都对每一个明文异或了一次:

    for (int i=0;i<nlen;i++)
    {
        for (int j=0;j<nlen_key;j++)


        {
            p[i] ^= g_key[j];
        }
    }


key就是:'h'^'e'^'n'^'r'^'y'


你要这么说是 8 位就没法了, 但是这个密钥, 这样的 8 位, 是你枚举 256 次就能遍历完的么....
[解决办法]
p[i] = p[i] ^ g_key[0]^g_key[1]^g_key[2]^g_key[3]....^g_key[n]
     = p[i] ^ (g_key[0]^g_key[1]^g_key[2]^g_key[3]...^g_key[n])

注意异或运算的结合律。

我不需要找出,g_key这个字符串,我只要找出g_key[0]^g_key[1]^g_key[2]^g_key[3]^...^g_key[n]这个运算的结果,然后去与密文异或就可以了。

而这个结果,只是一个8位数据,一共256个,哪怕n=4294967296都没用。
[解决办法]
引用:
就一个异或, key 在代码里还是明文字符串, 岂不是很容易被破解? 只能防君子不防小人吧.
OpenSSL 里面有大量的加密算法源码.
源码我没看,如果是这位说的,异或加密还叫加密?
[解决办法]
引用:
Quote: 引用:

就一个异或, key 在代码里还是明文字符串, 岂不是很容易被破解? 只能防君子不防小人吧.
OpenSSL 里面有大量的加密算法源码.
源码我没看,如果是这位说的,异或加密还叫加密?


也不能这样说,用异或实现的加密也是有的,比如RC4。用异或实现加密有着明显的速度优势,但用异或加密有两条限制:
1:每个密钥只用来加密和解密各一次。
2:用来异或的数据来自一个周期足够长且难以破解的伪随机发生器。
[解决办法]
引用:
p[i] = p[i] ^ g_key[0]^g_key[1]^g_key[2]^g_key[3]....^g_key[n]
     = p[i] ^ (g_key[0]^g_key[1]^g_key[2]^g_key[3]...^g_key[n])

注意异或运算的结合律。

我不需要找出,g_key这个字符串,我只要找出g_key[0]^g_key[1]^g_key[2]^g_key[3]^...^g_key[n]这个运算的结果,然后去与密文异或就可以了。

而这个结果,只是一个8位数据,一共256个,哪怕n=4294967296都没用。


原来是这样! 我还以为它是 key 里面的第一个与明文的第一个异或, key 里面的第二个与明文的第二个异或, 这样一直往下的 .....
[解决办法]
尼玛,异或一个任意的字符串 跟 异或一个byte的结果是一样的。很容易就给你秒破了!!!
[解决办法]
MD5
[解决办法]
有意思的东西

热点排行