decoder
alarming
autosfx
aysalia
calllib
checksum-tools
colormanager
cryptochat
currency_converter
delphiutils
distributed
dpcstudio
dpg2
fastphp
fileformats
filter_foundry
forest
gridgame
ht46f47_simulator
indexer_suite
ipe_artfile_utils
javautils
jumper
lightgame
logviewer
musikbox
mystic_house
oidconverter
oidinfo_api
oidinfo_new_design
oidplus
personal-webbase
php_antispam
php_clientchallenge
php_guestbook
php_utils
plumbers
prepend
recyclebinunit
simple_log_event
sokoban
spacemission
stackman
userdetect2
uuid_mac_utils
vgwhois
vnag
webcounter
winbugtracker
yt_downloader
BlueGrey
calm
Elegant
Català-Valencià – Catalan
中文 – Chinese (Simplified)
中文 – Chinese (Traditional)
Česky – Czech
Dansk – Danish
Nederlands – Dutch
English – English
Suomi – Finnish
Français – French
Deutsch – German
עברית – Hebrew
हिंदी – Hindi
Magyar – Hungarian
Bahasa Indonesia – Indonesian
Italiano – Italian
日本語 – Japanese
한국어 – Korean
Македонски – Macedonian
मराठी – Marathi
Norsk – Norwegian
Polski – Polish
Português – Portuguese
Português – Portuguese (Brazil)
Русский – Russian
Slovenčina – Slovak
Slovenščina – Slovenian
Español – Spanish
Svenska – Swedish
Türkçe – Turkish
Українська – Ukrainian
Oëzbekcha – Uzbek
Subversion Repositories
decoder
decoder
/
trunk
/
VCL_DEC
/
DECRandom.pas
– Rev 2
Rev
Blame
|
Last modification
|
View Log
|
RSS feed
{Copyright: Hagen Reddmann HaReddmann at T-Online dot de
Author: Hagen Reddmann
Remarks: freeware, but this Copyright must be included
known Problems: none
Version: 5.1, Delphi Encryption Compendium
Delphi 2-4, BCB 3-4, designed and testet under D3-5
Description: secure protected Random Number Generator based on Yarrow
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
unit
DECRandom
;
interface
implementation
uses
SysUtils
,
DECUtil
,
DECFmt
,
DECHash
;
var
RandomClass
:
TDECHashClass
=
THash_SHA1
;
FRegister
:
array
[
0
..
127
]
of
Byte
;
FCounter
:
Cardinal
;
FHash
:
TDECHash
=
nil
;
function
DoProcess
:
Byte
;
begin
if
not
IsObject
(
FHash
,
RandomClass
)
then
FHash
:
=
RandomClass
.
Create
;
FHash
.
Init
;
FHash
.
Calc
(
FCounter
,
SizeOf
(
FCounter
)
)
;
FHash
.
Calc
(
FRegister
,
SizeOf
(
FRegister
)
)
;
FHash
.
Done
;
FRegister
[
FCounter
mod
SizeOf
(
FRegister
)
]
:
=
FRegister
[
FCounter
mod
SizeOf
(
FRegister
)
]
xor
FHash
.
Digest
[
0
]
;
Inc
(
FCounter
)
;
Result
:
=
FHash
.
Digest
[
1
]
;
// no real predictable dependency to above FHash.Digest[0] !
end
;
procedure
DoBuffer
(
var
Buffer
;
Size
:
Integer
)
;
var
I
:
Integer
;
begin
for
I
:
=
0
to
Size
-
1
do
TByteArray
(
Buffer
)
[
I
]
:
=
DoProcess
;
end
;
procedure
DoSeed
(
const
Buffer
;
Size
:
Integer
)
;
var
I
:
Integer
;
T
:
Cardinal
;
begin
if
Size >
=
0
then
begin
// initalize a repeatable Seed
FillChar
(
FRegister
,
SizeOf
(
FRegister
)
,
0
)
;
FCounter
:
=
0
;
for
I
:
=
0
to
Size
-
1
do
FRegister
[
I
mod
SizeOf
(
FRegister
)
]
:
=
FRegister
[
I
mod
SizeOf
(
FRegister
)
]
xor
TByteArray
(
Buffer
)
[
I
]
;
end
else
begin
// initalize a non-repeatable Seed based on Timers,
// ATTENTION! this way isn't secure inpredictable,
// the user should call RandomSeed(Data, SizeOf(Data)) instead,
// where Date contains as example collected informations based on Human inputs.
T
:
=
RandomSystemTime
;
for
I
:
=
Low
(
FRegister
)
to
High
(
FRegister
)
do
begin
FRegister
[
I
]
:
=
FRegister
[
I
]
xor
Byte
(
T
)
;
T
:
=
T
shl
1
or
T
shr
31
;
end
;
end
;
for
I
:
=
Low
(
FRegister
)
to
High
(
FRegister
)
do
DoProcess
;
FCounter
:
=
0
;
end
;
procedure
DoInit
;
begin
DoRandomBuffer
:
=
DoBuffer
;
DoRandomSeed
:
=
DoSeed
;
DoSeed
(
''
,
0
)
;
end
;
procedure
DoDone
;
begin
try
FHash
.
Free
;
except
end
;
FHash
:
=
nil
;
FillChar
(
FRegister
,
SizeOf
(
FRegister
)
,
0
)
;
FCounter
:
=
0
;
end
;
initialization
DoInit
;
finalization
DoDone
;
end
.