Subversion Repositories decoder

Rev

Blame | Last modification | View Log | RSS feed

  1. {Copyright:      Hagen Reddmann HaReddmann at T-Online dot de
  2.  Author:         Hagen Reddmann
  3.  Remarks:        freeware, but this Copyright must be included
  4.  known Problems: none
  5.  Version:        5.1, Delphi Encryption Compendium
  6.                  Delphi 2-4, BCB 3-4, designed and testet under D3-5
  7.  Description:    secure protected Random Number Generator based on Yarrow
  8.  
  9.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
  10.  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  11.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  12.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
  13.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  14.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  15.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  16.  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  17.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  18.  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  19.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  20. }
  21.  
  22. unit DECRandom;
  23.  
  24. interface
  25.  
  26. implementation
  27.  
  28. uses SysUtils, DECUtil, DECFmt, DECHash;
  29.  
  30. var
  31.   RandomClass: TDECHashClass = THash_SHA1;
  32.   FRegister: array[0..127] of Byte;
  33.   FCounter: Cardinal;
  34.   FHash: TDECHash = nil;
  35.  
  36. function DoProcess: Byte;
  37. begin
  38.   if not IsObject(FHash, RandomClass) then FHash := RandomClass.Create;
  39.   FHash.Init;
  40.   FHash.Calc(FCounter, SizeOf(FCounter));
  41.   FHash.Calc(FRegister, SizeOf(FRegister));
  42.   FHash.Done;
  43.   FRegister[FCounter mod SizeOf(FRegister)] := FRegister[FCounter mod SizeOf(FRegister)] xor FHash.Digest[0];
  44.   Inc(FCounter);
  45.   Result := FHash.Digest[1]; // no real predictable dependency to above FHash.Digest[0] !
  46. end;
  47.  
  48. procedure DoBuffer(var Buffer; Size: Integer);
  49. var
  50.   I: Integer;
  51. begin
  52.   for I := 0 to Size -1 do
  53.     TByteArray(Buffer)[I] := DoProcess;
  54. end;
  55.  
  56. procedure DoSeed(const Buffer; Size: Integer);
  57. var
  58.   I: Integer;
  59.   T: Cardinal;
  60. begin
  61.   if Size >= 0 then              
  62.   begin
  63. // initalize a repeatable Seed  
  64.     FillChar(FRegister, SizeOf(FRegister), 0);
  65.     FCounter := 0;
  66.     for I := 0 to Size -1 do
  67.       FRegister[I mod SizeOf(FRegister)] := FRegister[I mod SizeOf(FRegister)] xor TByteArray(Buffer)[I];
  68.   end else
  69.   begin
  70. // initalize a non-repeatable Seed based on Timers,
  71. // ATTENTION! this way isn't secure inpredictable,
  72. // the user should call RandomSeed(Data, SizeOf(Data)) instead,
  73. // where Date contains as example collected informations based on Human inputs.
  74.     T := RandomSystemTime;
  75.     for I := Low(FRegister) to High(FRegister) do
  76.     begin
  77.       FRegister[I] := FRegister[I] xor Byte(T);
  78.       T := T shl 1 or T shr 31;
  79.     end;
  80.   end;
  81.   for I := Low(FRegister) to High(FRegister) do
  82.     DoProcess;
  83.   FCounter := 0;
  84. end;
  85.  
  86. procedure DoInit;
  87. begin
  88.   DoRandomBuffer := DoBuffer;
  89.   DoRandomSeed := DoSeed;
  90.   DoSeed('', 0);
  91. end;
  92.  
  93. procedure DoDone;
  94. begin
  95.   try
  96.     FHash.Free;
  97.   except
  98.   end;
  99.   FHash := nil;
  100.   FillChar(FRegister, SizeOf(FRegister), 0);
  101.   FCounter := 0;
  102. end;
  103.  
  104. initialization
  105.   DoInit;
  106. finalization
  107.   DoDone;
  108. end.
  109.