Roman Pogosyan Опубліковано: 27 вересня, 2011 Автор Опубліковано: 27 вересня, 2011 инициализация public Blowfish(byte[] key) { short i; short j; short k; uint data; uint datal; uint datar; P = _P.Clone() as uint[]; S = _S.Clone() as uint[,]; j = 0; for (i = 0; i < N + 2; ++i) { data = 0x00000000; for (k = 0; k < 4; ++k) { data = (data << 8) | key[j]; j++; if (j >= key.Length) { j = 0; } } P[i] = P[i] ^ data; } datal = 0x00000000; datar = 0x00000000; for (i = 0; i < N + 2; i += 2) { Encipher(ref datal, ref datar); P[i] = datal; P[i + 1] = datar; } for (i = 0; i < 4; ++i) { for (j = 0; j < 256; j += 2) { Encipher(ref datal, ref datar); S[i, j] = datal; S[i, j + 1] = datar; } } }
Roman Pogosyan Опубліковано: 27 вересня, 2011 Автор Опубліковано: 27 вересня, 2011 криптер public void Encipher(ref uint xl, ref uint xr) { uint Xl; uint Xr; uint temp; short i; Xl = xl; Xr = xr; for (i = 0; i < N; ++i) { Xl = Xl ^ P[i]; Xr = F(Xl) ^ Xr; temp = Xl; Xl = Xr; Xr = temp; } temp = Xl; Xl = Xr; Xr = temp; Xr = Xr ^ P[N]; Xl = Xl ^ P[N + 1]; xl = Xl; xr = Xr; }
Roman Pogosyan Опубліковано: 27 вересня, 2011 Автор Опубліковано: 27 вересня, 2011 ну и F private uint F(uint x) { ushort a; ushort b; ushort c; ushort d; uint y; d = (ushort)(x & 0x00FF); x >>= 8; c = (ushort)(x & 0x00FF); x >>= 8; b = (ushort)(x & 0x00FF); x >>= 8; a = (ushort)(x & 0x00FF); //y = ((S[0][a] + S[1][b]) ^ S[2][c]) + S[3][d]; y = S[0, a] + S[1, b]; y = y ^ S[2, c]; y = y + S[3, d]; return y; } обложатся вроде негде
madf Опубліковано: 27 вересня, 2011 Опубліковано: 27 вересня, 2011 нет в C# при перекодировке стринга в байт выходит 7 байтов которые используются тут for (i = 0; i < N + 2; ++i) { data = 0x00000000; for (k = 0; k < 4; ++k) { data = (data << 8) | key[j]; j++; if (j >= key.Length) { j = 0; } } P[i] = P[i] ^ data; } Уже вижу в коде ошибку. Куда делася ORIG_P?
madf Опубліковано: 27 вересня, 2011 Опубліковано: 27 вересня, 2011 инициализация public Blowfish(byte[] key) { short i; short j; short k; uint data; uint datal; uint datar; P = _P.Clone() as uint[]; S = _S.Clone() as uint[,]; j = 0; for (i = 0; i < N + 2; ++i) { data = 0x00000000; for (k = 0; k < 4; ++k) { data = (data << 8) | key[j]; j++; if (j >= key.Length) { j = 0; } } P[i] = P[i] ^ data; } datal = 0x00000000; datar = 0x00000000; for (i = 0; i < N + 2; i += 2) { Encipher(ref datal, ref datar); P[i] = datal; P[i + 1] = datar; } for (i = 0; i < 4; ++i) { for (j = 0; j < 256; j += 2) { Encipher(ref datal, ref datar); S[i, j] = datal; S[i, j + 1] = datar; } } } Где инициализация S?
Roman Pogosyan Опубліковано: 28 вересня, 2011 Автор Опубліковано: 28 вересня, 2011 P = _P.Clone() as uint[]; S = _S.Clone() as uint[,]; копируют статик массивы у _P и _S старгайзера они как ORIG_P ORIG_S
Roman Pogosyan Опубліковано: 28 вересня, 2011 Автор Опубліковано: 28 вересня, 2011 для компилирования в C используется библиотека ssl ? у меня она не ипользовалась , может из за этого разница в ctx ?
Roman Pogosyan Опубліковано: 28 вересня, 2011 Автор Опубліковано: 28 вересня, 2011 nashel sait s onlajn cryptovaniem blowfish .. proveril .. real'no xren ego znaet chto kriptovala proshlaya realizaciya ... nashel eshe odin , zapustil encrypt_CBC (pravda v e etom algritme eshe IV est' (krome key-a)) vpisal v IV (init vector) nuli , vzyal string , perevel ego v bajt , zakodiroval bajt , perevel v hex dex (na etom sajte rezul'tat vydavalo v dec hex) .. sravnil rezul'taty .. odinakovye => 100% rabochaya realizaciya vzyal iz vpisal v nego crypt_stg tak kak tam pravyj i levyj bajt poluchaetsya inache chem u obyknovennogo algoritma ... zakrpittoval paket i opyat' inetaccess.cpp > 21:07:23 > User 'ъo|д╘j,Ґ╣Ї5ъ▀р╣Ї5ъ▀р╣Ї5ъ▀р' NOT found! ... mozgi kipyat i trebuyut pravosudiya
madf Опубліковано: 28 вересня, 2011 Опубліковано: 28 вересня, 2011 Посмотри вот это: http://local.com.ua/forum/topic/14275-%D0%BD%D0%B5-%D0%BF%D1%80%D0%BE%D1%85%D0%BE%D0%B4%D0%B8%D1%82-%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F/ Там я решал проблемы с шифрованием на системах с разным порядком байт. Там есть тестовые программки - они помогут. Основная идея - отследить порядок инициализации контекста и шифрования и найти где они начинают различаться.
madf Опубліковано: 28 вересня, 2011 Опубліковано: 28 вересня, 2011 для компилирования в C используется библиотека ssl ? у меня она не ипользовалась , может из за этого разница в ctx ? Не используется. К сожалению. В OpenSSL универсальная и переносимая реализация.
Roman Pogosyan Опубліковано: 29 вересня, 2011 Автор Опубліковано: 29 вересня, 2011 проверил , у меня нет разницы в эдиан. и на компе где компилирую прогу и на сервере Litlle Edian
madf Опубліковано: 29 вересня, 2011 Опубліковано: 29 вересня, 2011 Я в этом и не сомневался. Просто утилиты которые я тогда выкладывал могут помочь в диагностировании проблемы.
Roman Pogosyan Опубліковано: 29 вересня, 2011 Автор Опубліковано: 29 вересня, 2011 там текстовые файлы с кракозябрами внутри
madf Опубліковано: 29 вересня, 2011 Опубліковано: 29 вересня, 2011 там текстовые файлы с кракозябрами внутри А почитать внимательно что я там писал? Во вложении файл crypt.txt. Скачать, переименовать в crypt.tar.bz2 (не смог загрузить так), распаковать. ...
Roman Pogosyan Опубліковано: 29 вересня, 2011 Автор Опубліковано: 29 вересня, 2011 перевел test.cpp na C# библиотека криптования последняя результат 5D 33 E1 FE 85 17 3F 7A A2 B8 EF D4 6F 2B 72 1C а должен был быть Encrypted string: 5d 33 e1 fe 85 17 3f 7a 3e 91 24 35 3e da 56 38 , то есть разница во втором байте вышла
Roman Pogosyan Опубліковано: 29 вересня, 2011 Автор Опубліковано: 29 вересня, 2011 с алгоритмом ECB Encrypted 5D 33 E1 FE 85 17 3F 7A 3E 91 24 35 3E DA 56 38 Все правильно , сейчас закодирую пакет глянем
Roman Pogosyan Опубліковано: 29 вересня, 2011 Автор Опубліковано: 29 вересня, 2011 блин inetaccess.cpp > 14:17:32 > User '▒N▒$▒▒▒▒▒O▒▒▒▒▒▒O▒▒▒▒▒▒O▒▒▒' NOT found! значит изначально дело было не в криптованиии
Roman Pogosyan Опубліковано: 29 вересня, 2011 Автор Опубліковано: 29 вересня, 2011 хотя есть еще момент в ключе для инициализации там 7 байт а не 8 как в тесте
madf Опубліковано: 29 вересня, 2011 Опубліковано: 29 вересня, 2011 хотя есть еще момент в ключе для инициализации там 7 байт а не 8 как в тесте Тест - дело такое. Там все что угодно может быть.
Roman Pogosyan Опубліковано: 29 вересня, 2011 Автор Опубліковано: 29 вересня, 2011 прикол на приколе , в тесте поставил ключ из стг сравнил закодированное , все точно , разозлился собрал свой UDP сервер , взял клиент Inetaccess с сайта , послал с него инфо на подключение ... так же разкодировать не выходит ... попытался поискать в дате полученной от клиента закодированный логин (думал может сдвинут куда то ) ... ни одного совпадения блока не нашел . так что все намного интереснее
Roman Pogosyan Опубліковано: 29 вересня, 2011 Автор Опубліковано: 29 вересня, 2011 вопрос byte2block там идет выражение *c++ каким элементом он является в const char *c ? нулевым или первым ?
Roman Pogosyan Опубліковано: 29 вересня, 2011 Автор Опубліковано: 29 вересня, 2011 наткнулся кажется на то в чем дело ... и так вопрос в тесте original содержит 16 символов, если скормить ему меньше к примеру 8, чем забьются остальные ?
madf Опубліковано: 29 вересня, 2011 Опубліковано: 29 вересня, 2011 вопрос byte2block там идет выражение *c++ каким элементом он является в const char *c ? нулевым или первым ? Постинкремент возвращает старое значение переменной. Значит нулевым.
madf Опубліковано: 29 вересня, 2011 Опубліковано: 29 вересня, 2011 наткнулся кажется на то в чем дело ... и так вопрос в тесте original содержит 16 символов, если скормить ему меньше к примеру 8, чем забьются остальные ? Ну минимальный же блок для шифрования 8 байт. 16 я уже не помню для чего сделал. Может и просто так.
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас