Srand с массивом символов в C?

Как я могу использовать случайное начальное число с массивом char вместо int в C?
Я хочу использовать пароль, а не число, но srand принимает только целые числа.
Есть ли способ сделать это?


person jackcogdill    schedule 13.04.2014    source источник
comment
Одним из способов было бы создать хэш строки и использовать полученное целое число в качестве начального числа.   -  person Edward    schedule 13.04.2014
comment
@CPlusPlusOOAandD Прочитайте вопрос еще раз. Я совсем не об этом спрашиваю.   -  person jackcogdill    schedule 13.04.2014
comment
@yentup Мне кажется, что Эдвард ответил правильно, то есть используя хэш-функцию для получения int из вашего пароля и используя этот int в качестве семени для srand (буквально передавая этот int в srand).   -  person Chnossos    schedule 13.04.2014
comment
@Chnossos, тогда ты знаешь лучшую хеш-функцию для этого?   -  person jackcogdill    schedule 13.04.2014
comment
@ Эдвард, ты знаешь, какую функцию хеширования лучше всего использовать?   -  person jackcogdill    schedule 13.04.2014
comment
Проверьте этот вопрос: stackoverflow.com/questions/7666509/hash-function -for-string, особенно принятый ответ stackoverflow.com/a/7666577/3460805.   -  person Chnossos    schedule 13.04.2014
comment
@BLUEPIXY, это нормально, но некоторые символы будут пропущены, если пароль слишком длинный.   -  person vonbrand    schedule 13.04.2014
comment
@vonbrand, как вы думаете, нужен ли такой длинный пароль?   -  person BLUEPIXY    schedule 13.04.2014
comment
@BLUEPIXY, просто не заставляйте пользователя думать, что это мой длинный пароль, на самом деле кодовая фраза, поскольку декабрь используется полностью, хотя на самом деле это не так.   -  person vonbrand    schedule 13.04.2014
comment
@vonbrand Я не думаю, что для определения начального числа требуется такой длинный пароль, а не защита паролем. Также я не думаю, что размер также свободен и хорош. Пожалуйста, введите пять символов регистра алфавита и большинство цифр. Я думаю, что это ограничение является разумным.   -  person BLUEPIXY    schedule 13.04.2014


Ответы (1)


Просто используйте хэш-функцию. Классика hash_pjw,

unsigned hash_pjw (const void *str)   
{
  const char *s = str;
  unsigned int g, h = 1234567u;
  while (*s != 0) {
    h = (h << 4) + *s++;
    if ((g = h & (unsigned int) 0xf0000000) != 0)
       h = (h ^ (g >> 24)) ^ g;
  }
  return h;
}

Обратите внимание, что rand() не имеет ничего общего с криптографической защитой.

person Gene    schedule 13.04.2014
comment
Да, я знаю. Я шифрую координаты пикселей в изображении для стеганографии. Это безопасно, потому что байты скрытых данных разбиты на двоичные файлы, поэтому невозможно узнать, как изменить порядок данных без случайного начального числа. Даже для очень небольшого объема данных вы можете изменить его порядок так, как хотите. Таким образом, не было бы никакого способа узнать, каким образом его следует переупорядочить. Это звучит правильно? - person jackcogdill; 13.04.2014
comment
Я предполагаю, что уязвимость в этом будет заключаться в длине пароля для грубой силы. - person jackcogdill; 13.04.2014
comment
Чтобы защититься от грубой силы, я могу просто хэшировать пароль 65536 раз или что-то в этом роде. - person jackcogdill; 13.04.2014
comment
Хорошо, я думаю, я должен просто зашифровать данные в конце концов. - person jackcogdill; 13.04.2014