Простой (для кодирования) защищают хеш-функцию

clang теперь поддерживает динамические проверки переполнения для целых чисел со знаком и без знака. Смотрите переключатель -fsanitize = integer . На данный момент это только один компилятор C ++ с полностью поддерживаемой динамической проверкой переполнения для целей отладки.

7
задан z5h 3 August 2009 в 00:25
поделиться

5 ответов

Если вы предпочитаете простоту и педагогическую ценность эффективности, то хеш-функция VSH может быть вариантом. Он содержит веские аргументы в пользу того, что VSH является хэш-функцией, устойчивой к коллизиям, хотя этой функции не хватает некоторых других свойств (например, псевдослучайности), которые есть у других хеш-функций.

2
ответ дан 6 December 2019 в 23:11
поделиться

Если вам нужна безопасная хеш-функция для реальной защиты чего-либо (скажем, как часть алгоритма шифрования), вам лучше всего будет использовать имплантацию библиотеки SHA-512 (или возможно, RIPEMD-160 или несколько других).

Если вы хотите, чтобы он использовался для хеширования паролей, я бы сказал, что хеш-функция, такая как MASH, будет соответствовать требованиям устойчивости к грубой силе (при использовании с солью) и радужным таблицам. Я бы по-прежнему не использовал его, если бы у меня не были строгие требования, запрещающие или запрещающие мне использовать имплементацию библиотеки - но похоже, что у вас могут быть только они.

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

4
ответ дан 6 December 2019 в 23:11
поделиться

Для ваших требований я бы проверил финалистов SHA-3 .

Если у вас есть примитив AES, реализованный для шифрования, вы можете повторно использовать его для реализации нескольких функций относительно просто.

В противном случае я бы выбрал Cubehash Даниэля Бернштейна. Похоже, в этом есть часть той "простой элегантности", которую вы искали.

2
ответ дан 6 December 2019 в 23:11
поделиться

Проверьте Источник TrueCrypt . Они реализуют несколько сильных хэш-функций. Просто стандартное предупреждение, неразумно изменять существующую реализацию или, что еще хуже, использовать свою собственную. Это почти наверняка вызовет слабость. Я понимаю, что вы здесь этого не делаете, а просто заявление об отказе от ответственности. :)

1
ответ дан 6 December 2019 в 23:11
поделиться

Согласно разделу 18. «Можно использовать алгоритм шифрования с открытым ключом в режиме цепочки блоков в качестве односторонней хэш-функции».

RSA (с отбрасываемым закрытым ключом) приведен в качестве примера. Безопасность так же высока, как и у RSA.

Этап шифрования RSA довольно прост в реализации. Особенно на языке, который имеет целые числа произвольного размера.

Два предостережения: 1. намного медленнее, чем большинство (всех) других безопасных хеш-функций. Что меня устраивает. 2. Если вы жестко закодировали свои открытые ключи в коде, мир должен был бы поверить, что вы отказались от данных своего личного ключа. Или создайте свои собственные открытые закрытые ключи.

Я отправлю код, как только у меня будет рабочий пример.

РЕДАКТИРОВАТЬ: Вот он. 30 строк. Просто. Надежно. РЕДАКТИРОВАТЬ 2: То, что я фактически включил, является вариантом и может не работать. Смотрите комментарии под этим сообщением и следите за обновлениями.

; compute a^d mod n
(define powmod
  (lambda (a d n)
    (cond 
      ((= 0 d) 1)
      ((= 1 d) (modulo a n))
      ((= 0 (modulo d 2)) (modulo (expt (powmod a (/ d 2) n) 2) n))
      (else
        (modulo (* (powmod a 1 n) (powmod a (- d 1) n)) n)))))

(define foldr
  (lambda (func end lst)
    (if (null? lst)
      end
      (func (car lst) (foldr func end (cdr lst))))))

; something to turn a string into a number
(define any-string->number
  (lambda (s)
    (foldr
      (lambda (a b) (+ a (* 256 b)))
      0
      (map char->integer (string->list s)))))

; some big primes
(define p 325981479175658910158495167696993467513669112200235950741366213684181287869366665231)
(define q 930416184994449450269535709442344346507738432154879695027334802205487824589832585453)

; hash turns a string into a number
; see discrete logarithms. the inverse of this is *hard* to compute
; http://en.wikipedia.org/wiki/Discrete_logarithm
(define hash
  (lambda (s)
    (powmod (any-string->number s) p q)))
2
ответ дан 6 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: