2012-05-22 10 views
5

मेरा आवेदन इंटरनेट पर एन्क्रिप्टेड फ़ाइलों भेजता है, मैं निम्नलिखित करने के लिए सक्षम होने की जरूरत है:डेल्फी और PHP में सुरक्षित कीपैयर एन्क्रिप्शन समाधान?

  1. (क्लाइंट साइड डेल्फी 2010): सार्वजनिक अपने आवेदन के साथ भेज दिया कुंजी का उपयोग कर & इसे अपलोड फ़ाइलें एन्क्रिप्ट सर्वर से
  2. (सर्वर साइड PHP): मेरे निजी कुंजी सर्वर पर संग्रहीत
  3. का उपयोग कर अपलोड की गई फ़ाइल डिक्रिप्ट (अपलोड की गई फ़ाइल पर कार्य ...)

सरल लगता है, लेकिन मैं किसी भी विश्वसनीय कोड/घटक नहीं मिल रहा है, मैं इन घटकों पाया:

  1. DCPcrypt। यही वह है जो मैं अभी विकास में उपयोग कर रहा हूं लेकिन कुंजीपैर-आधारित एन्क्रिप्शन (आरएसए?)

  2. GnuPgp (जीपीएल) का समर्थन नहीं करता है, इसलिए मैं इसे अपने वाणिज्यिक ऐप पर उपयोग नहीं कर सकता।

  3. TurboPower LockBox 3: कुंजीपैयर एन्क्रिप्शन का समर्थन करता है लेकिन बहुत ही गुप्त (कोई दस्तावेज AFAIK) नहीं है और फ़ाइल एन्क्रिप्शन का समर्थन नहीं करता है।

मेरा प्रश्न है:

  1. पाना क्या मैं ऊपर वर्णित (यानी कुंजीयुग्म एन्क्रिप्शन।)
  2. PHP का उपयोग decrypted किया जा सकता है: वहाँ एक सुरक्षित/विश्वसनीय एन्क्रिप्शन घटक है कि है
  3. पर बड़ी फ़ाइलें/स्ट्रीम
  4. (यहाँ सपने देखना!) क्या एक साधारण डेल्फी/PHP डेमो है जो दिखाता है कि यह कैसे करें? :)
  5. FOSS समाधान केवल कृपया, मैं पहले से ही wayyy बजट :)
+6

मुक्त करने के लिए अच्छा क्रिप्टो थोड़ा समझ में आता है - यह काफी कौशल का एक बहुत आवश्यकता है प्रोग्रामिंग, सुरक्षा और गणित दोनों में। –

+0

आमतौर पर आप आरएसए या इस तरह की एक पूरी फ़ाइल को क्रिप्ट नहीं करेंगे, क्योंकि यह आमतौर पर धीमा होता है। असममित एक के साथ उपयोग की जाने वाली कुंजी को एन्क्रिप्ट करने के बजाय, आप एक सममित एल्गोरिदम के साथ एन्क्रिप्ट करते हैं। जब तक आप एक सही ढंग से कार्यान्वित मानक एल्गोरिदम डेटा का उपयोग करते हैं, तब तक PHP और डेल्फी दोनों से उपयोग योग्य होगा। लॉकबॉक्स 3 आईएमएचओ एक अच्छी पुस्तकालय नहीं है। –

+0

@ यूजीन मेवेव्स्की'इल्डोस्कोप: क्या आपके पास एक अच्छा छूट कूपन है जो आप मुझे सुरक्षित Blackbox के लिए दे सकते हैं? :) – TheDude

उत्तर

2

आह, क्रिप्टो से अधिक रहा हूँ। एक प्रोग्रामर के बारे में एक कहावत है जो छोटे क्रिप्टो को किसी से भी ज्यादा खतरनाक नहीं जानता है जो किसी को नहीं जानता है।

वास्तव में समान नस पर, मैंने खुले स्रोत का उपयोग करके डिजिटल एक्सएमएल हस्ताक्षर करने का एक तरीका खोजने का प्रयास करने में कुछ समय बिताया। मैं केवल managed to get so far बकलिंग और rock solid third party library प्राप्त करने से पहले। यह शुद्ध मौद्रिक अर्थ में सस्ता नहीं है, लेकिन अब तक मेरे सर्वोत्तम निवेशों में से एक है।

(यह सच है कहानी:। मैं वास्तव में इस पुस्तकालय है कि भले ही टिप्पणियों से हटा दिया गया है के लेखक के साथ एक छोटे से flamewar चढ़ गया ओह, मैं उसे से खरीदने को समाप्त आंकड़ा जाओ।।)

+0

तो, आपका उत्तर * नहीं *, या * हां है, लेकिन यह कठिन है कि मैं आगे बढ़ने के इच्छुक हूं, और मैं किसी के साथ एक बार तर्क में आया *? –

+0

@RobKennedy - यदि आपको लगता है कि उत्तर आपके समय के योग्य नहीं है तो नीचे हट जाएं। –

+3

मुझे यकीन नहीं है कि आपका उत्तर * क्या है *। –

3

मैं करूंगा ओपनएसएसएल के साथ जाओ।
PHP के लिए इसके लिए बहुत समर्थन है, हालांकि मैंने वास्तव में यह कोशिश नहीं की है: उदाहरण के लिए the manual और an example here

डेल्फी को छोटे काम के साथ ओपनएसएसएल के साथ अच्छी तरह से काम करने के लिए बनाया जा सकता है, मैंने यहां कई बार उल्लेख किया है: http://www.disi.unige.it/person/FerranteM/delphiopenssl/। उस पृष्ठ पर कुछ अच्छे उदाहरण भी। और इंडी ओपनएसएसएल आयात पर एक नज़र डालें।

विशिष्ट नहीं घटकों लेकिन निश्चित रूप से मुक्त, लचीला और अपने आप शूटिंग के लिए पूर्ण संभावनाओं के साथ, सुरक्षा के लिहाज से, पैर में :-)

संपादित करें:

डेल्फी के लिए मैं EVP_Seal उपयोग करने पर विचार होगा * कार्यों और आप this SO answer में libeay32.pas फ़ाइल को काटकर अपना संस्करण पा सकते हैं। आपने इसे ned किया क्योंकि इंडी अधिक/किसी भी वास्तविक EVP_ फ़ंक्शंस को सतह या कार्यान्वित नहीं करता है, इसलिए आपको फ़ंक्शन घोषणाएं और कुछ अन्य दिनचर्या आयात करने की आवश्यकता है।

PHP this link के लिए सही समकक्ष लगता है। (गैर परीक्षण किया)

एक बोनस के रूप में, यह आप कैसे EVP_Seal * सामान का उपयोग करने की एक विचार देना चाहिए:

function EVPSeal(ASource: TBytes; const APublicKey: PEVP_PKEY; out Key: TBytes; out IV: TBytes): TBytes; 
var 
    cipher: PEVP_CIPHER; 
    ctx: EVP_CIPHER_CTX; 
    buf: TBytes; 
    block_size, buf_start, out_len, keysize: integer; 
    ek: array[0..0] of PByte; 
    ekl: array[0..0] of integer; 
    pubk: array[0..0] of PEVP_PKEY; 
begin 
    keysize := EVP_PKEY_size(APublicKey); 
    cipher := EVP_aes_256_cbc; 
    SetLength(IV, EVP_MAX_IV_LENGTH); 
    SetLength(Key, keysize); 
    ek[0] := @Key[0]; 
    pubk[0] := APublicKey; 
    buf_start := 0; 
    EVP_CIPHER_CTX_init(@ctx); 
    try 
    EVP_SealInit(@ctx, cipher, @ek[0], @ekl, @IV[0], @pubk[0], 1); 
    block_size := EVP_CIPHER_CTX_block_size(@ctx); 
    SetLength(buf, Length(ASource) + block_size); 
    SetLength(Key, ekl[0]); 
    EVP_SealUpdate(@ctx, @buf[buf_start], out_len, @ASource[0], Length(ASource)); 
    Inc(buf_start, out_len); 
    EVP_SealFinal(@ctx, @buf[buf_start], out_len); 
    Inc(buf_start, out_len); 
    SetLength(buf, buf_start); 
    result := buf; 
    finally 
    EVP_CIPHER_CTX_cleanup(@ctx); 
    end; 
end; 
संबंधित मुद्दे