Avatar billede sabine Nybegynder
02. april 2000 - 18:40 Der er 8 kommentarer og
3 løsninger

Password

hvordan laver man en funktion der ud fra 2 værdiger laver et password med en fast format f.eks. PWW(og så resten af koden) 

Avatar billede pellelil Nybegynder
02. april 2000 - 19:16 #1
Øhh hvilke 2 værdier ??? (Integer ???)

Function Pww(iValue1, iValue2 : Integer) : String;
Const
  HexTable : Array[0..15] of char = '0123456789ABCDEF';
var
  iPwd : Integer;
  iIdx : Integer;
begin
  //--- "Scramble" de 2 værdier ---
  iPwd := ((iValue1 and $FFFF0000) shr 16) and
          ((iValue1 and $0000FFFF) shl 16);
  iPwd := iPwd xor iValue2 xor (not iValue2);
  //--- Generer "Password" (HexVærdi) ---
  Result := '';
  for iIdx := 1 to 8 do begin
    Result := HexTable[(iPwd and 15)] + Result;
    iPwd := iPwd Shr 4;
  end;
end;

Ovensående function kaldes med 2 værdier (integer) som bruges til at sammesætte et tal, dette tal returners som en Hex værdi (Streng "Password").
Avatar billede stoons Nybegynder
02. april 2000 - 23:00 #2
kryptisk spørgsmål!

Simplificer (forklar nærmere) venligst.  = )
Avatar billede sjensen Nybegynder
02. april 2000 - 23:22 #3
Hvis værdierne er tekster:

password := 'PWW'+værdi1+værdi2;

hvis værdierne er tal (integer):

password := 'PWW'+inttostr(tal1)+inttostr(tal2)

Når du siger fast format, mener du så længde på talværdierne uanset værdien a la:

PWW-22010-00101

så skal du bruge "format" kommandoen:

password := 'PWW-'+format('%d:5' [tal1]) + '-' + format('%d:5 [tal2])

Og hvis det er noget helt anden er du nok lige nødt til at forklare det lidt mere uddybende.
Avatar billede pellelil Nybegynder
03. april 2000 - 14:43 #4
> SJensen hvorfor gøre det så indviklet ?

Password = Format('PWW-%d:5-%d:5', [Tal1,Tal2]);

Nemmere at læse og nemmere at skrive. Du ved vi udviklere skal "være dovne" !!
Avatar billede sjensen Nybegynder
03. april 2000 - 15:21 #5
Ja ja, men som du selv siger:

Overdrivelse fremmer forståelsen !
Avatar billede sabine Nybegynder
03. april 2000 - 19:56 #6
Det jeg skal bruge er en rutine der Generer et password ud fra 2 ting
den ene er serie nummeret på noget hardware og det andet er et eller andet
tal/string

glem det med den faste format,
jeg håber at det hjælper jer lidt
Avatar billede stoons Nybegynder
03. april 2000 - 21:04 #7
Det kan du jo gøre på allemulige forskellige måder... f.eks. addere tværsnitet af streng1's enkelte tegne med tværsnittet af streng2 enkelete tegn eller du kan snuppe et gennemsnit af de to strenge... eller... eller...

Eks:
Function tværsnit(s: string):byte;
var a:integer;
    sum: longint;
begin
  for a:=0 to length(s) do sum:=sum+ord(s[a]);
  tvæsnit:=sum div length(s);
end;

function check(ser: integer; s1,s2: string):boolean;
Begin
  if ser=(tværsnit(s1)+tværsnit(s2)) then check:=true else check:=false;

Det er bare ment som et forslag  = )
  if
Avatar billede sjensen Nybegynder
03. april 2000 - 22:15 #8
sabine,

som stoons siger er der masser af muligheder. Du skal bare beslutte dig for et eller andet. F.eks. datoen i amerikansk format (yyyymmdd) for din onkels fødselsdag, eller et eller andet du ttor kun du kender eller kan gætte.

Derefter tager du dette tal og sætter ind i en tekststreng sammen med navnet på din søsters kærestes mor:

f.eks:
txt1 := '20000403marianne';

og hvis du har brug for at strengen skal være længere finder du på noget mere. txt1 skal have samme længde, eller større end den samlede længde af de data du har til rådighed.

Lad os sige du har et serienr (fra hardwaren) der hedder "XYZ11223344" og din tal eller tekststreng indeholder "abcdefg12345". Disse 2 sætter du så sammen i en ny streng der hedder txt2. Txt1 skal så indeholde minimum lige så mange tegn som txt2.

Derefter lægger du de 2 tekststrenge sammen tegn for tegn (ascii værdien af hvert tegn) og for de hvor den samlede værdi overstiger 256 trækker du 256, således at summen af de 2 tegn altid er mindre end 256:

eks.

funktion password (txt1, txt2 : string) : string;
var i : integer;
    x : integer;
    s : string;
begin
  s := '';
  for i := 1 to length(txt2) do
  begin
    x := ord(txt2[i])+ord(txt1[i]);
    if x > 256 then x := x -256;
    s := s + chr(x);
  end;
  result := s;
end;

og hvis du så sætter hhv. t1 og t2 op således og derefter kalder rutinen får du et password:

var
  t1 : string;
  t2 : string;
  pw : string;
begin
  t1 := '20000403MarianneVaskemaskine16Pandekager';
  t2 := hardware_serienr + et_eller_anden_tekst;
  pw := password(t1,t2);
end;

Desuden kan du kontrollere et indtastet password op imod det beregnede:

var indtastet_password : string;
    t1 : string;
    t2 : string;
    pw : string;
begin
  indtastet_password := edit1.text;
  t1 := '20000403MarianneVaskemaskine16Pandekager';
  t2 := hardware_serienr + et_eller_anden_tekst;
  pw := password(t1,t2);
  if pw <> indtastet_password then showmessage('Desværre, password er ikke korrekt);
end;

og sådan er der så mange muligheder, men jeg håber du kan se fidusen.
Avatar billede pellelil Nybegynder
03. april 2000 - 22:22 #9
Hvis det skal være password som skal indtastes så sørg for at det kun består af "synlige tegn". Det forslag jeg foreslog genererede en hex-værdi (bestående af tegnene "0".."9","A".."F") hvorved dette var "tast-bart". Ligeledes kan du på samme måde sammenstykke din tekst og dit tal til en streng hvorefter du eksempelvis beregner en CRC værdi for stengen.

Du kan også vælge at beregne "tværsnitte" som stoons forslår, men dette vil være nemt at knække. Ligeledes vil flere værdier resultere samme "password" ("ABCDE" = "EDCBD" = "CCCCC" = "ACCCE" osv...). Hvis man således kender algoritmen så kan man statistisk beregne det serienummer som programmet vil returnere for en given længde streng
Avatar billede sabine Nybegynder
04. april 2000 - 19:02 #10
det er allesammen nogle gode forslag
men Sjensen kommer tættes på det jeg gerne vil ha´ så Sjensen hvis du kan modificere din kode så den er skrivebar
så er pointne dine

pellelil jeg kan ikke få din kode til at virke den retunere FFFFFFFF altid

Avatar billede sjensen Nybegynder
08. april 2000 - 16:36 #11
Sabine,

Takker for point,

Vedr. Skrivbar: Som pellelil siger det er det vanskeligt at skrive alle tegn, så funktionend er udregner password skal bare sikre at de tegn der bruges altid er større end  dec 31 (mellemrum er nr. 32) og mindre end 128 (de fleste over 128 skal indtastes via ALT + et tal. Det gælder dog ikke de specielle danske æøå som hhv små og store tegn, men da man ikke ser det alligevel beyder det ikke noget. Så ret funktionen til således:

funktion password (txt1, txt2 : string) : string;
var i : integer;
    x : integer;
    s : string;
begin
  s := ';
  for i := 1 to length(txt2) do
  begin
    x := ord(txt2[i])+ord(txt1[i]);
    if x < 32 then x := x + 32;
    while (x > 128) do x := x - 32;
    s := s + chr(x);
  end;
  result := s;
end;
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