📄 blowfish.cpp
字号:
0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba,
0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5,
0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd,
0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb,
0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc,
0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc,
0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a,
0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b,
0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e,
0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623,
0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3,
0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c,
0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
};
int BlowFish::gBlowFishFunction(int data32)
{
char a, b, c, d;
a = (data32 & 0xff000000) >> 24;
b = (data32 & 0xff0000) >> 16;
c = (data32 & 0xff00) >> 8;
d = data32 & 0xff;
return (gKeyBoxes[a + 18] + gKeyBoxes[b + 18 + 256]) ^ gKeyBoxes[c + 18 + 512] + gKeyBoxes[d + 18 + 768];
}
__int64 BlowFish::gBlowFishEnCode(__int64 data64)
{
int i;
int xL, xR, xL0, xR0;
__int64 r;
xL0 = data64 >> 32;
xR0 = data64 & 0x00000000ffffffff;
for(i = 0; i < 16; i++)
{
xR = xL0 ^ gKeyBoxes[i];
xL = gBlowFishFunction(xR) ^ xR0;
xL0 = xL;
xR0 = xR;
}
xR = xL0 ^ gKeyBoxes[16];
xL = xR0 ^ gKeyBoxes[17];
r = xL;
r = (r << 32) | xR;
return r;
}
void BlowFish::gBlowFishEnCode(const BYTE *pSrc, BYTE *pDest)
{
int i;
int xL, xR, xL0, xR0;
for(i = 0, xL0 = 0; i < 4; i++) xL0 |= (pSrc[i] << (i*8));
for(i = 0, xR0 = 0; i < 4; i++) xR0 |= (pSrc[i + 4] << (i*8));
for(i = 0; i < 16; i++)
{
xR = xL0 ^ gKeyBoxes[i];
xL = gBlowFishFunction(xR) ^ xR0;
xL0 = xL;
xR0 = xR;
}
xR = xL0 ^ gKeyBoxes[16];
xL = xR0 ^ gKeyBoxes[17];
for(i = 3; i >= 0; i--) pDest[i] = xL >> (i*8);
}
__int64 BlowFish::gBlowFishDeCode(__int64 data64)
{
int i;
int xL, xR, xL0, xR0;
__int64 r;
xL0 = data64 >> 32;
xR0 = data64 & 0x00000000ffffffff;
for(i = 0; i < 16; i++)
{
xR = xL0 ^ gKeyBoxes[17 - i];
xL = gBlowFishFunction(xR) ^ xR0;
xR0 = xR;
xL0 = xL;
}
xL = xR0 ^ gKeyBoxes[0];
xR = xL0 ^ gKeyBoxes[1];
r = xL;
r = (r << 32) | xR;
return r;
}
void BlowFish::gBlowFishDeCode(const BYTE *pSrc, BYTE *pDest)
{
int i;
int xL, xR, xL0, xR0;
__int64 r;
for(i = 0, xL = 0; i < 4; i++) xL |= (pSrc[i] << (i*8));
for(i = 0, xR = 0; i < 4; i++) xR |= (pSrc[i + 4] << (i*8));
xR0 = xL ^ gKeyBoxes[17];
xL0 = xR ^ gKeyBoxes[16];
for(i = 15; i >= 0; i--)
{
xL = xL0;
xR = xR0;
xL0 = xR ^ gKeyBoxes[i];
xR0 = gBlowFishFunction(xR) ^ xL;
}
for(i = 3; i >= 0; i--) pDest[i] = xL0 >> (i*8);
for(i = 3; i >= 0; i--) pDest[i + 4] = xR0 >> (i*8);
}
void BlowFish::gBlowFishInit(const BYTE *passport)
{
int i, j, k;
int tmp;
__int64 data64;
memset(gKeyBoxes, 0, sizeof(gKeyBoxes));
for(i = 0, j = 0; i < 18; i++)
{
tmp = 0;
for(k = 0; k < 3; k++)
{
tmp = (tmp << 8) | passport[j++];
if(j >= 8) j = 0;
}
gKeyBoxes[i] = gPBox[i] ^ tmp;
}
for(i = 0; i < 4; i++)
for(j = 0; j < 256; j++) gKeyBoxes[i*256 + j + 18] = gSBox[i][j];
data64 = 0;
for(i = 0; i < 521; i++)
{
data64 = gBlowFishEnCode(data64);
gKeyBoxes[i*2] = data64 >> 32;
gKeyBoxes[i*2 + 1] = data64 & 0x00000000ffffffff;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -