Avatar billede cyborg_dk Nybegynder
30. januar 2003 - 09:36 Der er 9 kommentarer

Kryptering.

Er der nogen der har en simpel krypterings function eller unit el.lign (men vi skal lige en tand længere end det basale XOR stadie).  Ønsket er at krypterere et password som så skal opbevares i registry (til brug for at programmet selv kan logge på med andre rettigheder), dvs det skal være anstændig sikkert men uden de mere avancerede seed, stream, buffer det ene og andet units. (kikkede på INDY's MD2 men fattede ikke meget).
Avatar billede borrisholt Novice
30. januar 2003 - 09:42 #1
Sta<rt med at gemme den her undit under navnet
MD5.pas

Og ven til bade når det compilerer

{*_* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Author:      François PIETTE. Based on work given by Louis S. Berman from
              BrainTree Ltd, lsb@braintree.com
Description:  MD5 is an implmentation for the MD5 Message-Digest Algorithm
              as described in RFC-1321
Creation:    October 11, 1997
Version:      1.03
EMail:        http://users.swing.be/francois.piette  francois.piette@swing.be
              http://www.rtfm.be/fpiette            francois.piette@rtfm.be
              francois.piette@pophost.eunet.be
Support:      Use the mailing list twsocket@rtfm.be See website for details.
Legal issues: Copyright (C) 1997, 1998 by François PIETTE
              Rue de Grady 24, 4053 Embourg, Belgium. Fax: +32-4-365.74.56
              <francois.piette@pophost.eunet.be>

              This software is provided 'as-is', without any express or
              implied warranty.  In no event will the author be held liable
              for any  damages arising from the use of this software.

              Permission is granted to anyone to use this software for any
              purpose, including commercial applications, and to alter it
              and redistribute it freely, subject to the following
              restrictions:

              1. The origin of this software must not be misrepresented,
                you must not claim that you wrote the original software.
                If you use this software in a product, an acknowledgment
                in the product documentation would be appreciated but is
                not required.

              2. Altered source versions must be plainly marked as such, and
                must not be misrepresented as being the original software.

              3. This notice may not be removed or altered from any source
                distribution.

              4. You must register this software by sending a picture postcard
                to the author. Use a nice stamp and mention your name, street
                address, EMail address and any comment you like to say.

Updates:
Oct 26, 1997 Changed MD5Final form function to procedure to be compatible
            with C++Builder.
Jul 09, 1998 V1.01 Adapted for Delphi 4
Aug 06, 1998 V1.02 Added R- Q- directive
Jun 05, 1999 V1.03 Wolfgang Klein found a bug in MD5Update.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
unit MD5;

interface

uses
    SysUtils;

const
    MD5Version        = 102;
    CopyRight : String = ' MD5 Message-Digest (c) 97-98 F. Piette V1.02 ';

{$Q-}
{$R-}

type
    TMD5Context = record
        State: array[0..3] of LongInt;
        Count: array[0..1] of LongInt;
        case Integer of
        0: (BufChar: array[0..63] of Byte);
        1: (BufLong: array[0..15] of LongInt);
    end;
    TMD5Digest = array[0..15] of Char;

procedure MD5Init(var MD5Context: TMD5Context);
procedure MD5Update(var MD5Context: TMD5Context;
                    const Data;
                    Len: Integer);
procedure MD5Transform(var Buf: array of LongInt;
                      const Data: array of LongInt);
procedure MD5UpdateBuffer(var MD5Context: TMD5Context;
                          Buffer: Pointer;
                          BufSize: Integer);
procedure MD5Final(var Digest: TMD5Digest; var MD5Context: TMD5Context);

function GetMD5(Buffer: Pointer; BufSize: Integer): string;
function StrMD5(Buffer : String): string;

implementation

const
    MaxBufSize = 16384;

type
    PMD5Buffer = ^TMD5Buffer;
    TMD5Buffer = array[0..(MaxBufSize - 1)] of Char;



{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ MD5 initialization. Begins an MD5 operation, writing a new context.        }
procedure MD5Init(var MD5Context: TMD5Context);
begin
    FillChar(MD5Context, SizeOf(TMD5Context), #0);
    with MD5Context do begin
        { Load magic initialization constants. }
        State[0] := LongInt($67452301);
        State[1] := LongInt($EFCDAB89);
        State[2] := LongInt($98BADCFE);
        State[3] := LongInt($10325476);
    end
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ MD5 block update operation. Continues an MD5 message-digest operation,      }
{ processing another message block, and updating the context.                }
procedure MD5Update(
    var MD5Context: TMD5Context;            { Context                        }
    const Data;                            { Input block                    }
    Len: Integer);                          { Length of input block          }
type
    TByteArray = array[0..0] of Byte;
var
    Index: Word;
    T: LongInt;
begin
    with MD5Context do begin
        T := Count[0];
        Inc(Count[0], LongInt(Len) shl 3);
        if Count[0] < T then
            Inc(Count[1]);
        Inc(Count[1], Len shr 29);
        T := (T shr 3) and $3F;
        Index := 0;
        if T <> 0 then begin
            Index := T;
            T := 64 - T;
            if Len < T then begin
                Move(Data, BufChar[Index], Len);
                Exit;
            end;
            Move(Data, BufChar[Index], T);
            MD5Transform(State, BufLong);
            Dec(Len, T);
            Index := T;  { Wolfgang Klein, 05/06/99 }
        end;
        while Len >= 64 do begin
            Move(TByteArray(Data)[Index], BufChar, 64);
            MD5Transform(State, BufLong);
            Inc(Index, 64);
            Dec(Len, 64);
        end;
        Move(TByteArray(Data)[Index], BufChar, Len);
    end
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ MD5 finalization. Ends an MD5 message-digest operation, writing the message }
{ digest and zeroizing the context.                                          }
procedure MD5Final(var Digest: TMD5Digest; var MD5Context: TMD5Context);
var
    Cnt : Word;
    P  : Byte;
begin
    with MD5Context do begin
        Cnt := (Count[0] shr 3) and $3F;
        P := Cnt;
        BufChar[P] := $80;
        Inc(P);
        Cnt := 64 - 1 - Cnt;
        if Cnt < 8 then begin
            FillChar(BufChar[P], Cnt, #0);
            MD5Transform(State, BufLong);
            FillChar(BufChar, 56, #0);
        end
        else
            FillChar(BufChar[P], Cnt - 8, #0);
        BufLong[14] := Count[0];
        BufLong[15] := Count[1];
        MD5Transform(State, BufLong);
        Move(State, Digest, 16)
    end;
    FillChar(MD5Context, SizeOf(TMD5Context), #0)
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ MD5 basic transformation. Transforms state based on block.                  }
procedure MD5Transform(
    var Buf: array of LongInt;
    const Data: array of LongInt);
var
    A, B, C, D: LongInt;

    procedure Round1(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
    begin
        Inc(W, (Z xor (X and (Y xor Z))) + Data);
        W := (W shl S) or (W shr (32 - S));
        Inc(W, X)
    end;

    procedure Round2(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
    begin
        Inc(W, (Y xor (Z and (X xor Y))) + Data);
        W := (W shl S) or (W shr (32 - S));
        Inc(W, X)
    end;

    procedure Round3(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
    begin
        Inc(W, (X xor Y xor Z) + Data);
        W := (W shl S) or (W shr (32 - S));
        Inc(W, X)
    end;

    procedure Round4(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte);
    begin
        Inc(W, (Y xor (X or not Z)) + Data);
        W := (W shl S) or (W shr (32 - S));
        Inc(W, X)
    end;
begin
    A := Buf[0];
    B := Buf[1];
    C := Buf[2];
    D := Buf[3];

    Round1(A, B, C, D, Data[ 0] + LongInt($d76aa478),  7);
    Round1(D, A, B, C, Data[ 1] + LongInt($e8c7b756), 12);
    Round1(C, D, A, B, Data[ 2] + LongInt($242070db), 17);
    Round1(B, C, D, A, Data[ 3] + LongInt($c1bdceee), 22);
    Round1(A, B, C, D, Data[ 4] + LongInt($f57c0faf),  7);
    Round1(D, A, B, C, Data[ 5] + LongInt($4787c62a), 12);
    Round1(C, D, A, B, Data[ 6] + LongInt($a8304613), 17);
    Round1(B, C, D, A, Data[ 7] + LongInt($fd469501), 22);
    Round1(A, B, C, D, Data[ 8] + LongInt($698098d8),  7);
    Round1(D, A, B, C, Data[ 9] + LongInt($8b44f7af), 12);
    Round1(C, D, A, B, Data[10] + LongInt($ffff5bb1), 17);
    Round1(B, C, D, A, Data[11] + LongInt($895cd7be), 22);
    Round1(A, B, C, D, Data[12] + LongInt($6b901122),  7);
    Round1(D, A, B, C, Data[13] + LongInt($fd987193), 12);
    Round1(C, D, A, B, Data[14] + LongInt($a679438e), 17);
    Round1(B, C, D, A, Data[15] + LongInt($49b40821), 22);

    Round2(A, B, C, D, Data[ 1] + LongInt($f61e2562),  5);
    Round2(D, A, B, C, Data[ 6] + LongInt($c040b340),  9);
    Round2(C, D, A, B, Data[11] + LongInt($265e5a51), 14);
    Round2(B, C, D, A, Data[ 0] + LongInt($e9b6c7aa), 20);
    Round2(A, B, C, D, Data[ 5] + LongInt($d62f105d),  5);
    Round2(D, A, B, C, Data[10] + LongInt($02441453),  9);
    Round2(C, D, A, B, Data[15] + LongInt($d8a1e681), 14);
    Round2(B, C, D, A, Data[ 4] + LongInt($e7d3fbc8), 20);
    Round2(A, B, C, D, Data[ 9] + LongInt($21e1cde6),  5);
    Round2(D, A, B, C, Data[14] + LongInt($c33707d6),  9);
    Round2(C, D, A, B, Data[ 3] + LongInt($f4d50d87), 14);
    Round2(B, C, D, A, Data[ 8] + LongInt($455a14ed), 20);
    Round2(A, B, C, D, Data[13] + LongInt($a9e3e905),  5);
    Round2(D, A, B, C, Data[ 2] + LongInt($fcefa3f8),  9);
    Round2(C, D, A, B, Data[ 7] + LongInt($676f02d9), 14);
    Round2(B, C, D, A, Data[12] + LongInt($8d2a4c8a), 20);

    Round3(A, B, C, D, Data[ 5] + LongInt($fffa3942),  4);
    Round3(D, A, B, C, Data[ 8] + LongInt($8771f681), 11);
    Round3(C, D, A, B, Data[11] + LongInt($6d9d6122), 16);
    Round3(B, C, D, A, Data[14] + LongInt($fde5380c), 23);
    Round3(A, B, C, D, Data[ 1] + LongInt($a4beea44),  4);
    Round3(D, A, B, C, Data[ 4] + LongInt($4bdecfa9), 11);
    Round3(C, D, A, B, Data[ 7] + LongInt($f6bb4b60), 16);
    Round3(B, C, D, A, Data[10] + LongInt($bebfbc70), 23);
    Round3(A, B, C, D, Data[13] + LongInt($289b7ec6),  4);
    Round3(D, A, B, C, Data[ 0] + LongInt($eaa127fa), 11);
    Round3(C, D, A, B, Data[ 3] + LongInt($d4ef3085), 16);
    Round3(B, C, D, A, Data[ 6] + LongInt($04881d05), 23);
    Round3(A, B, C, D, Data[ 9] + LongInt($d9d4d039),  4);
    Round3(D, A, B, C, Data[12] + LongInt($e6db99e5), 11);
    Round3(C, D, A, B, Data[15] + LongInt($1fa27cf8), 16);
    Round3(B, C, D, A, Data[ 2] + LongInt($c4ac5665), 23);

    Round4(A, B, C, D, Data[ 0] + LongInt($f4292244),  6);
    Round4(D, A, B, C, Data[ 7] + LongInt($432aff97), 10);
    Round4(C, D, A, B, Data[14] + LongInt($ab9423a7), 15);
    Round4(B, C, D, A, Data[ 5] + LongInt($fc93a039), 21);
    Round4(A, B, C, D, Data[12] + LongInt($655b59c3),  6);
    Round4(D, A, B, C, Data[ 3] + LongInt($8f0ccc92), 10);
    Round4(C, D, A, B, Data[10] + LongInt($ffeff47d), 15);
    Round4(B, C, D, A, Data[ 1] + LongInt($85845dd1), 21);
    Round4(A, B, C, D, Data[ 8] + LongInt($6fa87e4f),  6);
    Round4(D, A, B, C, Data[15] + LongInt($fe2ce6e0), 10);
    Round4(C, D, A, B, Data[ 6] + LongInt($a3014314), 15);
    Round4(B, C, D, A, Data[13] + LongInt($4e0811a1), 21);
    Round4(A, B, C, D, Data[ 4] + LongInt($f7537e82),  6);
    Round4(D, A, B, C, Data[11] + LongInt($bd3af235), 10);
    Round4(C, D, A, B, Data[ 2] + LongInt($2ad7d2bb), 15);
    Round4(B, C, D, A, Data[ 9] + LongInt($eb86d391), 21);

    Inc(Buf[0], A);
    Inc(Buf[1], B);
    Inc(Buf[2], C);
    Inc(Buf[3], D);
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure MD5UpdateBuffer(
    var MD5Context: TMD5Context;
    Buffer: Pointer;
    BufSize: Integer);
var
    BufTmp : PMD5Buffer;
    BufPtr : PChar;
    Bytes  : Word;
begin
    New(BufTmp);
    BufPtr := Buffer;
    try
        repeat
            if BufSize > MaxBufSize then
                Bytes := MaxBufSize
            else
                Bytes := BufSize;
            Move(BufPtr^, BufTmp^, Bytes);
            Inc(BufPtr, Bytes);
            Dec(BufSize, Bytes);
            if Bytes > 0 then
                MD5Update(MD5Context, BufTmp^, Bytes);
        until Bytes < MaxBufSize;
    finally
        Dispose(BufTmp);
    end;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function GetMD5(Buffer: Pointer; BufSize: Integer): string;
var
    I          : Integer;
    MD5Digest  : TMD5Digest;
    MD5Context : TMD5Context;
begin
    for I := 0 to 15 do
        Byte(MD5Digest[I]) := I + 1;
    MD5Init(MD5Context);
    MD5UpdateBuffer(MD5Context, Buffer, BufSize);
    MD5Final(MD5Digest, MD5Context);
    Result := '';
    for I := 0 to 15 do
        Result := Result + IntToHex(Byte(MD5Digest[I]), 2);
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function StrMD5(Buffer : String): string;
begin
    Result := GetMD5(@Buffer[1], Length(Buffer));
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}

end.

Jens B
Avatar billede mortvader Nybegynder
30. januar 2003 - 15:28 #2
function encrypt(s,key:string;enc:boolean):string;
var
cryptstring:string;
e, //encrypter
k, //counter for key
a, //værdi før encryption
t:integer;
c:char;
begin
    cryptstring:='abcdefghijklmnopqrstuvwxyz0987654321ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅæøå';
    result:='';
    if (s='')or(key='')then exit;

    k:=1;
    for t:=1 to length(s) do
    begin
          e:=pos(key[k],CryptString);
          a:=pos(s[t],CryptString);
          if a>0 then
          begin
              if not enc then e:=-e;
              a:=a+e;
              if a>length(CryptString) then a:=a-length(CryptString);
              if a<1 then a:=a+length(CryptString);
              c:=CryptString[a];
          end
          else c:=s[t];

          inc(k);
          if k>length(key) then k:=1;

          result:=result+c;
    end;
end;



Dette er en simpel kryptering. Rod selv rundt i cryptstring for at gøre den mere opskur.

Kaldes således:
a:=encrypt(s,n,b);

a = det krypterede resultat.
s = det der skal krypteres.
n = nøglen der skal krypteres med
b = true for at kryptere. false for at dekryptere.
Avatar billede zity Nybegynder
02. februar 2003 - 10:18 #3
jeg har denne kode liggene men den er dog 100% i orden.
den erstatter ganske enkelt et bogstave med to tal.
den er bygget til en RichEdit1.

________________________
Krypter
________________________
RichEdit1.Text := StringReplace(RichEdit1.Text, 'a', ' 02',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'b', ' 28',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'c', ' 01',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'd', ' 27',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'e', ' 03',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'f', ' 26',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'g', ' 04',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'h', ' 25',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'i', ' 05',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'j', ' 06',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'k', ' 24',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'l', ' 23',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'm', ' 07',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'n', ' 22',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'o', ' 08',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'p', ' 21',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'q', ' 09',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'r', ' 20',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 's', ' 10',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 't', ' 19',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'u', ' 11',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'v', ' 18',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'x', ' 12',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'y', ' 17',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'z', ' 13',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'æ', ' 16',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'ø', ' 14',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'å', ' 15',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'w', ' 29',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '0', ' 39',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '1', ' 30',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '2', ' 38',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '3', ' 31',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '4', ' 35',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '5', ' 32',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '6', ' 36',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '7', ' 33',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '8', ' 37',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '9', ' 34',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '§', ' 40',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '"', ' 41',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '#', ' 43',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '¤', ' 42',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '%', ' 44',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '&', ' 45',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '/', ' 47',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '(', ' 46',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ')', ' 49',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '=', ' 48',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '?', ' 50',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '`', ' 51',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '*', ' 52',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '-', ' 53',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '+', ' 55',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '½', ' 54',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '@', ' 60',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '£', ' 58',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '$', ' 57',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '{', ' 56',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '[', ' 59',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ']', ' 61',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '}', ' 62',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '|', ' 64',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '^', ' 65',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '~', ' 63',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ''', ' 67',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ';', ' 66',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ',', ' 69',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ':', ' 68',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '.', ' 71',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '_', ' 70',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'A', ' 72',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'B', ' 73',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'C', ' 75',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'D', ' 74',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'E', ' 77',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'F', ' 76',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'G', ' 78',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'H', ' 79',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'I', ' 81',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'J', ' 80',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'K', ' 82',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'L', ' 84',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'M', ' 83',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'N', ' 85',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'O', ' 86',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'P', ' 88',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'Q', ' 87',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'R', ' 89',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'S', ' 91',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'T', ' 90',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'U', ' 92',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'V', ' 94',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'X', ' 93',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'Y', ' 95',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'Z', ' 96',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'Æ', ' 98',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'Ø', ' 97',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'Å', ' 99',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, 'W', ' 1A',[rfReplaceAll]);
__________________________________
Dekryptering
__________________________________

RichEdit1.Text := StringReplace(RichEdit1.Text, ' 02', 'a',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 28', 'b',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 01', 'c',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 27', 'd',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 03', 'e',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 26', 'f',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 04', 'g',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 25', 'h',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 05', 'i',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 06', 'j',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 24', 'k',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 23', 'l',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 07', 'm',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 22', 'n',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 08', 'o',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, '  21', 'p',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 09', 'q',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 20', 'r',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 10', 's',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 19', 't',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 11', 'u',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 18', 'v',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 12', 'x',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 17', 'y',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 13', 'z',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 16', 'æ',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 14', 'ø',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 15', 'å',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 29', 'w',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 39', '0',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 30', '1',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 38', '2',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 31', '3',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 35', '4',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 32', '5',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 36', '6',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 33', '7',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 37', '8',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 34', '9',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 40', '§',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 41', '¨',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 43', '#',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 42', '¤',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 44', '%',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 45', '&',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 47', '/',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 46', '(',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 49', ')',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 48', '=',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 50', '?',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 51', '´',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 52', '*',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 53', '-',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 55', '+',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 54', '½',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 60', '@',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 58', '£',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 57', '$',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 56', '{',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 59', '[',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 61', ']',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 62', '}',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 64', '|',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 65', '^',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 63', '~',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 67', ''',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 66', ';',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 69', ',',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 68', ':',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 71', '.',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 70', '_',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 72', 'A',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 73', 'B',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 75', 'C',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 74', 'D',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 77', 'E',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 76', 'F',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 78', 'G',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 79', 'H',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 81', 'I',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 80', 'J',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 82', 'K',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 84', 'L',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 83', 'M',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 85', 'N',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 86', 'O',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 88', 'P',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 87', 'Q',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 89', 'R',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 91', 'S',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 90', 'T',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 92', 'U',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 94', 'V',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 93', 'X',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 95', 'Y',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 96', 'Z',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 98', 'Æ',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 97', 'Ø',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 99', 'Å',[rfReplaceAll]);
RichEdit1.Text := StringReplace(RichEdit1.Text, ' 1A', 'W',[rfReplaceAll]);
Avatar billede zity Nybegynder
02. februar 2003 - 10:19 #4
p.s der kan bygges vidre på den
Avatar billede cyborg_dk Nybegynder
02. februar 2003 - 23:59 #5
Hmm, takker for tilbagemeldinger men MD5 kodningen virker for kompliceret og de 2 andre eksempler virker lige 'usikre' nok til passwords :-(  fandt selv en AES delphi implementering som virker ret ok (og temmelig simpel at bruge modsat MD5 som jeg bare ikke fatter).
Avatar billede borrisholt Novice
03. februar 2003 - 08:28 #6
Skriv lige en mail til Jens@borrisholt.com Så har jeg et færdigt eks til dig.

MD5 er svært at lave, men nem at bruge ...

JEns B
Avatar billede Slettet bruger
03. februar 2003 - 21:57 #7
Du kan måsk bruge dette til noget

unit EnDe;

interface

Types

    TBArray=Packed Array of Byte;
    TEnc=Function(Const Value,Key:Byte):Byte;
    TEncDe=Packed Record
          Key:Array of Byte;
          Func:Array of TEnc;
          End;
    TEncDeArray=Packed Array of TEncDe;

    function EnDecrypt(const Values:TBArray;Key:String;Enc:Boolean):TBArray;
    function EnDeCryptNot(const Value,Key:Byte):Byte;
    function EnDeCryptReverse(const Value,Key:Byte):Byte;
    function DeCryptAdd(const Value,Key:Byte):Byte;
    function EnCryptAdd(const Value,Key:Byte):Byte;
    function EnDeCryptXOR(const Value,Key:Byte):Byte;
    function DeCryptRotate(const Value,Key:Byte):Byte;
    function EnCryptRotate(const Value,Key:Byte):Byte;

implementation

uses SysUtils;

Function Reverse(const V:TEncDeArray):TEncDeArray;
Var
I1,I2:Integer;
Begin
SetLength(Result,Length(V));
For I1:=0 To Length(V)-1 Do
  Begin
  SetLength(Result[I1].Key,Length(V[I1].Key));
  SetLength(Result[I1].Func,Length(V[I1].Key));
  For I2:=0 To Length(V[I1].Key)-1 Do
    Begin
    Result[I1].Key[Length(V[I1].Key)-1-I2]:=V[I1].Key[I2];
    Result[I1].Func[Length(V[I1].Key)-1-I2]:=V[I1].Func[I2];
    End;
  End;
End;

Function KeyToArray(const Key:String;Enc:Boolean):TEncDeArray;
var
C:Char;
B:Byte;
I,I1,I2:Integer;
Begin
I:=1;
C:=Key[I];
B:=StrToInt(C);
SetLength(Result,B);
For I1:=0 To Length(Result)-1 Do
  Begin
  I:=I+1;
  C:=Key[I];
  B:=StrToInt(C);
  SetLength(Result[I1].Key,B);
  SetLength(Result[I1].Func,B);
  For I2:=0 To Length(Result[I1].Key)-1 Do
    Begin
    I:=I+1;
    C:=Key[I];
    Case C of
      'N':Begin
        Result[I1].Key[I2]:=0;
        Result[I1].Func[I2]:=Addr(EnDeCryptNot);
      End;
      'R':Begin
        Result[I1].Key[I2]:=0;
        Result[I1].Func[I2]:=Addr(EnDeCryptReverse);
      End;
      'A':Begin
        I:=I+1;
        C:=Key[I];
        B:=100*StrToInt(C);
        I:=I+1;
        C:=Key[I];
        B:=B+10*StrToInt(C);
        I:=I+1;
        C:=Key[I];
        B:=B+StrToInt(C);
        Result[I1].Key[I2]:=B;
        If Enc Then
        Result[I1].Func[I2]:=Addr(EnCryptAdd)
        Else
        Result[I1].Func[I2]:=Addr(DeCryptAdd);
      End;
      'X':Begin
        I:=I+1;
        C:=Key[I];
        B:=100*StrToInt(C);
        I:=I+1;
        C:=Key[I];
        B:=B+10*StrToInt(C);
        I:=I+1;
        C:=Key[I];
        B:=B+StrToInt(C);
        Result[I1].Key[I2]:=B;
        Result[I1].Func[I2]:=Addr(EnDeCryptXor);
      End;
      'S':Begin
        I:=I+1;
        C:=Key[I];
        B:=StrToInt(C);
        Result[I1].Key[I2]:=B;
        If Enc Then
        Result[I1].Func[I2]:=Addr(EnCryptRotate)
        Else
        Result[I1].Func[I2]:=Addr(DeCryptRotate);
      End;
    End;
    End;
  End;
If Not Enc Then
  Result:=Reverse(Result);
End;

function EnDecrypt(const Values:TBArray;Key:String;Enc:Boolean):TBArray;
var
I1,I2,I3:Integer;
V:TEncDeArray;
B:Byte;
Begin
V:=KeyToArray(Key,Enc);
SetLength(Result,Length(Values));
I2:=0;
For I1:=0 To Length(Values)-1 Do
  Begin
  B:=Values[I1];
  For I3:=0 To Length(V[I2].Key)-1 Do
    B:=V[I2].Func[I3](B,V[I2].Key[I3]);
  Result[I1]:=B;
  I2:=I2+1;
  If I2=Length(V) Then
    I2:=0;
  End;
End;

function EnDeCryptNot(const Value,Key:Byte):Byte;
asm
Not Al
end;

function EnDeCryptReverse(const Value,Key:Byte):Byte;
var
B1,B2:Byte;
asm
Push ECX
Mov CH,AL
Xor AL,AL
Mov CL,CH
And CL,128
Shr CL,7
Add AL,CL
Mov CL,CH
And CL,64
Shr CL,5
Add AL,CL
Mov CL,CH
And CL,32
Shr CL,3
Add AL,CL
Mov CL,CH
And CL,16
Shr CL,1
Add AL,CL
Mov CL,CH
And CL,8
Shl CL,1
Add AL,CL
Mov CL,CH
And CL,4
Shl CL,3
Add AL,CL
Mov CL,CH
And CL,2
Shl CL,5
Add AL,CL
Mov CL,CH
And CL,1
Shl CL,7
Add AL,CL
Pop ECX
end;

function EnCryptAdd(const Value,Key:Byte):Byte;
asm
Add Al,DL
end;

function DeCryptAdd(const Value,Key:Byte):Byte;
asm
Sub Al,DL
end;

function EnDeCryptXOR(const Value,Key:Byte):Byte;
asm
Xor AL,DL
end;

function EnCryptRotate(const Value,Key:Byte):Byte;
asm
Push ECX
Mov CL,DL
Ror AL,CL
Pop ECX
end;

function DeCryptRotate(const Value,Key:Byte):Byte;
asm
Push ECX
Mov CL,DL
Rol AL,CL
Pop ECX
end;

end.

Den enset function du behøver at tænke på er EnDeCrypt
Values Siger sig selv
Key er lidt speciel

Her er et par eksempler 32RX0551A1973X123S3R
    og 43RX055S22A197N2X123S32RN
Det første tal siger hvor mange forskellige måder den skal ændre værdierne på
Og Lige så høj som verdien er kommer der en del mere som er opbygget af et tal der siger hvor mange gange den byte der er indlæst skal ændre og derefter kommer der ligsom før en del mere afhengig af værdien Som starter med et bogstav enten N R A X eller S Vis det er N eller R så skal der ikke mere på hvis det er A eller X skal der stå tre tal som angiver en værdi imellem 0 og 255 og Hvis det er et S skal der stå et tal som angiver en værdi imellem 0 og 7.

Jeg håber at du kan forstå det ellers kan jeg komme med en anden forklaring

Mvh. Simon
Avatar billede cyborg_dk Nybegynder
05. februar 2003 - 09:29 #8
Hoi Simon.

Puha ja den ser komplex ud, men jeg prøver lige at kikke på den en af dagene (der skal vist lige mere end 2 minutter til at 'fortolke' den ;-)
Avatar billede megabyte_ Nybegynder
15. februar 2003 - 17:04 #9
Har noget base64 crypt hvis du vil have det sig lige til da jeg lige skal finde det først

/MB
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