[vb] Randomize functie programmeren in C

Pagina: 1
Acties:

  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
Ik ben bezig met het omzetten van een VB programma in C. In het VB programma wordt er gebruik gemaakt van rnd() en randdomize().

Om het programma te converteren moet ik deze volgens mij dus nabouwen.

De Rnd() functie heb ik al gevonden. Dit was een niet al te moeilijke functie. Alleen de Randomize functie om de seed aan te passen kan ik niet vinden.

Verwijderd

srand(unsigned int seed) gebruiken om de seed in te stellen, rand() om een random getal op te vragen. Zitten in stdlib.h.

  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
Maar die werkt toch anders dan de VB versie van RND. Het probleem is dat het voor encryptie gebruikt is en ik het encryptie programma nu in C wil knallen.

Ik moet dus wel dezelfde getallen genereren als het VB programma.

Verwijderd

random (in de meeste talen) geeft een waarde terug tussen 0 en 1. Waarom zou het nu dan anders zijn. Check de documentatie.

Verwijderd

INFO: How Visual Basic Generates Pseudo-Random Numbers for the RND Function (Q231847)

offtopic:
Iemand enig idee waarom deze niet in msdn te vinden is :?

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 09-09 19:23

Dido

heforshe

Je gebruikt als ik het goed begrijp je seed als key voor je encriptie? Lijkt me niet echt veilig om dan te vertrouwen op een ingebouwde functie om je "random" getallen te genereren... Als MS morgen met een update komt waarin de randomgenerator anders werkt komt je je gencrypte bestanden niet meer in...
Waarom gebruik je geen zelfstandige encryptiemethode?

Bijvoorbeeld een zelfgebouwde randomgenerator: een simpele, met een viercijferige seed: Xn+1=Xn^2, maar dan links en rechts weer afgekapt tot vier cijfers, dus

seed 1234
X1 = [01]5227[56]
X2 = [27]3215[29]

Ooit ergens gelezen dat die vrij random zijn...

'Kweet niet waar het precies voor is, maar DES is volledig gedocumenteerd en vrij veilig...

Wat betekent mijn avatar?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09-09 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 11 april 2002 17:17 schreef Yarvieh het volgende:
offtopic:
Iemand enig idee waarom deze niet in msdn te vinden is :?
hmmja waarom zouden ze? Van bijna geen enkele ingebouwde functie is de exacte implementatie in de msdn te vinden...

voor mensen die nog geinteresseerd zijn in een C-random functie (uit djgpp) (msvc++ compatible gemaakt door mijzelf):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Copyright (C) 1994, 1996, 1998, 1999 DJ Delorie */
static unsigned __int64 next = 1;

int rand(void)
{
    /* This multiplier was obtained from Knuth, D.E., "The Art of
    Computer Programming," Vol 2, Seminumerical Algorithms, Third
    Edition, Addison-Wesley, 1998, p. 106 (line 26) & p. 108 */

    next = next * 6364136223846793005L + 1;
    /* was: next = next * 0x5deece66dLL + 11; */
    return (int)((next >> 21) & DJ_RAND_MAX);
}

void srand(unsigned seed)
{
    next = seed;
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Op donderdag 11 april 2002 17:42 schreef .oisyn het volgende:
hmmja waarom zouden ze?
Omdat ik andere Q[insert random nummer here] articles wel kan vinden op m'n msdn cd'tjes?

  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
Op donderdag 11 april 2002 17:26 schreef Dido het volgende:
Je gebruikt als ik het goed begrijp je seed als key voor je encriptie? Lijkt me niet echt veilig om dan te vertrouwen op een ingebouwde functie om je "random" getallen te genereren... Als MS morgen met een update komt waarin de randomgenerator anders werkt komt je je gencrypte bestanden niet meer in...
Klopt grotendeels. Bij de encryptie wordt wel een key gebruikt maar verder leunt hij volledig op de 'feature' van de VB RNG dat hij zonder eerst Randomize aan te roepen altijd dezelfde rij getallen opdreunt.

Als MS dus met een dergelijke update zou komen zijn ze bij het bedrijf waar ik nu zit idd zwaar de kut.
Op donderdag 11 april 2002 17:26 schreef Dido het volgende:
Waarom gebruik je geen zelfstandige encryptiemethode?
Het probleem is dat iemand anders (van een andere instelling) deze in elkaar heeft gezet (of eigenlijk van internet geplukt denk ik, want ik kwam bijna de exacte source code tegen).
Hij is dus al in verschillende programma's in gebruik genomen.

Ik ben nu aan het proberen de encryptie in C te bouwen ipv VB (want hij is zo traag als de ziekte) maar ik kom er dus niet achter wat Randomize precies doet.

De Rnd() functie werkt dus met deze functie die hier wordt uitgelegd.
formule x1 = ( x0 * a + c ) MOD (2^24)

Als Randomize wordt aangeroepen veranderd de x0 volgens mij, ik weet alleen niet hoe, en ik kan het ook nergens vinden.

  • zerok
  • Registratie: November 2001
  • Laatst online: 08-09 00:04

zerok

geen

als je de seed van srand het zelfde houd krijg je dacht ik de zelfde rij met getallen. (zal het morgen eens uit proberen).

"never argue with idiots they drag you down to their level and beat you with experience" dilbert


  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
Ik begrijp er helemaal niks van |:(

In 10 seconden heb ik het Rnd() algoritme gevonden met C++ source code en al, en ik kan er NIET achter komen wat Randomize doet. Dit moet toch vast wel ergens gedocumenteerd zijn!!

Heeft iemand nog suggesties voor trefwoorden. Ik heb al op google en teoma gezocht met alle combinaties van 'Rnd' 'Randomize' 'algorithm' 'VB' 'Visual Basic' en nog wat loze woorden.

Verwijderd

in VBscript (dus misschien ook in VB):
Randomize uses number to initialize the Rnd function's random-number generator, giving it a new seed value. If you omit number, the value returned by the system timer is used as the new seed value.
Randomize = Randomize(Timer)

misschien heb je daar wat aan.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

Ik kan het mis hebben hoor, maar volgens mij maakt randomize gewoon de x0 gelijk aan zijn argument, en waneer je niks invult gelijk aan dui huidige tijd.

psuedo
code:
1
2
3
function Randomize(x = timestamp()) {
  x0 = x;
}

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
Op vrijdag 12 april 2002 11:35 schreef Janoz het volgende:
Ik kan het mis hebben hoor, maar volgens mij maakt randomize gewoon de x0 gelijk aan zijn argument, en waneer je niks invult gelijk aan dui huidige tijd.

psuedo
code:
1
2
3
function Randomize(x = timestamp()) {
  x0 = x;
}
Dat is bij de meeste talen wel zo, alleen bij VB nu weer net niet.

Als dit wel het geval zou zijn zou bv. na het aanroepen van Randomize(1000) steeds dezelfde reeks getallen moeten verschijnen. Dit gebeurt echter niet. De seed wordt wel aangepast, maar niet rechtstreeks overschreven.

  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
Ik heb wat testjes gedaan om te kijken hoe de seed veranderd bij het aanroepen van Randomize, maar ik ben er nog niet echt achter. Er zit wel een logica/algorithme achter, maar ik weet nog niet welke dat is.

Toch wel apart dat er niets over te vinden is op internet.

Verwijderd

#include <conio.h>
#include <iostream.h>
#include <stdlib.h>

void main(void) {
float fTest;
randomize(); // Maak random getal
fTest = 1 + random(100);
cout << fTest << flush;
getch();
}

Verwijderd

Op maandag 15 april 2002 19:24 schreef deadman iets zonder de rest van het topic te lezen
Volgende keer topic voor de grap eens lezen voor je 'n kwak code neergooit die nergens op slaat?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op maandag 15 april 2002 19:24 schreef deadman het volgende:
randomize(); // Maak random getal
Dat lijkt me geen ANSI-C. Ik ken 'm in ieder geval niet.

  • nhimf
  • Registratie: September 2000
  • Laatst online: 31-08 19:16

nhimf

Lekker belangrijk allemaal

randomize(); om de randomizer te initialiseren en dan rand() of random() gebruiken voor random getallen.
Je moet alleen wel de juiste headers nog includen.
(is d8 iets van math.h maar dat weet ik zo ff niet uit mijn hoofd, kan ook stdlib.h zijn ;))

Ik stink niet, ik ruik gewoon anders


  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 18-07 20:32

VisionMaster

Security!

Ik ben bang dat je een probleem heb om dit te doen. Zoals een aantal posts eerder werd verteld ligt het er maar net aan hoe C en hoe VB met hun randomize omgaan intern.

Gezien dit nou juist het hele idee is om NIET te vertellen aan de buitenwereld zal je er nooit achter kunnen komen hoe deze random getallen gecreerd zullen worden.

Om iets meer te kunnen helpen voor een work-around of zo iets dergelijks kan je hier meer info. plaatsten over je feitelijke probleem.

Er is bijvoorbeeld niet helemaal duidelijk hoe je encryptie methode werkt. Pas als deze info. op tafel komt kunnen we verder helpen.

veel succes

I've visited the Mothership @ Cupertino


Verwijderd

Andere oplossing kan nog zijn, de randomize en rnd functies in 'n com objectje te proppen en die te gebruiken vanuit je C App aan te roepen..

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Ten eerste wil ik even vermelden dat het gebruik van de 'gewone' random functies, zowel onder C als onder VisualBasic, niet geschikt zijn voor cryptografische doeleinden.

Verder werkt onder FreeBSD de C-variant als volgt: (waarbij ctx je seed/laatst gegeneerde getal is)
code:
1
 ((*ctx = *ctx * 1103515245 + 12345) % ((u_long)RAND_MAX + 1))

De VisualBasic versie was al bekend, dus ik mis een beetje wat nu verder je probleem is?

(Vooral die +12345 is wel grappig :))

Verwijderd

Op dinsdag 16 april 2002 00:10 schreef Soultaker het volgende:
De VisualBasic versie was al bekend, dus ik mis een beetje wat nu verder je probleem is?
de rnd van vb is bekend, de randomize niet..en daar zit ie mee.

  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
Op dinsdag 16 april 2002 00:26 schreef Yarvieh het volgende:

[..]

de rnd van vb is bekend, de randomize niet..en daar zit ie mee.
Inderdaad! Ik probeer nu maar om er een normale encryptie methode door te drukken. Zal wel weer wat gedoe worden met het updaten van de software maar op de langere termijn zal men me dankbaar zijn :)

Voorlopig hou ik er dus maar even mee op. Misschien dat ik binnenkort nog ff verder ga klooien maar ik ga nu maar weer eens verder met mijn eigenlijke werk.

Als ik er nog een keer achter kom hoe de Randomize functie werkt zal ik het hier wel posten (maar dat kan nog wel enkele weken duren, als het zowieso lukt!)

In ieder geval bedankt voor de hulp!
Pagina: 1