i try make python password generator with random seed from bytes.
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)
random.seed(bytes)
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)]
rndstr = ''.join(random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(8))
sys.stdout.write(rndstr)
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)
i try use the out put from 'bytes = [chr(reduce(lambda v,b:v<<1|b,bias[i-8:i], 0 )) for i in range(8,len(bias),8)]'
how seed for random for this .
'rndstr = ''.join(random.choice('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890') for i in range(8))
sys.stdout.write(rndstr)`
but i hv problem - it's not use bytes - it's use how seed word bytes :/ random.seed(bytes)
Aucun commentaire:
Enregistrer un commentaire