📄 blowfish.cpp
字号:
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::Init( unsigned char* const key, int keyLen )
{
// return error code
if(key == NULL)
return BLOWFISH_NULL;
if(keyLen < MINKEYBYTES)
return BLOWFISH_INPUTTOOSHORT ;
if(keyLen > MAXKEYBYTES)
return BLOWFISH_INPUTTOOLONG;
// fill key_sbox from sbox
for(int i = 0 ; i < 4 ; i ++)
for(int j = 0 ; j < 256 ; j ++)
key_sbox[i][j] = sbox[i][j];
// fill key_pbox
int nIndex = 0;
unsigned long data = 0x00000000;
for (int i = 0; i < N + 2; i++)
{
data = 0x00000000;
for(int j = 0 ; j < 4 ; j++)
{
data = (data << 8) | key[nIndex];
nIndex++;
if(nIndex >= keyLen)
nIndex = 0;
}
key_pbox[i] = pbox[i] ^ data ;
}
unsigned long xl = 0x00000000;
unsigned long xr = 0x00000000;
for (int i = 0; i < N + 2; i += 2)
{
Encrypt(&xl, &xr);
key_pbox[i] = xl;
key_pbox[i + 1] = xr;
}
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 256; j += 2)
{
Encrypt(&xl, &xr);
key_sbox[i][j] = xl;
key_sbox[i][j + 1] = xr;
}
}
return BLOWFISH_SUCCESS;
}
unsigned long Blowfish::F(unsigned long x)
{
return ( ( key_sbox[0][(x >> 24) & 0xFF] + key_sbox[1][(x >> 16) & 0xFF] ) ^ key_sbox[2][(x >> 8) & 0xFF] ) + key_sbox[3][(x) & 0xFF];
}
int Blowfish::Encrypt(unsigned long *xl, unsigned long *xr)
{
// return error code
if(xl == NULL || xr == NULL)
return BLOWFISH_NULL;
unsigned long Xl;
unsigned long Xr;
unsigned long temp;
Xl = *xl;
Xr = *xr;
for (int i = 0; i < N; ++i)
{
Xl = Xl ^ key_pbox[i];
Xr = F(Xl) ^ Xr;
temp = Xl;
Xl = Xr;
Xr = temp;
}
temp = Xl;
Xl = Xr;
Xr = temp;
Xr = Xr ^ key_pbox[N];
Xl = Xl ^ key_pbox[N + 1];
*xl = Xl;
*xr = Xr;
return BLOWFISH_SUCCESS;
}
int Blowfish::Decrypt(unsigned long *xl, unsigned long *xr)
{
// return error code
if(xl == NULL || xr == NULL)
return BLOWFISH_NULL;
unsigned long Xl;
unsigned long Xr;
unsigned long temp;
Xl = *xl;
Xr = *xr;
for (int i = N + 1; i > 1; --i)
{
Xl = Xl ^ key_pbox[i];
Xr = F(Xl) ^ Xr;
/* Exchange Xl and Xr */
temp = Xl;
Xl = Xr;
Xr = temp;
}
/* Exchange Xl and Xr */
temp = Xl;
Xl = Xr;
Xr = temp;
Xr = Xr ^ key_pbox[1];
Xl = Xl ^ key_pbox[0];
*xl = Xl;
*xr = Xr;
return BLOWFISH_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -