Avatar billede ferret Nybegynder
21. maj 2003 - 21:54 Der er 37 kommentarer og
1 løsning

Generering af truely random data.

Er det mugluigt at generere en truely random streng af bogstaver rent eletronisk? Det behøver ikke at være via matematik.
Bare en måde at generere truely random data uden ekstra udstyr til PCen. I det her tilfælde er en 'standard' PC en med netkort, grafik kort og så vidre.
Avatar billede arne_v Ekspert
21. maj 2003 - 22:06 #1
Jeg forstå at du ikke vil have en pseudo random number generator.

Og du vil helle rikke have noget eksternt fysisk.

Det begrænser jo mulighederne en del.

Jeg har 2 forslag:

1)  Bed brugeren taste noget og mål antal millisekunder mellem
    taste tryk og brug det som random data.

2)  Slå alle processer op (exe navn, CPU tid etc.) og lav en checksum
    af alla data.
Avatar billede mbulow Nybegynder
21. maj 2003 - 22:50 #2
Hmm... Nu du siger at PC'en har et netkort, ik... Har den så også en internet forbindelse?

Hvis den har kunne du måske få dit program til at udnytte denne side:

http://www.random.org/nform.html

Altså få programmet til at kalde den action som form'en på siden bruger.
Så kunne du modtage en simpel tekstfil der indeholder X antal tilfældige tal.

De skriver i hvert fald selv at de tilfældige tal, bliver genereret ud fra atmosfærisk støj, så det bliver vel næsten ikke meget bedre :)
Avatar billede mbulow Nybegynder
21. maj 2003 - 22:52 #3
Hrrm. Nu ved jeg selvfølgelig ikke hvad du skal bruge det til, men du skal jo bare lige huske at du nok får et problem, hvis/når siden en dag bliver pillet ned, såååå..... I længden er det nok ikke den mest holdbare løsning ;) hehe
Avatar billede ferret Nybegynder
21. maj 2003 - 23:05 #4
Arne v: Det er til at generere en key til en onetime pad, jeg er interesseret i at se kode eksempler på dine forslag(Med kommenterer selvfølgelig!:)
Avatar billede ferret Nybegynder
21. maj 2003 - 23:08 #5
Og mbulow - Igen vil jeg gerne se kode :>
Avatar billede arne_v Ekspert
21. maj 2003 - 23:37 #6
Sådan noget kode er platform specifikt.

Følgende compiler med en Win32 compiler som er rimeligt DOS kompatibel:

#include <stdlib.h>

#include <iostream>

using namespace std;

#include <conio.h>

#include <windows.h>

int main(int argc, char *argv[])
{
  int a[100];
  int t1 = GetTickCount();
  int n = 0;
  cout << "Press some random keys" << endl;
  while(n<100) {
      getch();
      int t2 = GetTickCount();
      a[n] = t2 - t1;
      t1 = t2;
      n++;
  }
  for(int i = 0; i < 100; i++) {
    cout << a[i] << endl;
  }
  return 0;
}
Avatar billede arne_v Ekspert
21. maj 2003 - 23:39 #7
Du skal have det lavet på din platform.

Du skal have det lavet i en form der passer til
det du skal bruge.

Men det viser ihvertfald konceptet.
Avatar billede ferret Nybegynder
21. maj 2003 - 23:47 #8
Win32 platform, Win2k for at være specifik.
Avatar billede ferret Nybegynder
21. maj 2003 - 23:51 #9
Og hvis jeg skal tro på følgende text fundet på random.org

True random numbers are typically generated by sampling and processing a source of entropy outside the computer. A source of entropy can be very simple, like the little variations in somebody's mouse movements or in the amount of time between keystrokes. In practice, however, it can be tricky to use user input as a source of entropy. Keystrokes, for example, are often buffered by the computer's operating system, meaning that several keystrokes are collected before they are sent to the program waiting for them. To the program, it will seem as though the keys were pressed almost simultaneously.

Er den metode ikke den bedste i hele verdenen.
Avatar billede arne_v Ekspert
21. maj 2003 - 23:53 #10
Du kan jo selv teste om den bufferer.

Den gjorde det ikke hos mig.

getch plejer heller ikke at buffere.

Men det er platform specifikt.

Metoden med keystrokes bruges også af flere særdeles anerkendte
krypterings systemer til at generere en stor random key.
Avatar billede arne_v Ekspert
21. maj 2003 - 23:54 #11
Jeg har buildet of testet med mingw GCC compiler og Windows 2000.
Avatar billede arne_v Ekspert
22. maj 2003 - 00:00 #12
PGP (ihvertfald version 2.x) bruger f.eks. metoden.
Avatar billede segmose Nybegynder
22. maj 2003 - 00:35 #13
Hvis du kun skal bruge et nummer en gang imellem og har en godt brugt PC, kan du tilfældigt (med random) vælge en fil fra din internet cache, xor den og bruge værdien som dit tal. Det der kommer ind fra internettet må betragtes som kaos og derfor ret tilfældigt specielt efter du xor en hel fil.
Avatar billede ferret Nybegynder
22. maj 2003 - 10:23 #14
Arne_v - Dit program gi'r mig følgende fejl:

d:\ny mappe\c\keygen\keygen-main.cpp: In function `int main(int, char **)':
d:\ny mappe\c\keygen\keygen-main.cpp:8: parse error before character 0240
d:\ny mappe\c\keygen\keygen-main.cpp: At top level:
d:\ny mappe\c\keygen\keygen-main.cpp:19: parse error before `;'
d:\ny mappe\c\keygen\keygen-main.cpp:19: syntax error before `++'
Avatar billede arne_v Ekspert
22. maj 2003 - 10:26 #15
Har du copy pastet ind ?
Avatar billede arne_v Ekspert
22. maj 2003 - 10:28 #16
Vær iøvrigt opmærksom på at du skal have konverteret de random int's
til at passe til din sammenhæng. Det er ikke sikkert at de kan bruges
umiddelbart. Måske kan du kun bruge 1 eller 4 bit fra hver int.
Avatar billede ferret Nybegynder
22. maj 2003 - 10:37 #17
Den skal bruges til at generere en random key til on onetime pad, i det her tilfælde kun en tekst streng.
Avatar billede ferret Nybegynder
22. maj 2003 - 10:40 #18
Ok efter jeg har rettet fejlene der opstår ved C&P'ing får jeg kun den her;
13 keygen-main.cpp
implicit declaration of function `int getchar(...)'
Avatar billede arne_v Ekspert
22. maj 2003 - 10:43 #19
Hm.

getch er erklæret i conio.h og er forskelligt fra getchar i stdio.h !?

Hvilken compiler bruger du ?
Avatar billede ferret Nybegynder
22. maj 2003 - 10:46 #20
Dev-Cpp 4
Avatar billede ferret Nybegynder
22. maj 2003 - 11:00 #21
Ser ud til at virke nu i dev-Cpp 4.9.8.0
Avatar billede ferret Nybegynder
22. maj 2003 - 11:03 #22
Oh så lige et sidste spørgsmål, hvordan kan jeg implementere den fuction ind i et onetime pad program?
Avatar billede arne_v Ekspert
22. maj 2003 - 11:13 #23
Hvad skal du bruge til din one time pad ?

Random bytes pænt fordelt 0...255 (eller -128...127) ?

Jeg ville nok snuppe low 4 bit af de random ints og lave chars af dem.

int rani1,rani2;
char ranc;

ranc = ((rani1 % 16) << 4) | (rani2 & 16);

Det er muligt at det skal justeres.

Men prøv at se om det har nogle acceptable egenskaber.
Avatar billede arne_v Ekspert
22. maj 2003 - 11:14 #24
Ups fejl. Det skal naturligvis være:

ranc = ((rani1 % 16) << 4) | (rani2 % 16);
Avatar billede arne_v Ekspert
22. maj 2003 - 11:15 #25
Hvis den har en tilpas god fordeling, så skulle du være OK.

Hvis fordelingen ikke er god, så skal vi have justgeret på
transformationen.

Det er ihvertfald svært at forudsige hvordan du taster.

metoden er totalt ubruge lig til store datamæmngder, da det jo
tager meget tid at generere disse random data.
Avatar billede ferret Nybegynder
22. maj 2003 - 11:16 #26
Det skal være en random sekvens af bogstaver til brug i denne funktion:

void otp_enc(char plain[], char key[])
{
    char *cipher;
    int l = strlen(plain);
    cipher = (char *)malloc(l);
    for(int i=0;i<l;i++) cipher[i] = 'A' + ((plain[i] - 'A') + (key[i % strlen(key)] - 'A') + 1) % 26;
    cipher[l] = '\0';
    cout<<plain<<" -> "<<cipher<<" Done! Now don't forget the key: "<<key<<" Remember Onetime pads are unbreakable!"<<endl;

}

Og ja jeg ved godt at en ren tekst key kan bruteforces, men det er ikek så meget sikkerheden jeg er interesseret i kun princippet.
Avatar billede arne_v Ekspert
22. maj 2003 - 11:24 #27
OK - du skal altså have en key bestående af bogstaver A..Z.

Du har et array a[100] med ikke godt fordelte men svært forudsigelige tal.

Den nemmeste løsning er så:

int a[100];
char key[100];
for(int i=0;i<100;i++) key[i] = 'A' + a[i] % 26;

så får du 100 bogstaver uf af 100 keystrokes.
Avatar billede arne_v Ekspert
22. maj 2003 - 11:27 #28
Hvis det giver for dårlige fordeling fordi taster for systematisk, så
kan man forbedre den med:

int a[100];
char key[50];
for(int i=0;i<50;i++) {
  int tmp = ((a[2*i] % 16) << 4) | (a[2*i+1] % 16);
  key[i] = 'A' + tmp % 26;
}
Avatar billede ferret Nybegynder
22. maj 2003 - 11:29 #29
Hrm..ok, hvis fuctionen jeg postede skulle omsrives så den kommer til at bruge den teknik hvordan kommer den til at se ud? Og hvis den skal bruges sammen med den fuction du postede tidligere hvordan kommer programmet til at se ud.
Avatar billede ferret Nybegynder
22. maj 2003 - 11:34 #30
Never mind, jeg tror jeg har fundet ud af det.
Avatar billede ferret Nybegynder
22. maj 2003 - 11:54 #31
Er denne metode korrekt:

    if(strcmp(argv[1],"-e") == 0){
        cout<<"Enter plaintext: ";
        cin.getline(plaintext, 255);
        cout << "Press some random keys" << endl;
        while(n<100) {
                    getch();
                    int t2 = GetTickCount();
                    a[n] = t2 - t1;
                    t1 = t2;
                    n++;
                    }
        for(int i=0;i<50;i++) {
        int tmp = ((a[2*i] % 16) << 4) | (a[2*i+1] % 16);
        key[i] = 'A' + tmp % 26;}
        for(i = 0; plaintext[i] != '\0'; i++)
            plaintext[i] = toupper(plaintext[i]);
        //for(i = 0; key[i] != '\0'; i++)
//            key[i] = toupper(key[i]);
        otp_enc(plaintext,key);
        return 0;}
Tror jeg ikke fordi den key jeg får ser sådan her ud:
PUSIEKDIIZOKMQCIUOAEWMMOAIISGYAUEQQEAMQIWKAOYGKKAI??TESTSTRING
Det giver mig to problemer:
1)Jeg vil kun lave en key der er så lang som strengen der er intastet, jeg prøvede at bruge strlen() i begge lykker, men så fik jeg bare junk data med i keyen.
2) ??TESTSTRING skal helst ikke være i keyen, fordi TESTSTRING var i telfældet her hvad jeg indtastede, og fordi jeg vil have en ren bogstav key så de to ? generer mig.
Avatar billede arne_v Ekspert
22. maj 2003 - 12:14 #32
int len = strlen(plaintext);

og så erstat 100 med 2*len og 50 med len.
Avatar billede arne_v Ekspert
22. maj 2003 - 12:16 #33
Hvis du sætter en:

key[50]='\0';

eller

key[len] = '\0';

ind så tror jeg du slipper for den sidste.

Så skal key naturligvis erklæres:

char key[51];

eller bedre:

char *key = new char[len+1];
Avatar billede arne_v Ekspert
22. maj 2003 - 12:16 #34
Der blev lidt blandet - jeg håber at du kan følge mig.
Avatar billede ferret Nybegynder
22. maj 2003 - 12:18 #35
Err..nu ser mit out put sådan her ud:

D:\priv\C\Onetimepad\Debug>onetimepad -e
Enter plaintext: teststring
Press some random keys
<keys indtastes>
IWEMOGQQSQASSAEWEEUIMONEQCAGBWTTNLLVRJBBULSYQQMUGMCNUYSYDKGEWHMEAOIKUSEBAOKGSGYAQHMOOESPESIMMKWUGMIP
GSSUYUCMCMOUEQHKECMQYEMLCEMMTUYQYNCYSKQKQQICAYMQOUYGPIYOWJCKGVCGIFEAUQUEAQOCYEKAQAJWMUKNIIGSAQGSIYNS
AEQYOAO -> ZXFRHFVHHXTXFFXXJJFXXEMDXLLHEFJSGWUOGYSWLQZVVKJZNBHDDVXLSRXVPYNXTPNHZXZKNDYLJJZHSEGICQELW
CKOHWPTXDVKNFVITTVLGXVZBYUPFRVBTXRNDTXTMBXRPVPNHPJAVJRPNJJLVHHWWBRJVEFXJIRBNWMLZTHVZVBOBJXNKVINLINMB
TXDRHPVJXAJPZPFEJN Done! Now don't forget the key: QAAESYEQOGSEMESAEEKOKPYYGIKACIPYSKISOOQUQEGWETWEG
OEPIWEMOGQQSQASSAEWEEUIMONEQCAGBWTTNLLVRJBBULSYQQMUGMCNUYSYDKGEWHMEAOIKUSEBAOKGSGYAQHMOOESPESIMMKWUG
MIPGSSUYUCMCMOUEQHKECMQYEMLCEMMTUYQYNCYSKQKQQICAYMQOUYGPIYOWJCKGVCGIFEAUQUEAQOCYEKAQAJWMUKNIIGSAQGSI
YNSAEQYOAO Remember Onetime pads are unbreakable!
Avatar billede arne_v Ekspert
22. maj 2003 - 12:23 #36
Jeg tror lige at jeg skal se koden som den ser ud nu - jeg har
tabt tråden.
Avatar billede ferret Nybegynder
22. maj 2003 - 12:25 #37
Nej jeg havde sat

int len = strlen(plaintext)
før plaintext overhovedet var indtastet, det gav selvfølgelig nogle mærklige fejl.
Avatar billede ferret Nybegynder
22. maj 2003 - 12:26 #38
Og som tak for din hjælp får du point af mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester