2010-04-12 5 views
9

क्या कोई डेल्फी (Win32) के लिए क्रिप्टोग्राफ़िक-सुरक्षित छद्म यादृच्छिक संख्या जेनरेटर लाइब्रेरी की सिफारिश कर सकता है?क्या डेल्फी के लिए कोई क्रिप्टोग्राफिक रूप से सुरक्षित पीआरएनजी पुस्तकालय हैं?

नि: शुल्क या वाणिज्यिक हो सकता है, लेकिन आदर्श रूप से एक सक्रिय परियोजना होगी। मैं इसे स्रोत कोड शामिल करना चाहता हूं।

+0

http://blog.synopse.info/post/AES-CSPRNG देखें - यह एक मजबूत एईएस -256 आधारित क्रिप्टोग्राफिक रूप से सुरक्षित छद्म-यादृच्छिक संख्या जनरेटर है, क्रिप्टोएपी ब्लैक बॉक्स की तुलना में उच्च सुरक्षा के साथ (यह केवल CryptGenRandom का उपयोग करता है एंट्रॉपी स्रोत के रूप में)। –

उत्तर

8

आप Windows CryptoAPI उपयोग कर सकते हैं: उपरोक्त कोड का उपयोग करने का

uses Wcrypt2; 

function GenerateRandom(Len: Cardinal): TBytes; 
var 
    hProv : HCRYPTPROV; 
begin 
    if not CryptAcquireContext(@hProv, 
          nil, 
          MS_ENHANCED_PROV, 
          PROV_RSA_FULL, 
          CRYPT_VERIFYCONTEXT) then 
    CryptAcquireContext(@hProv, 
         nil, 
         MS_ENHANCED_PROV, 
         PROV_RSA_FULL, 
         CRYPT_NEWKEYSET + CRYPT_VERIFYCONTEXT); 

    if hProv > 0 then 
    try 
    SetLength(Result,Len); 
    CryptGenRandom(hProv,Len,@Result[0]); 
    finally 
    CryptReleaseContext(hProv,0); 
    end; 
end; 

उदाहरण:

function BytesToHex(const Bytes: TBytes): string; 
var 
    i : integer; 
begin 
    for i := 0 to Length(Bytes)-1 do 
    Result := Result + IntToHex(Bytes[i],2); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ShowMessage(BytesToHex(GenerateRandom(16))); 
end; 
+2

दूसरा CryptAququireContext केवल तभी निष्पादित किया जाना चाहिए जब GetLastError = NTE_BAD_KEYSET हो। अन्यथा कोड को अपवाद (RaiseLastOSError) बढ़ाएं या खाली सरणी वापस करनी चाहिए। एमएसडीएन स्रोत: http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85)।aspx –

+0

CryptGenRandom कमजोरियों को जानता है। Http://eprint.iacr.org/2007/419.pdf देखें, इसे केवल एक सिद्ध सीएसपीआरएनजी के एन्ट्रॉपी के स्रोत के रूप में उपयोग करने पर विचार करें, उदा। http://blog.synopse.info/post/AES-CSPRNG –

0

ओपनएसएसएल एक संभावना होगी। स्रोत उपलब्ध है हालांकि मुझे पता नहीं है कि डेल्फी संस्करण उपलब्ध है या नहीं। इसमें cryptographically secure prng शामिल है। यह एक सक्रिय परियोजना है, लेकिन जो भी आप खोज रहे हैं उसके लिए यह अधिक हो सकता है।

5

Delphi Encryption Compendium (जो प्रसिद्ध-ish है जर्मन भाषी डेल्फी समुदाय में, लेकिन कहीं और - संभवतः चूंकि इसे आधिकारिक तौर पर प्रचारित नहीं किया जाता है) में क्रिप्टोग्राफ़िक रूप से सुरक्षित Yarrow RNG शामिल है।

function generateRandomNumber: IInteger; 
var 
    A: IInteger; 
begin 
    NRnd(A, 512); // generate 512 Bit random number, 2^512 <= A < 2^513 
    Result := A; 
end; 

initialization 
    // Method 1: uses system timer to initialize the RNG (seed) 
    RandomSeed; 
    // Method 2: use own seed 
    randomSeed(Data, SizeOf(Data)); 
+0

जो यादृच्छिक बीज पीढ़ी पर स्किम करता है, जो स्वयं में एक बड़ी समस्या है। कोई क्रिप्टोएपीआई (जैसा कि अन्य उत्तरों में दिखाया गया है) बीज उत्पन्न करने के लिए और फिर यादृच्छिक उत्पन्न करने के लिए डीईसी का उपयोग कर सकता है। – gabr

+0

@gabr: बीज पीढ़ी निश्चित रूप से एक समस्या है - लेकिन डोमर ने इसके लिए नहीं पूछा था। यदि आप एक अच्छे बीज के साथ डेल्फी पीआरएनजी फ़ीड करते हैं, तो इसे अभी भी क्रिप्टोग्राफिक रूप से सुरक्षित नहीं माना जाता है http: //en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator ... – Leo

+0

सहमत हैं, लेकिन फिर भी इसे इंगित करना होगा - खासकर आपके कोड के रूप में बीज शुरू करने के दो बहुत अच्छे उदाहरण दिखाता है। – gabr

0

मैं भी OpenSSL libraries सुझाव देने के लिए जा रहा था:

बस इकाई DECRandom (और शायद DECUtils) और इस तरह इसका इस्तेमाल (इस उदाहरण IInteger का उपयोग करता है, लेकिन यह अनिवार्य नहीं है) शामिल हैं। और आपको एन्क्रिप्शन, एसएसएल, हैशिंग इत्यादि भी शामिल हैं।
इंडी ने कई शीर्षकों को परिवर्तित कर दिया है और इसमें आरएND_स्क्रीन शामिल है - लेकिन यूआई के बिना प्रोग्रामों पर इसका उपयोग नहीं किया जा सकता है। दुर्भाग्य से यह अधिकांश RAND_ * वाले लोगों को याद करता है - लेकिन वे आयात और उपयोग करने में बहुत आसान हैं।
जैसे:

function RAND_load_file(const filename: PAnsiChar; max_bytes: longint): integer; cdecl; external 'libeay32.dll'; 
function RAND_bytes(buf: PByte; num: integer): integer; cdecl; external 'libeay32.dll'; 
function RAND_pseudo_bytes(buf: PByte; num: integer): integer; cdecl; external 'libeay32.dll'; 
तो कोड में

:

RAND_load_file(PAnsiChar(AnsiString('name-of-seed-file')), 512); 
    //or 
    //RAND_screen; 
    ... 
    ... 
    const 
    PKCS5_SALT_LEN = 8; 
    var 
    salt: TBytes; 
    begin 
    SetLength(salt, PKCS5_SALT_LEN); 
    RAND_pseudo_bytes(@salt[0], PKCS5_SALT_LEN); 
    ... 
    end; 

वही बीज मुद्दों के रूप में अभी भी विचार-विमर्श किया ज़ाहिर है, लागू होते हैं।

2

आईएसएएसी (संकेत, शिफ्ट, संचय, जोड़ें, और गणना), एक तेज पीआरएनजी और क्रिप्टोग्राफिक रूप से सुरक्षित (burtleburtle.net/bob/rand/isaacafa.html) देखें। शायद आईएसएएसी प्रसिद्ध मेर्सन ट्विस्टर पीआरएनजी जितनी तेजी से है।

वोल्फगैंग Ehrhardt इसहाक के लिए Pascal/Delphi बंदरगाह किया और http://www.wolfgang-ehrhardt.de/misc_en.html#prng (स्वतंत्र और उपलब्ध स्रोत) पर उपलब्ध है गया है। लेखक की साइट पर दिए गए एक अन्य डेल्फी बंदरगाह का एक लिंक भी है, लेकिन मैं "वुल्फगैंग एहरहार्ट" संस्करण के साथ जाऊंगा। मैं कई वर्षों से अपनी साइट (http://www.wolfgang-ehrhardt.de/index.html) जानता हूं, और तब से वह पास्कल/डेल्फी दिनचर्या के साथ अद्यतन कर रहा है। निश्चित रूप से इस पर एक विशेषज्ञ होना चाहिए!

संबंधित मुद्दे