Я использю 64 бита в качестве фидбэка. Это не CFB-64?
Ниже упрощённая версия:
typedef BYTE _8BYTES[8];
void _encrypt_one_cfb_block(BLOWFISH_CTX& ctx, _8BYTES& initialization_vector, const _8BYTES& plain_in, _8BYTES& encrypted_out)
{
ULONG* xl = reinterpret_cast<ULONG*>(&initialization_vector[0]);
ULONG* xr = reinterpret_cast<ULONG*>(&initialization_vector[4]);
Blowfish_Encrypt(&ctx, xl, xr);
for (size_t i = 0; i < sizeof(_8BYTES); i++) {
encrypted_out[i] = initialization_vector[i] ^ plain_in[i];
}
}
bool blowfish_encrypt_cfb(const BYTE* key, size_t key_len,
const _8BYTES& initialization_vector, const BYTE* plain_in, BYTE* encrypted_out, size_t len)
{
size_t nblocks = len / 8;
_8BYTES prev_block = {0};
for (size_t i = 0; i < sizeof(_8BYTES); i ++) {
prev_block[i] = initialization_vector[i];
}
if (! key|! plain_in|! encrypted_out ) {
return false;
}
if (len % 8 != 0) {
return false;
}
BLOWFISH_CTX ctx = {0};
Blowfish_Init (&ctx, const_cast<BYTE*>(key), key_len);
for ( size_t i = 0; i < nblocks; i++ ) {
const _8BYTES& inblock = *reinterpret_cast<const _8BYTES*>(plain_in);
_8BYTES& outblock =reinterpret_cast<_8BYTESgt;(encrypted_out);
_encrypt_one_cfb_block(ctx, prev_block, inblock, outblock);
plain_in += 8;
encrypted_out += 8;
for (size_t i = 0; i < sizeof(_8BYTES); i ++) {
prev_block[i] = outblock[i];
}
}
return true;
}
---
И использование:
BYTE _key[16] = {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,0xF0,0xE1,0xD2,0xC3,0xB4,0xA5,0x96,0x87};
BYTE _iv[8] = {0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10};
//BYTE _data[29] = "7654321 Now is the time for "; // (includes trailing '\0')
BYTE _data[32] = {0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x20,0x4E,0x6F,0x77,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x74,0x69,0x6D,0x65,0x20,0x66,0x6F,0x72,0x20,0x00,0x00,0x00,0x00};
BYTE _encrypt_data[32] = {0};
bool rc = blowfish_encrypt_cfb(_key, sizeof(_key), _iv, _data, _encrypt_data, 32);
/*
encrypt_data:
0x1a,0x6c,0xc8,0xcc,0x3d,0x0d,0x82,0x1b,0xcc,0xcc,0xc0,0xe0,0x86,0x00,0x64,0x94,
0x26,0x14,0x8d,0xc4,0x96,0xe2,0x86,0x8f,0x24,0x37,0x2f,0x9a,0x8b,0x29,0xd1,0xd2
*/
|