Как я могу использовать случайное начальное число с массивом char вместо int в C?
Я хочу использовать пароль, а не число, но srand
принимает только целые числа.
Есть ли способ сделать это?
Srand с массивом символов в C?
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
Да, я знаю. Я шифрую координаты пикселей в изображении для стеганографии. Это безопасно, потому что байты скрытых данных разбиты на двоичные файлы, поэтому невозможно узнать, как изменить порядок данных без случайного начального числа. Даже для очень небольшого объема данных вы можете изменить его порядок так, как хотите. Таким образом, не было бы никакого способа узнать, каким образом его следует переупорядочить. Это звучит правильно?
- person jackcogdill; 13.04.2014
Я предполагаю, что уязвимость в этом будет заключаться в длине пароля для грубой силы.
- person jackcogdill; 13.04.2014
Чтобы защититься от грубой силы, я могу просто хэшировать пароль 65536 раз или что-то в этом роде.
- person jackcogdill; 13.04.2014
Хорошо, я думаю, я должен просто зашифровать данные в конце концов.
- person jackcogdill; 13.04.2014