Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.68/22: Рейтинг темы: голосов - 22, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
1

Рандом в пайтон (аппаратный рандом для генерации паролей)

14.06.2017, 05:27. Просмотров 4516. Ответов 49
Метки нет (Все метки)

суть такова есть такой скрипт на питоне

Python
1
2
3
4
5
6
7
8
9
10
11
12
wavBuf = dwParam1.contents
        if wavBuf.dwBytesRecorded >  0 :
            bits = [ord(wavBuf.lpData[i]) & 1 for i in range( 0 ,wavBuf.dwBytesRecorded,2)]
            bias = [bits[i] for i in range( 0 ,len(bits),2) if bits[i] != bits[i+1]]
            bytes =  [chr(reduce(,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]
            random.seed(''.join(bytes))
            #print (''.join(bytes))
            #rndstr = ''.join(bytes)
            rndstr = ''.join(random.choice('1234567890') for i in range(9))
            #rndstr = ''.join(random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(8))
            sys.stdout.write(rndstr)
            sys.stdout.write(rndstr + '\n')
как можно заметить по закоментированным строкам кода , я пытался прикрутить сюда генератор случайных чисел для рандома в качестве seed.

Python
1
bytes =  [chr(reduce(,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]
но проблема в том что после прикручивания в качестве seed, вся энтропия ушла на нет.

И мой вопрос заключается в том как мне переделать этот код

Python
1
2
3
            bits = [ord(wavBuf.lpData[i]) & 1 for i in range( 0 ,wavBuf.dwBytesRecorded,2)]
            bias = [bits[i] for i in range( 0 ,len(bits),2) if bits[i] != bits[i+1]]
            bytes =  [chr(reduce(,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]
что бы он выполнял функцию
Python
1
random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(8))
самостоятельно , в гугле информации не нашел даже способ подключить в качестве сида найден был методом тыка.

Надеюсь на вашу помощь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2017, 05:27
Ответы с готовыми решениями:

Рандом числа
Нужно сделать чтобы рандомом добавлялось рандомное кол-во чисел от -100 до 100. Я собираюсь это...

Интересная задача. Рандом. Масив
Ребят, дали задание всё никак не розберусь, вся надежда на вас. Нужно написать програму которая...

подскажите как сделать Рандом в питоне 3
задание такое: нужно чтобы при нажатии выкидывались рандомные слова, но эти слова должны...

Как сделать рандом из списка где элементы типа str Несколько раз на пироне
Надо в переменную a сделать рандом из списка s чтобы элементы не повторялись т.е a =...

49
427 / 419 / 159
Регистрация: 21.05.2016
Сообщений: 1,334
14.06.2017, 05:35 2
FYI
The pseudo-random generators of this module should not be used for security purposes. For security or cryptographic uses, see the secrets module.
https://docs.python.org/3/library/random.html
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
14.06.2017, 06:27  [ТС] 3
тут находится перевод битов в байте а потом в символы. Но как сделать выше описанное не могу понять. Так как весь смысл затеи теряется при потере энтропии и результат генерации перестает проходить тесты , банальное сжатие архиватором становится возможным на 35%

Python
1
bytes =  [chr(reduce(,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]
Добавлено через 2 минуты
Цитата Сообщение от oldnewyear Посмотреть сообщение
FYI
The pseudo-random generators of this module should not be used for security purposes. For security or cryptographic uses, see the secrets module.
https://docs.python.org/3/library/random.html
Ну я и пытаюсь избавится от стандартного рандома , а модули тот же псевдо рандом и не применимы.

Добавлено через 9 минут
не могу понять, секрет модулем нужно заменять random.seed ?

Добавлено через 28 минут
Прочитал я про секреты и так и не понял как я них задать источником случайных чисел тот код. И в нем также написано не используйте для криптографических целей так как это такой же не надежный псевдо генератор.
И зачем мне использовать псевдо генератор который на винде бесполезен так как на ней нет dev/random который и на linux к сожалению скорость не отличается. Когда у меня есть код который генерирует случайные числа и которые проходят все тесты на выборке из 100 файлов по 20 мб. Я спросил про способ поправить то что есть , а не про замену которая и 1 теста и пройдет и вовсе не будет даже работать на моей ос.

Добавлено через 7 минут
Да и это 3 питон, а я использую 2.7.13 да и нет гарантии что получится код переделать под 3 питон.
0
427 / 419 / 159
Регистрация: 21.05.2016
Сообщений: 1,334
14.06.2017, 06:32 4
Не совсем понятно.
seed нужен для инициализации генератора, запускается один раз
random.seed()
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
14.06.2017, 06:35  [ТС] 5
Цитата Сообщение от oldnewyear Посмотреть сообщение
Не совсем понятно.
seed нужен для инициализации генератора, запускается один раз
random.seed()
правильно по умолчанию он берет системное время, я эму пытался кормить выхлоп из генератора случайных чисел. А учитывая тот факт что он кок раз берет отсчет от 1 значения что ему скормят и дальше ему плевать на ГЧС...

Потому и я получал в итоге не какую энтропию. Сам ГЧС берет биты с шумящей старой звуковой карты , дальше унбасит и на выходе получаются числа хорошего качества.
А сидировать ими стандартный рандом бессмысленно как я понял. Так как все равно рандом изгадит все своим алгоритмом.
0
427 / 419 / 159
Регистрация: 21.05.2016
Сообщений: 1,334
14.06.2017, 06:45 6
Цитата Сообщение от tseriess Посмотреть сообщение
правильно по умолчанию он берет системное время, я эму пытался кормить выхлоп из генератора случайных чисел.
None or no argument seeds from current time or from an operating system specific randomness source if available

Добавлено через 4 минуты
Цитата Сообщение от tseriess Посмотреть сообщение
А сидировать ими стандартный рандом бессмысленно как я понял. Так как все равно рандом изгадит все своим алгоритмом.
ну да, на то он и псевдо рандом. Два рандома с одинаковым сидом выдадут идентичный результат
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
14.06.2017, 06:45  [ТС] 7
Цитата Сообщение от oldnewyear Посмотреть сообщение
system specific randomness source
под этим подразумевается или dev/random или дорогой аппаратный ГЧС, эму же не указать откуда брать не как ? Во всяком случае я не нашел. Но у меня большие сомнения что он станет брать с шумящей звуковой, также непонятно 1 раз он запрашивает или каждый раз при генерации.
0
427 / 419 / 159
Регистрация: 21.05.2016
Сообщений: 1,334
14.06.2017, 06:48 8
Цитата Сообщение от tseriess Посмотреть сообщение
под этим подразумевается или dev/random или дорогой аппаратный ГЧС, эму же не указать откуда брать не как ? Во всяком случае я не нашел. Но у меня большие сомнения что он станет брать с шумящей звуковой, также непонятно 1 раз он запрашивает или каждый раз при генерации.
берет один раз из /dev/urandom
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
14.06.2017, 06:52  [ТС] 9
Тогда он без полезен если c urandoma и даже не с dev/randoma, потому я и хочу прикрутить к этой генерации случайных чисел. Что бы каждый новый результат был с новым случайным числом. А не матеметически перемноженная последовательность. Ну или хотя бы стандартный рандом заставить брать каждый раз новый сид, а не как сейчас, дал ему поток случайных данных в сид, а он одно взял и остальные в некуда идут.
0
427 / 419 / 159
Регистрация: 21.05.2016
Сообщений: 1,334
14.06.2017, 06:54 10
seed без аргумента инициализирует генератор наилучшим доступным способом. Скармливать ему значение нужно только если необходимо получить предсказуемый набор чисел на выходе генератора
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
14.06.2017, 06:59  [ТС] 11
как он поймет что ему нужно брать случайные числа с кода а не от времени и тд ? Вот весь код что бы было понятней

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import sys
import time
from ctypes import *
import random
 
def MMSYSERR_NOERROR(value):
    if value !=  0 :
        raise Exception("Error while running winmm.dll function", value)
    return value
 
for funcname in ["waveInOpen", "waveInPrepareHeader",
                 "waveInAddBuffer", "waveInStart",
                 "waveInStop", "waveInReset",
                 "waveInUnprepareHeader", "waveInClose"]:
    vars()[funcname] = windll.winmm[funcname]
    vars()[funcname].restype = MMSYSERR_NOERROR
    
    time.sleep(1)
 
 
class WAVEFORMATEX(Structure):
    WAVE_FORMAT_PCM = 1
    _fields_ = [("wFormatTag", c_ushort),
                ("nChannels", c_ushort),
                ("nSamplesPerSec", c_uint),
                ("nAvgBytesPerSec", c_uint),
                ("nBlockAlign", c_ushort),
                ("wBitsPerSample", c_ushort),
                ("cbSize", c_ushort)]
 
    def __init__(self, samples=48000, bits=16, channels=1):
        self.wFormatTag = WAVEFORMATEX.WAVE_FORMAT_PCM
        self.nSamplesPerSec = samples
        self.wBitsPerSample = bits
        self.nChannels = channels
        self.nBlockAlign = int(self.nChannels*self.wBitsPerSample/8)
        self.nAvgBytesPerSec = self.nBlockAlign*self.nSamplesPerSec
        self.cbSize =  0 
 
class WAVEHDR(Structure):
    _fields_ = [("lpData", POINTER(c_char)),
                ("dwBufferLength", c_uint),
                ("dwBytesRecorded", c_uint),
                ("dwUser", c_uint), # User data dword or pointer
                ("dwFlags", c_uint),
                ("dwLoops", c_uint),
                ("lpNext", c_uint), # pointer reserved
                ("reserved", c_uint)] # pointer reserved
    def __init__(self, waveformat):
        self.dwBufferLength = waveformat.nAvgBytesPerSec
        self.lpData = create_string_buffer('\000' * self.dwBufferLength)
        self.dwFlags =  0
 
waveFormat = WAVEFORMATEX(samples=48000,bits=16)
waveBufferArray = [WAVEHDR(waveFormat) for i in range(3)]       
 
WRITECALLBACK = WINFUNCTYPE(None, c_uint, c_uint, POINTER(c_uint), POINTER(WAVEHDR), c_uint)
 
 
def pythonWriteCallBack(HandleWaveIn, uMsg, dwInstance, dwParam1, dwParam2):
    MM_WIM_CLOSE = 0x3BF
    MM_WIM_DATA = 0x3C0
    MM_WIM_OPEN = 0x3BE
    if   uMsg == MM_WIM_OPEN:
        '''print ("Open handle =", HandleWaveIn)'''
    elif uMsg == MM_WIM_CLOSE:
        '''print ("Close handle =", HandleWaveIn)'''
    elif uMsg == MM_WIM_DATA:
        #print "Data handle =", HandleWaveIn
        wavBuf = dwParam1.contents
        if wavBuf.dwBytesRecorded >  0 :
            bits = [ord(wavBuf.lpData[i]) & 1 for i in range( 0 ,wavBuf.dwBytesRecorded,2)]
            bias = [bits[i] for i in range( 0 ,len(bits),2) if bits[i] != bits[i+1]]
            bytes =  [chr(reduce(lambda v,b:v<<1|b,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]
            random.SystemRandom(''.join(bytes))
            #print (''.join(bytes))
            #rndstr = ''.join(bytes)
            rndstr = ''.join(random.choice('1234567890') for i in range(9))
            #rndstr = ''.join(random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(8))
            #sys.stdout.write(rndstr)
            sys.stdout.write(rndstr + '\n')
            
            
        if wavBuf.dwBytesRecorded == wavBuf.dwBufferLength:
            waveInAddBuffer(HandleWaveIn, dwParam1, sizeof(waveBuf))
        else:
            #print ("Releasing one buffer from", dwInstance[ 0 ])
            dwInstance[ 0 ]-=1
    else:
        raise "Unknown message"
        
        
writeCallBack=WRITECALLBACK(pythonWriteCallBack)
try:
    ExitFlag = c_uint(3)
    HandleWaveIn = c_uint( 0 )
    WAVE_MAPPER = c_int(-1)
    WAVE_FORMAT_QUERY = c_int(1)
    CALLBACK_FUNCTION = c_int(0x30000)
 
    waveInOpen( 0 , WAVE_MAPPER, byref(waveFormat),  0 ,  0 , WAVE_FORMAT_QUERY)
    waveInOpen(byref(HandleWaveIn), WAVE_MAPPER, byref(waveFormat), writeCallBack, byref(ExitFlag), CALLBACK_FUNCTION)
 
    for waveBuf in waveBufferArray:
        waveInPrepareHeader(HandleWaveIn, byref(waveBuf), sizeof(waveBuf))
        waveInAddBuffer(HandleWaveIn, byref(waveBuf), sizeof(waveBuf))
    
    waveInStart(HandleWaveIn)
    while 1:
        time.sleep(1)
        
 
except KeyboardInterrupt:
    waveInReset(HandleWaveIn)
    while 1:
        time.sleep(1)
        if ExitFlag.value ==  0 :
            break
    for waveBuf in waveBufferArray:
        time.sleep(1)
        waveInUnprepareHeader(HandleWaveIn, byref(waveBuf), sizeof(waveBuf))
 
    waveInClose(HandleWaveIn)
0
427 / 419 / 159
Регистрация: 21.05.2016
Сообщений: 1,334
14.06.2017, 07:09 12
Как то так может попробовать?
Python
1
2
3
4
5
6
for i in range(8):
    # здесь получить новый bytes
    # bytes = ....
 
    random.seed(''.join(bytes))
    rndstr += random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890'
1
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
14.06.2017, 07:12  [ТС] 13
не важно как его инициализировать , задача или вовсе убрать рандом и заменить его кодом который сам все на основе потока случайных данных перемешает, или кормить в сид каждою генерацию новые данные. В чем изначально и заключалась цель. Но как и положено нечего не вышло так как в при запуске цикла он считает с первого захваченного сида а не принимает новые данные.
0
427 / 419 / 159
Регистрация: 21.05.2016
Сообщений: 1,334
14.06.2017, 07:17 14
Цитата Сообщение от tseriess Посмотреть сообщение
Но как и положено нечего не вышло так как в при запуске цикла он считает с первого захваченного сида а не принимает новые данные.
В моем цикле seed всегда новый и в каждой итерации он инициализирует генератор вашим случайным числом, взятым из bytes. Таким образом генератор вообще ничего не генерирует, но позволяет использовать ваше случайное число с random.choice
1
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
14.06.2017, 07:22  [ТС] 15
что то не то вышло)
Код
            for i in range(8):
                random.seed(''.join(bytes))
                #print (''.join(bytes))
                #rndstr = ''.join(bytes)
                rndstr = ''.join(random.choice('1234567890') for i in range(9))
                #rndstr = ''.join(random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(8))
                #sys.stdout.write(rndstr)
                sys.stdout.write(rndstr + '\n')

по 8 раз повторяет
Код
702637597
702637597
702637597
702637597
702637597
702637597
702637597
702637597
411098753
411098753
411098753
411098753
411098753
411098753
411098753
411098753
680467941
680467941
680467941
680467941
680467941
680467941
680467941
680467941
случайные числа зацикливать нет смысла они и так каждый цикл новые, или я тормозу уже от недосыпа

Добавлено через 2 минуты
все таки что то не то даже так

Код
               
                bytes =  [chr(reduce(lambda v,b:v<<1|b,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]
                random.seed(''.join(bytes))
                #print (''.join(bytes))
                #rndstr = ''.join(bytes)
                rndstr = ''.join(random.choice('1234567890') for i in range(9))
                #rndstr = ''.join(random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(8))
                #sys.stdout.write(rndstr)
                sys.stdout.write(rndstr + '\n')
0
427 / 419 / 159
Регистрация: 21.05.2016
Сообщений: 1,334
14.06.2017, 07:26 16
Цитата Сообщение от tseriess Посмотреть сообщение
что то не то вышло)
Код
            for i in range(8):
                random.seed(''.join(bytes))
                #print (''.join(bytes))
                #rndstr = ''.join(bytes)
                rndstr = ''.join(random.choice('1234567890') for i in range(9))
                #rndstr = ''.join(random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(8))
                #sys.stdout.write(rndstr)
                sys.stdout.write(rndstr + '\n')
Ну дык у вас bytes один и тот же, надо в каждой итерации новый bytes получать
1
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
14.06.2017, 10:59  [ТС] 17
Цитата Сообщение от oldnewyear Посмотреть сообщение
Ну дык у вас bytes один и тот же, надо в каждой итерации новый bytes получать
биты каждый раз новые, он просто не желает их получать :/

биты он берет от сюда
Python
1
bytes =  [chr(reduce(lambda v,b:v<<1|b,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]
они каждый раз новые

даже так нечего не меняется

Python
1
2
3
4
5
6
7
8
9
10
11
            for i in range(8):
                bits = [ord(wavBuf.lpData[i]) & 1 for i in range( 0 ,wavBuf.dwBytesRecorded,2)]
                bias = [bits[i] for i in range( 0 ,len(bits),2) if bits[i] != bits[i+1]]
                bytes =  [chr(reduce(lambda v,b:v<<1|b,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]
                random.seed(''.join(bytes))
                print (''.join(bytes))
                #rndstr = ''.join(bytes)
                rndstr = ''.join(random.choice('1234567890') for i in range(9))
                #rndstr = ''.join(random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(8))
                #sys.stdout.write(rndstr)
                sys.stdout.write(rndstr + '\n')
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
261305451
    uÒòi&<$pô$tヒôᄇÇècᄇÀÙÚワ+i[_テモ=gl!GンO÷ユè
609877255
    uÒòi&<$pô$tヒôᄇÇècᄇÀÙÚワ+i[_テモ=gl!GンO÷ユè
609877255
    uÒòi&<$pô$tヒôᄇÇècᄇÀÙÚワ+i[_テモ=gl!GンO÷ユè
609877255
    uÒòi&<$pô$tヒôᄇÇècᄇÀÙÚワ+i[_テモ=gl!GンO÷ユè
609877255
    uÒòi&<$pô$tヒôᄇÇècᄇÀÙÚワ+i[_テモ=gl!GンO÷ユè
609877255
    uÒòi&<$pô$tヒôᄇÇècᄇÀÙÚワ+i[_テモ=gl!GンO÷ユè
609877255
    uÒòi&<$pô$tヒôᄇÇècᄇÀÙÚワ+i[_テモ=gl!GンO÷ユè
609877255
    uÒòi&<$pô$tヒôᄇÇècᄇÀÙÚワ+i[_テモ=gl!GンO÷ユè
609877255
ì*Ó×çGgᄅáÔ6ᄒPマ゙ム"ヌI-ヌ û4+.ᄑ጖ᄅ+Àm,"öfᆭ
731398752
ì*Ó×çGgᄅáÔ6ᄒPマ゙ム"ヌI-ヌ û4+.ᄑ጖ᄅ+Àm,"öfᆭ
731398752
ì*Ó×çGgᄅáÔ6ᄒPマ゙ム"ヌI-ヌ û4+.ᄑ጖ᄅ+Àm,"öfᆭ
731398752
ì*Ó×çGgᄅáÔ6ᄒPマ゙ム"ヌI-ヌ û4+.ᄑ጖ᄅ+Àm,"öfᆭ
731398752
ì*Ó×çGgᄅáÔ6ᄒPマ゙ム"ヌI-ヌ û4+.ᄑ጖ᄅ+Àm,"öfᆭ
731398752
ì*Ó×çGgᄅáÔ6ᄒPマ゙ム"ヌI-ヌ û4+.ᄑ጖ᄅ+Àm,"öfᆭ
731398752
ì*Ó×çGgᄅáÔ6ᄒPマ゙ム"ヌI-ヌ û4+.ᄑ጖ᄅ+Àm,"öfᆭ
731398752
ì*Ó×çGgᄅáÔ6ᄒPマ゙ム"ヌI-ヌ û4+.ᄑ጖ᄅ+Àm,"öfᆭ
731398752
a&ᅠ08ҊミðQÿTÌèÇS@ᆲÙfóBPÃîø  Ø"}ᄁ0SÉ#ᆴᄈMトÓÚùuニᄄÜÃäワDムßø4゙リËnݎìöタQô1ODᄚa|káeフñ﾿マKɒ!ᆬvC
957141403
a&ᅠ08ҊミðQÿTÌèÇS@ᆲÙfóBPÃîø  Ø"}ᄁ0SÉ#ᆴᄈMトÓÚùuニᄄÜÃäワDムßø4゙リËnݎìöタQô1ODᄚa|káeフñ﾿マKɒ!ᆬvC
957141403
a&ᅠ08ҊミðQÿTÌèÇS@ᆲÙfóBPÃîø  Ø"}ᄁ0SÉ#ᆴᄈMトÓÚùuニᄄÜÃäワDムßø4゙リËnݎìöタQô1ODᄚa|káeフñ﾿マKɒ!ᆬvC
957141403
a&ᅠ08ҊミðQÿTÌèÇS@ᆲÙfóBPÃîø  Ø"}ᄁ0SÉ#ᆴᄈMトÓÚùuニᄄÜÃäワDムßø4゙リËnݎìöタQô1ODᄚa|káeフñ﾿マKɒ!ᆬvC
957141403
a&ᅠ08ҊミðQÿTÌèÇS@ᆲÙfóBPÃîø  Ø"}ᄁ0SÉ#ᆴᄈMトÓÚùuニᄄÜÃäワDムßø4゙リËnݎìöタQô1ODᄚa|káeフñ﾿マKɒ!ᆬvC
957141403
a&ᅠ08ҊミðQÿTÌèÇS@ᆲÙfóBPÃîø  Ø"}ᄁ0SÉ#ᆴᄈMトÓÚùuニᄄÜÃäワDムßø4゙リËnݎìöタQô1ODᄚa|káeフñ﾿マKɒ!ᆬvC
957141403
a&ᅠ08ҊミðQÿTÌèÇS@ᆲÙfóBPÃîø  Ø"}ᄁ0SÉ#ᆴᄈMトÓÚùuニᄄÜÃäワDムßø4゙リËnݎìöタQô1ODᄚa|káeフñ﾿マKɒ!ᆬvC
957141403
a&ᅠ08ҊミðQÿTÌèÇS@ᆲÙfóBPÃîø  Ø"}ᄁ0SÉ#ᆴᄈMトÓÚùuニᄄÜÃäワDムßø4゙リËnݎìöタQô1ODᄚa|káeフñ﾿マKɒ!ᆬvC
957141403
Добавлено через 5 минут
я так понимаю нужно сбросить сид как то, что бы он новый получил, но сей вариант не срабатывает, как видно сид захваченный продолжает крутится всю сессию лишь дублируя все.

Добавлено через 7 минут
Так сработало

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def pythonWriteCallBack(HandleWaveIn, uMsg, dwInstance, dwParam1, dwParam2):
    for i in range(8):
        MM_WIM_CLOSE = 0x3BF
        MM_WIM_DATA = 0x3C0
        MM_WIM_OPEN = 0x3BE
        if   uMsg == MM_WIM_OPEN:
            '''print ("Open handle =", HandleWaveIn)'''
        elif uMsg == MM_WIM_CLOSE:
            '''print ("Close handle =", HandleWaveIn)'''
        elif uMsg == MM_WIM_DATA:
            #print "Data handle =", HandleWaveIn
            wavBuf = dwParam1.contents
            if wavBuf.dwBytesRecorded >  0 :
                bits = [ord(wavBuf.lpData[i]) & 1 for i in range( 0 ,wavBuf.dwBytesRecorded,2)]
                bias = [bits[i] for i in range( 0 ,len(bits),2) if bits[i] != bits[i+1]]
                bytes =  [chr(reduce(lambda v,b:v<<1|b,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]
                random.seed(''.join(bytes))
                #print (''.join(bytes))
                #rndstr = ''.join(bytes)
                rndstr = ''.join(random.choice('1234567890') for i in range(9))
                #rndstr = ''.join(random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(8))
                #sys.stdout.write(rndstr)
                sys.stdout.write(rndstr + '\n')
            
            
            if wavBuf.dwBytesRecorded == wavBuf.dwBufferLength:
                waveInAddBuffer(HandleWaveIn, dwParam1, sizeof(waveBuf))
            else:
                #print ("Releasing one buffer from", dwInstance[ 0 ])
                dwInstance[ 0 ]-=1
        else:
            raise "Unknown message"
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
333306818
956879429
507840893
404870102
848293744
554394465
010266195
398661328
129881258
009665383
514883135
992554128
077402504
431547166
027287229
688625707
584595659
067808356
493451197
357555861
885478514
412837074
604232410
144347489
904142847
Но точно ли сбрасывается он, как можно получить принт того что в сиде сейчас ?

Добавлено через 8 минут
судя по print random.random
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<built-in method random of Random object at 0x02CF8860>
269081605
<built-in method random of Random object at 0x02CF8860>
559639875
<built-in method random of Random object at 0x02CF8860>
187439386
<built-in method random of Random object at 0x02CF8860>
128253320
<built-in method random of Random object at 0x02CF8860>
655522406
<built-in method random of Random object at 0x02CF8860>
712227199
<built-in method random of Random object at 0x02CF8860>
508395334
<built-in method random of Random object at 0x02CF8860>
417999042
не сработало( так как при реинициализации число должно было бы изменится

Добавлено через 1 час 4 минуты
все таки не срабатывает это, по сжатию видно что энтропия утеряна. Или сид и вовсе не получает эти байты а откуда то с другого места берет. Или сид после запуска некуда не девается не взирая на for i in range(8):

Добавлено через 12 минут
если вывод в виде пасов без переноса строк попробовать сжать архиватором - он не должен терять не байта тогда оно работает. А щас на ура сжимает, соответственно не какой речи о нормальном рандоме нет и нет смысла пытаться кормить рандом. Надо генерацию вешать прямо сюда.

Python
1
bytes =  [chr(reduce(lambda v,b:v<<1|b,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]
Но я не понимаю как это правильно сделать. Щас тут генерируются 255 ASCII символа, их надо заметить на альфаметрик символы.

Добавлено через 1 час 50 минут
Как можно получить print сида который в данный момент используется ? Что бы точно убедится меняется ли он или нет.
0
554 / 294 / 189
Регистрация: 20.05.2016
Сообщений: 592
14.06.2017, 12:04 18
Цитата Сообщение от tseriess Посмотреть сообщение
Как можно получить print сида который в данный момент используется ?
Никак. Непосредственно он нигде не сохраняется. Можно глянуть getstste(), но состояние меняется не только при смене seed, - при каждом рандоме (не суть каким методом, фактически в основе их всех лежит одна сишная функция).

Цитата Сообщение от tseriess Посмотреть сообщение
так как при реинициализации число должно было бы изменится
Какое? Если 0x02CF8860, то - нет, не должно. Объект остается тем же, меняются только seed и, соответственно, состояние.
0
Эксперт Python
4005 / 2938 / 979
Регистрация: 28.10.2013
Сообщений: 7,633
14.06.2017, 18:40 19
Есть такая штука как random.org. И у них есть свой API.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from pprint import pprint
import requests
import random
 
rand_id = random.randint(0,100)
 
params = {
    "jsonrpc": "2.0",
    "method": "generateStrings",
    "params": {
        "apiKey": apiKey, # на API ключ
        "n": 100, # сколько хотим получить строк
        "length": 10,  # длина каждой строки
        "characters": "abcdefghijklmnopqrstuvwxyz1234567890", # набор символов
        "replacement": False # и, пожалуйста, сервер, давай без дубликатов
    },
    "id": rand_id  # случайный идентификатор; не знаю нужно ли его менять для каждого запроса
}
 
 
session = requests.Session()
results = set()
for i in range(0,10):
    rand_id = random.randint(0,100)
    resp = session.post('https://api.random.org/json-rpc/1/invoke',json=params)
    if resp.status_code == 200:
        result = resp.json()
        print(result['result']['random']['data'])
        results |= set(result['result']['random']['data'])
     
 
print('\nTotal:',len(results))
Рандом в пайтон (аппаратный рандом для генерации паролей)

Как говорят в одной известной телепередаче: "Повторов не было!"
Если учесть, что они используют atmospheric noise, то и не удивительно: c 1998 года этим web dev/urandom'ом пользуются для розыгрышей, лотерей, онлайн-игр и научных работ.
0
Эксперт Python
4005 / 2938 / 979
Регистрация: 28.10.2013
Сообщений: 7,633
14.06.2017, 19:02 20
P.S. Только, вот beta-key имеет, зараза, ограничения на число запросов и полученных бит информации в день.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2017, 19:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Рандом совсем не рандом
Здравствуйте,столкнулся с проблемой,что при создании рандомных координат,для вывода на экран...

Рандом: как исключить попадание в определенные значения?
Можно ли как то при получении рандомного числа функцией random.randrange(), исключить попадание в...

Рандом в списке
Есть список: LEVEL = Как мне рандомно заменить каждый '-' на '#'?

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.