zoukankan      html  css  js  c++  java
  • MD5 & SHA1

    首先是MD5 

    #define SECTION 4
    #define GROUPSIZE 16
    
    
    #define F(X,Y,Z) (X&Y)|((~X)&Z)
    #define G(X,Y,Z) (X&Z)|(Y&(~Z))
    #define H(X,Y,Z) X^Y^Z
    #define I(X,Y,Z) Y^(X|(~Z))
    
    #define LOOP_LEFT_MOVE(x,y)  (x<<y | x>>(32-y))
    
    #define FF(a,b,c,d,mj,s,ti)  LOOP_LEFT_MOVE(a + F(b, c, d) + mj + ti,s)+b
    #define GG(a,b,c,d,mj,s,ti)  LOOP_LEFT_MOVE(a + G(b, c, d) + mj + ti,s)+b
    #define HH(a,b,c,d,mj,s,ti)  LOOP_LEFT_MOVE(a + H(b, c, d) + mj + ti,s)+b
    #define II(a,b,c,d,mj,s,ti)  LOOP_LEFT_MOVE(a + I(b, c, d) + mj + ti,s)+b
    
    void GetFileDirectory(TCHAR File[MAX_PATH], OUT TCHAR RDirectory[MAX_PATH]);
    void GetFileNameWithoutExtension(TCHAR File[MAX_PATH], OUT TCHAR filename[MAX_PATH]);
    // MD5.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "windows.h"
    #include "Header.h"
    
    DWORD A = 0X67452301;
    DWORD B = 0XEFCDAB89;
    DWORD C = 0X98BADCFE;
    DWORD D = 0X10325476;
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
    
        //------------------------------
        
        DWORD groups = 0;
        //-----------------------------
        TCHAR szBuffer[MAX_PATH] = { 0 };
        OPENFILENAME ofn = { 0 };
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = NULL;
        ofn.lpstrFilter = _T("TXT文件(*.txt)*.txt所有文件(*.*)*.*");//要选择的文件后缀   
        ofn.lpstrInitialDir = _T("D:\");//默认的文件路径   
        ofn.lpstrFile = szBuffer;//存放文件的缓冲区   
        ofn.nMaxFile = sizeof(szBuffer) / sizeof(*szBuffer);
        ofn.nFilterIndex = 0;
        ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;//标志如果是多选要加上OFN_ALLOWMULTISELECT  
        BOOL bSel = GetOpenFileName(&ofn);
        HANDLE hFile = CreateFile(szBuffer, GENERIC_ALL, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0);
        int i = GetLastError();
        DWORD FileSizeHigh;
        DWORD FileSizeLow = GetFileSize(hFile, &FileSizeHigh);
    
        PBYTE pFile = (PBYTE)malloc((FileSizeLow / 64 + 2) * 64);
        DWORD fileRTemp;
        ReadFile(hFile, pFile, FileSizeLow,&fileRTemp, 0);
        if (FileSizeHigh == 0)
        {
            
            PBYTE pFileEnd = pFile + FileSizeLow;
            if (FileSizeLow % 64 != 56)
            {
                if (FileSizeLow % 64 < 56)
                {
                    memset(pFileEnd, 0, 56 - FileSizeLow % 64);
                    *pFileEnd = *pFileEnd | 0x80;
                    pFileEnd += 56 - FileSizeLow % 64;
                    groups = FileSizeLow / 64 + 1;
                }
                else
                {
                    memset(pFileEnd, 0, 64 - FileSizeLow % 64 + 56);
                    *pFileEnd = *pFileEnd | 0x80;
                    pFileEnd += 64 - FileSizeLow % 64 + 56;
                    groups = FileSizeLow / 64 + 2;
                }
            }
            else
            {
                groups = FileSizeLow / 64 + 1;
            }
            PDWORD64 temp = (PDWORD64)pFileEnd;
            *temp = FileSizeLow * 8;
        }
        else
        {
    
        }
        DWORD index = 0;
        for (; index < groups; index++)
        {
            DWORD a = A, b = B, c = C, d = D;
            DWORD M[16];
            memcpy(M, pFile + index*GROUPSIZE,64);
            a = FF(a, b, c, d, M[0], 7, 0xd76aa478);
            b = FF(d, a, b, c, M[1], 12, 0xe8c7b756);
            c = FF(c, d, a, b, M[2], 17, 0x242070db);
            d = FF(b, c, d, a, M[3], 22, 0xc1bdceee);
            a = FF(a, b, c, d, M[4], 7, 0xf57c0faf);
            b = FF(d, a, b, c, M[5], 12, 0x4787c62a);
            c = FF(c, d, a, b, M[6], 17, 0xa8304613);
            d = FF(b, c, d, a, M[7], 22, 0xfd469501);
            a = FF(a, b, c, d, M[8], 7, 0x698098d8);
            b = FF(d, a, b, c, M[9], 12, 0x8b44f7af);
            c = FF(c, d, a, b, M[10], 17, 0xffff5bb1);
            d = FF(b, c, d, a, M[11], 22, 0x895cd7be);
            a = FF(a, b, c, d, M[12], 7, 0x6b901122);
            b = FF(d, a, b, c, M[13], 12, 0xfd987193);
            c = FF(c, d, a, b, M[14], 17, 0xa679438e);
            d = FF(b, c, d, a, M[15], 22, 0x49b40821);
    
            
            a = GG(a, b, c, d, M[1], 5, 0xf61e2562);
            b = GG(d, a, b, c, M[6], 9, 0xc040b340);
            c = GG(c, d, a, b, M[11], 14, 0x265e5a51);
            d = GG(b, c, d, a, M[0], 20, 0xe9b6c7aa);
            a = GG(a, b, c, d, M[5], 5, 0xd62f105d);
            b = GG(d, a, b, c, M[10], 9, 0x02441453);
            c = GG(c, d, a, b, M[15], 14, 0xd8a1e681);
            d = GG(b, c, d, a, M[4], 20, 0xe7d3fbc8);
            a = GG(a, b, c, d, M[9], 5, 0x21e1cde6);
            b = GG(d, a, b, c, M[14], 9, 0xc33707d6);
            c = GG(c, d, a, b, M[3], 14, 0xf4d50d87);
            d = GG(b, c, d, a, M[8], 20, 0x455a14ed);
            a = GG(a, b, c, d, M[13], 5, 0xa9e3e905);
            b = GG(d, a, b, c, M[2], 9, 0xfcefa3f8);
            c = GG(c, d, a, b, M[7], 14, 0x676f02d9);
            d = GG(b, c, d, a, M[12], 20, 0x8d2a4c8a);
    
            
            a = HH(a, b, c, d, M[5], 4, 0xfffa3942);
            b = HH(d, a, b, c, M[8], 11, 0x8771f681);
            c = HH(c, d, a, b, M[11], 16, 0x6d9d6122);
            d = HH(b, c, d, a, M[14], 23, 0xfde5380c);
            a = HH(a, b, c, d, M[1], 4, 0xa4beea44);
            b = HH(d, a, b, c, M[4], 11, 0x4bdecfa9);
            c = HH(c, d, a, b, M[7], 16, 0xf6bb4b60);
            d = HH(b, c, d, a, M[10], 23, 0xbebfbc70);
            a = HH(a, b, c, d, M[13], 4, 0x289b7ec6);
            b = HH(d, a, b, c, M[0], 11, 0xeaa127fa);
            c = HH(c, d, a, b, M[3], 16, 0xd4ef3085);
            d = HH(b, c, d, a, M[6], 23, 0x04881d05);
            a = HH(a, b, c, d, M[9], 4, 0xd9d4d039);
            b = HH(d, a, b, c, M[12], 11, 0xe6db99e5);
            c = HH(c, d, a, b, M[15], 16, 0x1fa27cf8);
            d = HH(b, c, d, a, M[2], 23, 0xc4ac5665);
    
            a = II(a, b, c, d, M[0], 6, 0xf4292244);
            b = II(d, a, b, c, M[7], 10, 0x432aff97);
            c = II(c, d, a, b, M[14], 15, 0xab9423a7);
            d = II(b, c, d, a, M[5], 21, 0xfc93a039);
            a = II(a, b, c, d, M[12], 6, 0x655b59c3);
            b = II(d, a, b, c, M[3], 10, 0x8f0ccc92);
            c = II(c, d, a, b, M[10], 15, 0xffeff47d);
            d = II(b, c, d, a, M[1], 21, 0x85845dd1);
            a = II(a, b, c, d, M[8], 6, 0x6fa87e4f);
            b = II(d, a, b, c, M[15], 10, 0xfe2ce6e0);
            c = II(c, d, a, b, M[6], 15, 0xa3014314);
            d = II(b, c, d, a, M[13], 21, 0x4e0811a1);
            a = II(a, b, c, d, M[4], 6, 0xf7537e82);
            b = II(d, a, b, c, M[11], 10, 0xbd3af235);
            c = II(c, d, a, b, M[2], 15, 0x2ad7d2bb);
            d = II(b, c, d, a, M[9], 21, 0xeb86d391);
    
            A += a;
    
            B += b;
    
            C += c;
    
            D += d;
        }
        BYTE result[16];
        memcpy(result, &A, 4);
        memcpy(result+4, &B, 4);
        memcpy(result+8, &C, 4);
        memcpy(result+12, &D, 4);
        TCHAR RDirectory[MAX_PATH] = { 0 };
        TCHAR FileNameWithOutExt[MAX_PATH] = { 0 };
        GetFileDirectory(szBuffer, RDirectory);
        GetFileNameWithoutExtension(szBuffer, FileNameWithOutExt);
        wcscat_s(RDirectory, FileNameWithOutExt);
        wcscat_s(RDirectory, L"-md5.txt");
        HANDLE hReFile = CreateFile(RDirectory, GENERIC_ALL, FILE_SHARE_READ, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
        WriteFile(hReFile, result, 16, &fileRTemp, 0);
        free(pFile);
        CloseHandle(hFile);
        CloseHandle(hReFile);
        return 0;
    }
    void GetFileDirectory(TCHAR File[MAX_PATH], OUT TCHAR RDirectory[MAX_PATH])
    {
        int index = 0;
        for (int i = 0; i < MAX_PATH; i++)
        {
            if (File[i] == TEXT('\'))
            {
                index = i;
                continue;
            }
            if (File[i] == 0)
            {
                break;
            }
        }
        memcpy(RDirectory, File, (index + 1)  * 2);
    }
    void GetFileNameWithoutExtension(TCHAR File[MAX_PATH], OUT TCHAR filename[MAX_PATH])
    {
        int dindex = 0;
        int pindex = 0;
        for (int i = 0; i < MAX_PATH; i++)
        {
            if (File[i] == TEXT('\'))
            {
                dindex = i;
                continue;
            }
            if (File[i] == TEXT('.'))
            {
                pindex = i;
                continue;
            }
            if (File[i] == 0)
            {
                break;
            }
        }
        memcpy(filename, File + dindex  + 1, (pindex - dindex - 1) * 2);
    }

    SHA1的分组和填充与MD5是一样的

    #define RESULT_BYTES 20
    #define FT(B,C,D) ((B & C) | ((~B) & D))
    #define GT(B,C,D) (B^C^D)
    #define HT(B,C,D) ((B&C) | (B&D) | (C&D))
    #define IT(B,C,D) (B^C^D)
    #define LEFT_RORATE(x,y) ((x<<y) | x>>(32-y))
    #define GET_BYTE_FROM_QWORD(x,y) ((x & (0xffffffffffffffff << (8-y)*8) & (0xffffffffffffffff >>(y-1)*8)) >> (8-y)*8)
    // MD5.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "windows.h"
    #include "Header.h"
    DWORD  It = 0x5A827999, Jt = 0x6ED9EBA1, Kt = 0x8F1BBCDC, Lt = 0xCA62C1D6;
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
    
        //------------------------------
    
        DWORD groups = 0;
        //-----------------------------
        TCHAR szBuffer[MAX_PATH] = { 0 };
        OPENFILENAME ofn = { 0 };
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = NULL;
        ofn.lpstrFilter = _T("TXT文件(*.txt)*.txt所有文件(*.*)*.*");//要选择的文件后缀   
        ofn.lpstrInitialDir = _T("D:\");//默认的文件路径   
        ofn.lpstrFile = szBuffer;//存放文件的缓冲区   
        ofn.nMaxFile = sizeof(szBuffer) / sizeof(*szBuffer);
        ofn.nFilterIndex = 0;
        ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;//标志如果是多选要加上OFN_ALLOWMULTISELECT  
        BOOL bSel = GetOpenFileName(&ofn);
        HANDLE hFile = CreateFile(szBuffer, GENERIC_ALL, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0);
        DWORD FileSizeHigh;
        DWORD FileSizeLow = GetFileSize(hFile, &FileSizeHigh);
        PBYTE pFile;
        DWORD fileRTemp;
        if (FileSizeHigh == 0)
        {
            pFile = (PBYTE)malloc((FileSizeLow / 64 + 2) * 64);
            ReadFile(hFile, pFile, FileSizeLow, &fileRTemp, 0);
    
    
            PBYTE pFileEnd = pFile + FileSizeLow;
            if (FileSizeLow % 64 != 56)
            {
                if (FileSizeLow % 64 < 56)
                {
                    memset(pFileEnd, 0, 56 - FileSizeLow % 64);
                    *pFileEnd = *pFileEnd | 0x80;
                    pFileEnd += 56 - FileSizeLow % 64;
                    groups = FileSizeLow / 64 + 1;
                }
                else
                {
                    memset(pFileEnd, 0, 64 - FileSizeLow % 64 + 56);
                    *pFileEnd = *pFileEnd | 0x80;
                    pFileEnd += 64 - FileSizeLow % 64 + 56;
                    groups = FileSizeLow / 64 + 2;
                }
            }
            else
            {
                groups = FileSizeLow / 64 + 1;
            }
            DWORD64 temp = (DWORD64)FileSizeLow * 8;
            for (int i = 0; i < 8; i++)
            {
                *(pFileEnd++) = GET_BYTE_FROM_QWORD(temp, i + 1);
            }
        }
        else
        {
            MessageBox(NULL, L"big file not support now", L"", 0);
            exit(0);
        }
    
        DWORD A[5] = { 0 };
        DWORD H[5] = { 0 };
        DWORD W[80] = { 0 };
        H[0] = 0x67452301;
        H[1] = 0xEFCDAB89;
        H[2] = 0x98BADCFE;
        H[3] = 0x10325476;
        H[4] = 0xC3D2E1F0;
    
        PBYTE ptempFile = pFile;
        for (DWORD index = 0; index < groups; index++)
        {
            memcpy(W, ptempFile, 16);
            for (int i = 16; i <= 79; i++)
            {
                W[i] = LEFT_RORATE(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
            }
            memcpy(A, H, 5);
            DWORD temptemp;
            for (int i = 0; i < 80; i++)
            {
                if (i >= 0 && i <= 19)
                {
                    temptemp = LEFT_RORATE(A[0], 5) + FT(A[1], A[2], A[3]) + A[4] + 0x5A827999 + W[i];
                }
                else if (i >= 20 && i << 39)
                {
                    temptemp = LEFT_RORATE(A[0], 5) + GT(A[1], A[2], A[3]) + A[4] + 0x6ED9EBA1 + W[i];
                }
                else if (i >= 40 && i <= 59)
                {
                    temptemp = LEFT_RORATE(A[0], 5) + HT(A[1], A[2], A[3]) + A[4] + 0x8F1BBCDC + W[i];
                }
                else if (i >= 60 && i <= 79)
                {
                    temptemp = LEFT_RORATE(A[0], 5) + IT(A[1], A[2], A[3]) + A[4] + 0xCA62C1D6 + W[i];
                }
    
                A[4] = A[3];
                A[3] = A[2];
                A[2] = LEFT_RORATE(A[1], 30);
                A[1] = A[0];
                A[0] = temptemp;
            }
            H[0] += A[0];
            H[1] += A[1];
            H[2] += A[2];
            H[3] += A[3];
            H[4] += A[4];
        }
    
        DWORD result[RESULT_BYTES] = { 0 };
        for (int i = 0; i < RESULT_BYTES; i++)
        {
            memcpy(result + i, H + i, 4);
        }
        //--------------------------------
        TCHAR RDirectory[MAX_PATH] = { 0 };
        TCHAR FileNameWithOutExt[MAX_PATH] = { 0 };
        GetFileDirectory(szBuffer, RDirectory);
        GetFileNameWithoutExtension(szBuffer, FileNameWithOutExt);
        wcscat_s(RDirectory, FileNameWithOutExt);
        wcscat_s(RDirectory, L"-sha1.txt");
        HANDLE hReFile = CreateFile(RDirectory, GENERIC_ALL, FILE_SHARE_READ, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
        WriteFile(hReFile, result, RESULT_BYTES, &fileRTemp, 0);
        free(pFile);
        CloseHandle(hFile);
        CloseHandle(hReFile);
        return 0;
    }
    void GetFileDirectory(TCHAR File[MAX_PATH], OUT TCHAR RDirectory[MAX_PATH])
    {
        int index = 0;
        for (int i = 0; i < MAX_PATH; i++)
        {
            if (File[i] == TEXT('\'))
            {
                index = i;
                continue;
            }
            if (File[i] == 0)
            {
                break;
            }
        }
        memcpy(RDirectory, File, (index + 1) * 2);
    }
    void GetFileNameWithoutExtension(TCHAR File[MAX_PATH], OUT TCHAR filename[MAX_PATH])
    {
        int dindex = 0;
        int pindex = 0;
        for (int i = 0; i < MAX_PATH; i++)
        {
            if (File[i] == TEXT('\'))
            {
                dindex = i;
                continue;
            }
            if (File[i] == TEXT('.'))
            {
                pindex = i;
                continue;
            }
            if (File[i] == 0)
            {
                break;
            }
        }
        memcpy(filename, File + dindex + 1, (pindex - dindex - 1) * 2);
    }
  • 相关阅读:
    Go排序
    golang 二维切片
    leetcode 406. 根据身高重建队列
    golang实现二叉搜索树
    Golang之实现(链表)
    docker把web jar包制作成镜像
    Failed to start Docker Application Container
    前端 velocity(.vm)模板里写ajax出现解析异常
    idea常用快捷键
    ArrayList、Vector、LinkedList(jdk8)
  • 原文地址:https://www.cnblogs.com/distanceblog/p/5467549.html
Copyright © 2011-2022 走看看