LINUX.ORG.RU

NIST объявляет открытым конкурс по созданию нового HASH алгоритма


0

0

Беря во внимание увеличивающуюся мощь компьютеров и вполне успешные атаки по уменьшению сложности подбора хэшей по алгоритмам SHA-1 и SHA-2, американский Национальный Институт по Стандартам и Технологиям (NIST) объявил открытым конкурс по созданию алгоритма хеширования третьего поколения SHA-3. Крайний срок подачи заявок и более подробную информацию о конкурсе можно найти здесь.

>>> Подробности

★★★★★

Проверено: Shaman007 ()

/*
 * Если этот алгоритм будет использоваться американскими военными,
 * а также госструктурами, то предлагаю свой вариант.
 */

int sha3_digest(char *text) {
    int digest = 0;
    // patented mega-security(tm) hashing algorhythm
    for (int i = 0; i < strlen(text), i++)
    {
        digest += text[i];
    }
    return digest;
}

eveel ★★
()
Ответ на: комментарий от eveel

безотносительно знания автоором определения слова "хеш", за такой код предлагаю расстреливать не месте.

Legioner ★★★★★
()
Ответ на: комментарий от eveel

Аффтар, выпей йаду!

P. S. Интересно, на сколько страниц раздуют флейм "аналитики" ЛОРа?

anonymous
()

Как все вышеперечисленые варианты будут считать хэш от бинарника где может встретится '\0'?

anonymous
()
Ответ на: комментарий от Sikon

Я бы делал
char* t;

for (t = text; *t; ++t) {
}

Суть в том, что вызов strlen (которая имеет сложность O(N)) в цикле чудесным образом превращает линейный алгоритм в квадратичный.

Legioner ★★★★★
()
Ответ на: комментарий от Sikon

> А надо как?

ну хотя бы так:

while (*text) digest += *text++;

всё же лучше "оригинального" варианта...

arsi ★★★★★
()

Си устарел, вы ничего не понимаете в программировании. Надо переписать на жабе, мне говорили это круто и энтерпрайзъ.

anonymous
()

В комментах - зачотный детский сад.

Deleted
()
Ответ на: комментарий от Legioner

>Суть в том, что вызов strlen (которая имеет сложность O(N)) в цикле чудесным образом превращает линейный алгоритм в квадратичный.

С чего это? Значение вычисляется один раз и сохраняется в стеке или регистре, после чего с ним сравнивается переменная в цикле. Как был O(N) так и останется. Может оказаться даже эффективнее, т.к. запрос из памяти байта при каждой итерации вызовет чтение бОльших блоков, которые хоть и сохранятся в кеше, но могут быть оттуда удалены...

anonymous
()
Ответ на: комментарий от Deleted

>strlen вызывается при каждой итерации

Перепутал с shell:

#!/bin/sh

for f in `ls -1 && echo qwe > /dev/stderr`; do echo $f > /dev/null done

$ /bin/sh ./test.sh qwe

anonymous
()
Ответ на: комментарий от Deleted

> strlen вызывается при каждой итерации

Вычислим заранее и не будем считать

bobrik
()
Ответ на: комментарий от anonymous

>Господа! Не обижайтесь, но Вы идиоты, господа.

+1. Я бы сказал д@лбаебы! гении нах не позорьтесь! Позорище!

anonymous
()
Ответ на: комментарий от AlannY

>Так есть уже и SHA-384 и SHA-512. Чего им ещё надо?

Надо sha-4096 и sha-8192

anonymous
()
Ответ на: комментарий от AlannY

512? Это какой век? SHA-2007 Enterprise Edition.

anonymous
()
Ответ на: комментарий от eveel

молодец, осталось только разработать легенду и заслать тебя туда к ним для построения у них светлого мега-защищеного будущего

anonymous
()
Ответ на: комментарий от eveel

Предлагаю светлую, радужную, но не очень реальную идею. Свести решение реально полезной прикладной задачи к `взлому` реализуемого нами хеша. Как только появится алгоритм, ломающий хеш за разумное время, так сразу появляется алгоритм для решение нашей прикладной задачи за разумное время.

Звучит как-то странно, но польза от этого со всех сторон есть.

skwish ★★
()
Ответ на: комментарий от Legioner

> Суть в том, что вызов strlen (которая имеет сложность O(N)) в цикле чудесным образом превращает линейный алгоритм в квадратичный.

Суть в том, что компилятор - не дурак и производит банальную оптимизацию, вызывая strlen() единственный раз - перед началом цикла:

8048379: 8b 5d 08 mov 0x8(%ebp),%ebx
804837c: fc cld
804837d: b9 ff ff ff ff mov $0xffffffff,%ecx
8048382: 31 c0 xor %eax,%eax
8048384: 89 df mov %ebx,%edi
8048386: f2 ae repnz scas %es:(%edi),%al
8048388: f7 d1 not %ecx
804838a: 83 e9 01 sub $0x1,%ecx
804838d: 31 d2 xor %edx,%edx
804838f: 31 ff xor %edi,%edi
8048391: eb 09 jmp 804839c <digest+0x28>
8048393: 0f be 04 1a movsbl (%edx,%ebx,1),%eax
8048397: 01 c7 add %eax,%edi
8048399: 83 c2 01 add $0x1,%edx
804839c: 39 ca cmp %ecx,%edx
804839e: 75 f3 jne 8048393 <digest+0x1f>

anonymous
()

предлагаю такой алгоритм:

#!/bin/bash

md5sum $0

Spinal
()
Ответ на: комментарий от anonymous

Гарантировать, что вызов strlen всегда возвращает одну и ту же длину можно было бы, если бы для строки использовался immutable-тип. А здесь в процессе выполнения цикла содержание строки может измениться.

anonymous
()
Ответ на: комментарий от anonymous

Если может измениться, то пишем словечко volatile (изменяемый) перед именем переменной.

Vshmuk

anonymous
()
Ответ на: комментарий от anonymous

>Гарантировать, что вызов strlen всегда возвращает одну и ту же длину можно было бы, если бы для строки использовался immutable-тип. А здесь в процессе выполнения цикла содержание строки может измениться.

Рискну предположить, что компилятор не такой дурак, и отслеживает возможность изменения длины строки.

anonymous
()
Ответ на: комментарий от anonymous

>Если может измениться, то пишем словечко volatile (изменяемый) перед именем переменной.

На сколько я знаю, квалификатор volatile указывает, что значение переменной может измениться независимо от программы. Тот anonymous имел в виду изменение длины строки в теле цикла самой программой. В этом случае см. мой предыдущий пост.

anonymous
()
Ответ на: комментарий от anonymous

А как надо объявлять strlen, чтобы сказать компилятору, что она всегда для одного и того же аргумента возвращает одно и то же значение?

yz
()
Ответ на: комментарий от anonymous

> Суть в том, что компилятор - не дурак и производит банальную оптимизацию

О да! Надеяться на оптимизации компилятора это высший пилотаж. К сожалению я пока не достиг просветления, и не возьмусь даже перечислить компиляторы, которые умеют подобное делать, не говоря уже о том, чтобы быть уверенным, что в данной конкретной ситуации он сможет провести эту (нифига не банальную, и, как мне кажется, некорректную) оптимизацию. Так что мы лучше по старинке, будем писать код, который гарантированно быстр, а не теоретически под gcc-5 -O999

Legioner ★★★★★
()

Предлагаю модераторам снести всё вышесказанное как злостный оффтоп. Господа раздули слона не из мухи, а из пустого места. Апплодирую стоя.

const86 ★★★★★
()
Ответ на: комментарий от const86

>Предлагаю модераторам снести всё вышесказанное как злостный оффтоп. Господа раздули слона не из мухи, а из пустого места. Апплодирую стоя.

Полностью поддерживаю. Ни одного сообщения по теме. Прошу прощения за те два сообщения, которые я здесь поместил. Был не очень трезв. Пожалуйста, удалите их, и это тоже.

anonymous
()

/me подумывает о разработке алгоритма под кодовым названием "Red Hash", действующего по принципу: всё отнять и поделить. :)

atrus ★★★★★
()

Даёшь ГОСТовскую имитовставку в качестве стандарта хеширования!

Macil ★★★★★
()
Ответ на: комментарий от yz

>А как надо объявлять strlen, чтобы сказать компилятору, что она всегда для одного и того же аргумента возвращает одно и то же значение?

Для GCC кажись так:

size_t strlen(const char *s) __attribute__ ((const));

smartly ★★★
()
Ответ на: комментарий от smartly

>size_t strlen(const char *s) __attribute__ ((const));

Точнее, так:

size_t strlen(const char *s) __attribute__ ((pure));

smartly ★★★
()
Ответ на: комментарий от eveel

Спасибо, человече, что поднял настроение. Уважаю.

>int sha3_digest(char *text) {
    int digest = 0;
    // patented mega-security(tm) hashing algorhythm
    for (int i = 0; i < strlen(text), i++)
    {
        digest += text[i];
    }
    return digest;
}

anonymous
()
Ответ на: комментарий от anonymous

> А здесь в процессе выполнения цикла содержание строки может измениться.

Покажи где в данном случае оно может измениться? :)

anonymous
()
Ответ на: комментарий от Legioner

> К сожалению я пока не достиг просветления, и не возьмусь даже перечислить компиляторы, которые умеют подобное делать

Компиляторы тупы, к тому же не используют MMX и SSE-регистры. Так что самый верный способ - писать все на ассемблере. ;)

> нифига не банальную, и, как мне кажется, некорректную

Исправьте gcc. ;)

> а не теоретически под gcc-5 -O999

Практически - gcc3+ -O2+.

anonymous
()

Предлагаю суперустойчивый мегаинновационный алгоритм хеширования:

unsigned long* digest(char* str)
{
char *dig;
int i,len;

len=strlen(str);

dig = (char*)malloc(len);
if (!dig) return NULL;

memset(dig,0,len);

for(i=0;i<len;i++) {
dig[i]=str[i];
}

return (unsigned long*)dig;
}

И специальную модификацию алгоритма тройной надежности для военного и космического применения:

unsigned long* digest(char* str)
{
char *dig;
int i,j,len;

len=strlen(str);

dig = (char*)malloc(len);
if (!dig) return NULL;

memset(dig,0,3*len);

for(i=0;i<3;i++)
for(j=0;j<len;j++) {
dig[i*len+j]=str[j];
}

return (unsigned long*)dig;
}

anonymous
()
Ответ на: комментарий от anonymous

len=strlen(str);

- dig = (char*)malloc(len);
+ dig = (char*)malloc(3*len);
if (!dig) return NULL;

memset(dig,0,3*len);

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.