информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеГде водятся OGRыАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / theory
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
порядок байтов, s, p таблицы те же? это твой код, или код из примера? 06.05.11 22:29  Число просмотров: 6596
Автор: kstati <Евгений Борисов> Статус: Elderman
Отредактировано 06.05.11 22:29  Количество правок: 1
<"чистая" ссылка>
<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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach