информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыСетевые кракеры и правда о деле ЛевинаАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft предупредила о двух незакрытых... 
 Перевод Firefox на DNS over HTTPS 
 Microsoft закрыла серьёзную уязвимость,... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / theory
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
таки не учёл порядок байтов. на ibm-ках последовательность байт 0x12,0x34,0x56,0x78 определяет двойное слово 0x78563421 11.05.11 02:39  Число просмотров: 2598
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
iv[0] 98badcfe
iv[4]  10325476
iv[0..8] fedc ba98    7654 3210

---
<theory>
тест вектор для 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 хосте.
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2020 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach