C ++ MD5暗号化(署名)

md5.h:

する#include <stdio.hに>
する#include <STDLIB.H>
の#include <TIME.H>
の#include <string.hの>
空隙MD5ダイジェスト(CHAR * pszInput、符号なしのロングnInputSize、CHAR * pszOutPut)。

 

md5.cpp:

#include "stdafx.hを"
する#include <stdio.hに>
する#include <stdlib.h>に含ま
する#include <TIME.H>
書式#include <string.hの>
の#include "md5.h"

* POINTER unsigned char型のtypedef。
符号なしshort int型のtypedef UINT2。
符号なしlong int型UINT4のtypedef。

typedefは構造体
{
UINT4状態[4]。
UINT4カウント[2]。
unsigned char型バッファ[64]。
} MD5_CTX。

空MD5Init(MD5_CTX *)。
MD5Update(MD5_CTX *、unsigned char型の*、unsigned int型)を無効に。
ボイドMD5Final(unsigned char型[16]、MD5_CTX *)。

#define S11 7
の#define S12 12
の#define S13 17
の#define S14 22
の#define S21 5
の#define S22 9
の#define S23 14
の#define S24 20
の#define S31 4
の#define S32 11
の#define S33 16
の#define S34 23と
の#define S41 6
の#define S42 10
の#define S43 15
の#define S44 21

静的unsigned char型パディング[64] = {
0x80を、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0 、0、
0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、
0 、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0
}。

#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 ROTATE_LEFT(X、n)は(((X)<<(N))|((X)>>(32-(N))))

#define FF(A、B、C、D、X、S、AC){(A)+ = F((B)、(C)、(D))+(X)+(UINT4)(AC)。(A)= ROTATE_LEFT((A)、(S))。(A)+ =(B)。}
の#define GG(A、B、C、D、X、S、AC){(A)+ = G((B)、(C)、(D))+(X)+(UINT4)(AC) ; (A)= ROTATE_LEFT((A)、(S))。(A)+ =(B)。}
の#define HH(A、B、C、D、X、S、AC){(A)+ = H((B)、(C)、(D))+(X)+(UINT4)(AC) ; (A)= ROTATE_LEFT((A)、(S))。(A)+ =(B)。}
の#define II(A、B、C、D、X、S、AC){(A)+ = I((B)、(C)、(D))+(X)+(UINT4)(AC) ; (A)= ROTATE_LEFT((A)、(S))。(A)+ =(B)。}


インラインボイドエンコード(符号なしのchar *の出力、UINT4 *入力、unsigned int型LEN)
{
unsigned int型I、J。

用(i = 0、J = 0; J <LEN; iは++、J + = 4){
出力[J] =(unsigned char型)(入力[I]&0xffで)。
出力[J + 1] =(unsigned char型)((入力[I] >> 8)&0xffの)。
出力[J + 2] =(unsigned char型)((入力[I] >> 16)&0xffの)。
出力[J + 3] =(unsigned char型)((入力[I] >> 24)&0xffの)。
}
}

インラインボイドデコード(UINT4 *出力はunsigned char *入力、unsigned int型LEN)
{
unsigned int型のI、J。

用(i = 0、J = 0; J <LEN; iは++、J + = 4)
出力[I] =((UINT4)入力[J])| (((UINT4)入力[J + 1])<< 8)|
(((UINT4)入力[J + 2])<< 16)| (((UINT4)入力[J + 3])<< 24)。
}

インラインボイドMD5Transform(UINT4状態[4]、unsigned char型ブロック[64])
{
UINT4のA =状態[0]、B =状態[1]、C =状態[2]、D =状態[3]、X [16 ];
デコード(X、ブロック64)。
FF(A、B、C、Dは、[0]、S11、0xd76aa478 X)。
FF(D、A、B、C、X [1]、S12、0xe8c7b756)。
FF(C、D、A、B、X [2]、S13、0x242070db)。
FF(B、C、D、X [3]、S14、0xc1bdceee)。
FF(A、B、C、D、X [4]、S11、0xf57c0faf)。
FF(D、A、B、C、X [5]、S12、0x4787c62a)。
FF(C、D、A、B、X [6]、S13、0xa8304613)。
FF(B、C、D、X [7]、S14、0xfd469501)。
FF(A、B、C、D、X [8]、S11、0x698098d8)。
FF(D、A、B、C、X [9]、S12、0x8b44f7af)。
FF(C、D、A、B、X [10]、S13、0xffff5bb1)。
FF(B、C、D、X [11]、S14、0x895cd7be)。
FF(A、B、C、D、X [12]、S11、0x6b901122)。
FF(D、A、B、C、X [13]、S12、0xfd987193)。
FF(C、D、A、B、X [14]、S13、0xa679438e)。
FF(B、C、D、X [15]、S14、0x49b40821)。
GG(A、B、C、Dは、[1]、S21、0xf61e2562 X)。
GG(D、A、B、C、X [6]、S22、0xc040b340)。
GG(C、D、A、B、X [11]、S23、0x265e5a51)。
GG(B、C、D、X [0]、S24、0xe9b6c7aa)。
GG(A、B、C、D、X [5]、S21、0xd62f105d)。
GG(D、A、B、C、X [10]、S22、0x2441453)。
GG(C、D、A、B、X [15]、S23、0xd8a1e681)。
GG(B、C、D、X [4]、S24、0xe7d3fbc8)。
GG(A、B、C、D、X [9]、S21、0x21e1cde6)。
GG(D、A、B、C、X [14]、S22、0xc33707d6)。
GG(C、D、A、B、X [3]、S23、0xf4d50d87)。
GG(B、C、D、X [8]、S24、0x455a14ed)。
GG(A、B、C、D、X [13]、S21、0xa9e3e905)。
GG(D、A、B、C、X [2]、S22、0xfcefa3f8)。
GG(C、D、A、B、X [7]、S23、0x676f02d9)。
GG(B、C、D、X [12]、S24、0x8d2a4c8a)。
HH(A、B、C、Dは、[5]、S31、0xfffa3942 X)。
HH(D、A、B、C、X [8]、S32、0x8771f681)。
HH(C、D、A、B、X [11]、S33、0x6d9d6122)。
HH(B、C、D、X [14]、S34、0xfde5380c)。
HH(A、B、C、Dは、[1]、S31、0xa4beea44 X)。
HH(D、A、B、C、X [4]、S32、0x4bdecfa9)。
HH(C、D、A、B、X [7]、S33、0xf6bb4b60)。
HH(B、C、D、X [10]、S34、0xbebfbc70)。
HH(A、B、C、D、X [13]、S31、0x289b7ec6)。
HH(D、A、B、C、X [0]、S32、0xeaa127fa)。
HH(C、D、A、B、X [3]、S33、0xd4ef3085)。
HH(B、C、D、X [6]、S34、0x4881d05)。
HH(A、B、C、Dは、[9]、S31、0xd9d4d039 X)。
HH(D、A、B、C、X [12]、S32、0xe6db99e5)。
HH(C、D、A、B、X [15]、S33、0x1fa27cf8)。
HH(B、C、D、X [2]、S34、0xc4ac5665)。
II(A、B、C、Dは、[0]、S41、0xf4292244 X)。
II(D、A、B、C、X [7]、S42、0x432aff97)。
II(C、D、A、B、X [14]、S43、0xab9423a7)。
II(B、C、D、X [5]、S44、0xfc93a039)。
II(A、B、C、D、X [12]、S41、0x655b59c3)。
II(D、A、B、C、X [3]、S42、0x8f0ccc92)。
II(C、D、A、B、X [10]、S43、0xffeff47d)。
II(B、C、D、X [1]、S44、0x85845dd1)。
II(A、B、C、Dは、X [8]、S41、0x6fa87e4f)。
II(D、A、B、C、X [15]、S42、0xfe2ce6e0)。
II(C、D、A、B、X [6]、S43、0xa3014314)。
II(B、C、D、X [13]、S44、0x4e0811a1)。
II(A、B、C、Dは、[4]、S41、0xf7537e82 X)。
II(D、A、B、C、X [11]、S42、0xbd3af235)。
II(C、D、A、B、X [2]、S43、0x2ad7d2bb)。
II(B、C、D、X [9]、S44、0xeb86d391)。
状態[0] + =。
状態[1] + = B。
状態[2] + = C。
状態[3] + = D。
memsetの((ポインタ)のx、0、はsizeof(X));
}

インラインボイドMD5Init(MD5_CTX *コンテキスト)
{
、コンテキスト>カウント[0] =、コンテキスト>カウント[1] = 0;
、コンテキスト>状態[0] = 0x67452301。
、コンテキスト>状態[1] = 0xefcdab89。
、コンテキスト>状態[2] = 0x98badcfe。
、コンテキスト>状態[3] = 0x10325476。
}

インラインボイドMD5Update(MD5_CTX *コンテキストはunsigned char *入力、unsigned int型inputLen)
{
unsigned int型I、インデックス、partLen。

インデックス=(unsigned int型)((、コンテキスト>カウント[0] >> 3)&は0x3F)。
IF((、コンテキスト>カウント[0] + =((UINT4)inputLen << 3))
<((UINT4)inputLen << 3))
コンテキスト>カウント[1] ++;
、コンテキスト>カウント[1] + =((UINT4)inputLen >> 29)。

partLen = 64 - インデックス。

IF(inputLen> = partLen){
のmemcpy((ポインタ)と、コンテキスト> [インデックス]、(ポインタ)入力、partLenバッファ)。
MD5Transform(、コンテキスト>状態、コンテキスト>バッファ);

(I = partLen; iが63 <inputLen、I + = 64 +)のため
MD5Transform(、コンテキスト>状態を、&入力[I])。
インデックス= 0;
}
そうでなければ
i = 0;

memcpy((ポインタ)と、コンテキスト> [i]は、inputLen-I [インデックス]、(ポインタ)・入力バッファ)。
}

インラインボイドMD5Final(unsigned charのダイジェスト[16]、MD5_CTX *コンテキスト)
{
unsigned charのビット[8]。
unsigned int型のインデックス、padLen。

符号化(ビット、コンテキスト>数、8)。
インデックス=(unsigned int型)((、コンテキスト>カウント[0] >> 3)&0x3fを)。
padLen =(指数<56)?(56 -指数):(120 -インデックス)
MD5Update(コンテキスト、パディングpadLen)。
MD5Update(コンテキスト、ビット、8)。
(ダイジェスト、コンテキスト>状態、16)をコードします。
memsetの((ポインタ)コンテキスト、0、はsizeof(*コンテキスト))。
}

空隙MD5ダイジェスト(CHAR * pszInput、符号なしのロングnInputSize、CHAR * pszOutPut)
{
MD5_CTXコンテキスト。
unsigned int型LEN =のSTRLEN(pszInput)。

MD5Init(&コンテキスト)。
MD5Update(&コンテキスト、(unsigned char型の*)pszInput、LEN)。
MD5Final((unsigned char型の*)pszOutPut、およびコンテキスト)。
}

 TEST.CPP:

チャーTMP [3] = {0}、BUF [33] = {0}。
チャーszDigest [16]。
チャー暗号化[200]。

printf( "\ nは加密结果:");
MD5ダイジェスト( "2015063000000001apple143566028812345678は"、( "2015063000000001apple143566028812345678")、szDigest strlenを)。

以下のために(; iは16 <; I = 0 int型私は++)
{
//のprintf( "%02X"、(unsigned char型)szDigest [I])。
sprintf(TMP、 "%の02X"、(unsigned char型)szDigest [I])。
STRCAT(BUF、TMP)。
}

おすすめ

転載: www.cnblogs.com/Pond-ZZC/p/11270046.html