Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
тест вектор для Blowfish CFB mode 06.05.11 19:51
Автор: developertmp Статус: Незарегистрированный пользователь
|
Покиньте несколько тест векторов для Blowfish CFB mode, плз.
Пробовал тест вектор (наwww.schneier.com/code/vectors.txt)
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[29] = {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};
У меня результат:
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
что не соответствует приведенному на сайте вектору:
cfb64 cipher text cipher[29]=
E73214A2822139CAF26ECF6D2EB9E76E3DA3DE04D1517200519D57A6C3
|
|
очевидно, что ты используешь иной алгоритм. ты, не попутал blowfish-cfb и blowfish-cfb64? Где исходник алгортима? По ссылке лишь результат. А такие циферки я могу и из /dev/urandom выдернуть. 06.05.11 20:41
Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 06.05.11 20:43 Количество правок: 1
|
|
| |
Я использю 64 бита в качестве фидбэка. Это не CFB-64? 06.05.11 21:45
Автор: developertmp Статус: Незарегистрированный пользователь
|
Я использю 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
*/
|
| | |
порядок байтов, s, p таблицы те же? это твой код, или код из примера? 06.05.11 22:29
Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 06.05.11 22:29 Количество правок: 1
|
|
| | | |
Шифрование блока (Blowfish_Init(), Blowfish_Encrypt()) -... 06.05.11 22:47
Автор: developertmp Статус: Незарегистрированный пользователь
|
Шифрование блока (Blowfish_Init(), Blowfish_Encrypt()) - известная имплементация by Paul Kocher, взятая с сайта www.schneier.com/blowfish-download.html.
Там всё проверено и тестировано (т.е. с таблицами не может быть проблем). Всё остальное (несколько строк кода выше в начале нитки) моё. Тестовый вектор, который я указывал - Эрика Янга.
|
| | | | |
Сейчас нет под рукой компилятора проверить, но на вскидку вариант Эрика отличается от Паулевского 06.05.11 23:34
Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 06.05.11 23:44 Количество правок: 3
|
Сравни функцию F и макросы BF_ENC(LL,R,S,P)
Если быть более точным - обрати внимание на момент:
Эрик:
#define BF_M 0x3fc
#define BF_0 22L
#define BF_1 14L
#define BF_2 6L
#define BF_3 2L /* left shift */
...
LL^=P; \
LL^= (((*(BF_LONG *)((unsigned char *)&(S[ 0])+((R>>BF_0)&BF_M))+ \
*(BF_LONG *)((unsigned char *)&(S[256])+((R>>BF_1)&BF_M)))^ \
*(BF_LONG *)((unsigned char *)&(S[512])+((R>>BF_2)&BF_M)))+ \
*(BF_LONG *)((unsigned char *)&(S[768])+((R<<BF_3)&BF_M)));
---
Пауль:
static unsigned long F(BLOWFISH_CTX *ctx, unsigned long x) {
unsigned short a, b, c, d;
unsigned long y;
d = (unsigned short)(x & 0xFF);
x >>= 8;
c = (unsigned short)(x & 0xFF);
x >>= 8;
b = (unsigned short)(x & 0xFF);
x >>= 8;
a = (unsigned short)(x & 0xFF);
y = ctx->S[0][a] + ctx->S[1][b];
y = y ^ ctx->S[2][c];
y = y + ctx->S[3][d];
return y;
}
---
Особое внимание обрати на сдвиги. побайтно и... 22,14,6,-2 бита. Это похожие, но по сути разные алгоритмы.
Поэтому-то я и повторяю — уточни каким именно алгоритмом получено значение, которого ты пытаешься добиться.
Хотя может я и загнался.
Blowfish, версия Eric Young для FreeBsd
|
| | | | | |
Спасибо! 07.05.11 02:33
Автор: developertmp Статус: Незарегистрированный пользователь Отредактировано 10.05.11 22:00 Количество правок: 1
|
Спасибо!
Всё оказалось проще. Там у меня баг. Нельзя так делать
ULONG* xl = reinterpret_cast<ULONG*>(&initialization_vector[0]);
ULONG* xr = reinterpret_cast<ULONG*>(&initialization_vector[4]);
---
Надо
ULONG xl = initialization_vector[0] << 24 | initialization_vector[1] << 16 | initialization_vector[2] << 8 | initialization_vector[3];
ULONG xr = initialization_vector[4] << 24 | initialization_vector[5] << 16 | initialization_vector[6] << 8 | initialization_vector[7];
---
Короче
void _encrypt_one_cfb_block(BLOWFISH_CTX& ctx, _8BYTES& initialization_vector, const _8BYTES& plain_in, _8BYTES& encrypted_out)
{
ULONG xl = initialization_vector[0] << 24 | initialization_vector[1] << 16 | initialization_vector[2] << 8 | initialization_vector[3];
ULONG xr = initialization_vector[4] << 24 | initialization_vector[5] << 16 | initialization_vector[6] << 8 | initialization_vector[7];
Blowfish_Encrypt(&ctx, &xl, &xr);
initialization_vector[0] = (xl >> 24) & 0xff;
initialization_vector[1] = (xl >> 16) & 0xff;
initialization_vector[2] = (xl >> 8) & 0xff;
initialization_vector[3] = xl & 0xff;
initialization_vector[4] = (xr >> 24) & 0xff;
initialization_vector[5] = (xr >> 16) & 0xff;
initialization_vector[6] = (xr >> 8) & 0xff;
initialization_vector[7] = xr & 0xff;
for (size_t i = 0; i < sizeof(_8BYTES); i++) {
encrypted_out[i] = initialization_vector[i] ^ plain_in[i];
}
}
---
Так что тест ветор Ерика работает нормально.
|
| | | | | | |
таки не учёл порядок байтов. на ibm-ках последовательность байт 0x12,0x34,0x56,0x78 определяет двойное слово 0x78563421 11.05.11 02:39
Автор: kstati <Евгений Борисов> Статус: Elderman
|
iv[0] 98badcfe
iv[4] 10325476
iv[0..8] fedc ba98 7654 3210
---
|
| | | | | | | |
Согласен. при выполение ulong val =... 11.05.11 06:17
Автор: developertmp Статус: Незарегистрированный пользователь
|
> > iv[0] 98badcfe
> iv[4] 10325476
> iv[0..8] fedc ba98 7654 3210
> ---
Согласен. При выполение ULONG val = reinterpet_cast<ULONGgt;(byte_array)) (как было в неправильном коде) порядок байт будет обратный тому, что есть в массиве byte_array на little-endin хосте.
|
|
|