2012-12-10 49 views
12

में संपूर्ण फ़ाइल en/de-crypt को संभाल सकता है [अद्यतन] मैं इसके लिए एक बोनस पेश कर रहा हूं। वाकई, मुझे परवाह नहीं है कि कौन सी एन्क्रिप्शन विधि का उपयोग किया जाता है। अधिमानतः एक्सटीईए, आरसी 4, ब्लोफिश जैसे कुछ सरल ... लेकिन आपने चुना है।एकल फ़ाइल एन्क्रिप्शन इम्प्लेमेनेशन की तलाश करना जो डेल्फी और सी

मुझे अपने हिस्से पर न्यूनतम प्रयास चाहिए, अधिमानतः फाइलों को मेरी परियोजनाओं में छोड़ दें और बनाएं।

आदर्श आपको पहले से ही डेल्फी और सी में फ़ाइल को एन/डी-क्रिप्ट करने के लिए कोड का उपयोग करना चाहिए था (मैं एटमेल यूसी 3 माइक्रो प्रोसेसर (सी में कोडिंग) और विंडोज पीसी (डेल्फी में कोडिंग) के बीच फ़ाइलों का व्यापार करना चाहता हूं) दोनों दिशाओं में en-and-de-crypt)।

मेरे पास मजबूत एक एकल पीएएस इकाई और एकल एकल// फ़ाइल के लिए वरीयता है। मैं एक डीएलएल या लाइब्रेरी का उपयोग नहीं करना चाहता हूं जो दर्जनों एन्क्रिप्शन एल्गोरिदम का समर्थन करता है, केवल एक (और मुझे निश्चित रूप से इंस्टॉल प्रोग्राम के साथ कुछ भी नहीं चाहिए)।

मुझे उम्मीद है कि मुझे यहां बहुत पसंद नहीं है, लेकिन मैं & एक सप्ताह से अधिक समय तक कोड का प्रयास कर रहा हूं और अभी भी दो कार्यान्वयन नहीं मिल सकता है। मुझे संदेह है कि केवल कोई ऐसा व्यक्ति जो पहले से ही कर चुका है, मेरी मदद कर सकता है ...

अग्रिम धन्यवाद। न्यूनतम प्रयास के साथ - - एन डी एक फ़ाइल तहखाना और एक पीसी और सी एक पर पर डेल्फी के बीच विदेशी मुद्रा


के रूप में एक my previous post अप करने के लिए का पालन करें, मैं अभी भी कारण है कि मैं यह कर सकते हैं के साथ कुछ बहुत ही सरल कोड रहा हूँ एटम यूसी 3 यू प्रोसेसर।

यह सिद्धांत में सरल लगता है, लेकिन व्यवहार में यह एक दुःस्वप्न है। कई संभावित उम्मीदवार हैं और मैंने दिन व्यतीत करने और उन्हें आजमाने की कोशिश की है - इसका कोई फायदा नहीं हुआ।

कुछ मानवीय पुस्तकालय हैं, जो कई एन्क्रिप्शन एल्गोरिदम का समर्थन करते हैं, और मुझे कुछ हल्का वजन चाहिए (विशेष रूप से सी/यू प्रोसेसर अंत पर)।

कुछ अच्छे लगते हैं, लेकिन स्रोत का एक सेट केवल ब्लॉक मैनिपुलेशन प्रदान करता है, अन्य तार (मैं पूरी फ़ाइल en/de-crypt पसंद करूंगा)।

अधिकांश अर्थपूर्ण पैरामीटर नामों के साथ बहुत ही खराब दस्तावेज हैं, और कार्यों को कॉल करने के लिए कोई उदाहरण कोड नहीं है।

पिछले सप्ताहांत (साथ ही कुछ और दिनों) में, मैंने XTEA, XXTEA और BlowFish कार्यान्वयन के माध्यम से अपना रास्ता जला दिया है, लेकिन जब मैं एन्क्रिप्ट कर सकता हूं, तो मैं प्रक्रिया को उलट नहीं सकता।

अब मैं एईएस -256 देख रहा हूं। क्या किसी को सी में कार्यान्वयन के बारे में पता है जो एक एकल एईएस.सी फ़ाइल है? (प्लस एईएस.एच, बेशक)

सचमुच, मैं कुछ भी ले जाऊंगा जो डेल्फी और सी के बीच पूरी फाइल एन/डी-क्रिप्ट करेगा, लेकिन जब तक कि किसी ने वास्तव में इसे स्वयं नहीं किया है, तो मुझे केवल "कोई भी सुनने की उम्मीद है कार्यान्वयन जो मानक को पूरा करता है "- जो एक अच्छा थूरी है लेकिन मेरे लिए काम नहीं कर रहा है :-(

सी में कोई साधारण एईएस -256 सी है? मेरे पास कुछ उचित दिखने वाला डेल्फी कोड है, लेकिन नहीं यकीन है कि जब तक मैं उन्हें एक साथ कोशिश हो।

अग्रिम धन्यवाद ...

उत्तर

1

वितरित नहीं करना चाहते हैं यहां आरसी 4 कोड है। यह बहुत हल्का है।

सी का उत्पादन पांच वर्षों तक उत्पादन प्रणाली में किया गया है।

मैंने हल्के से डेल्फी कोड का परीक्षण किया है। पास्कल एक लाइन-बाय-लाइन पोर्ट है जिसमें unsigned charByte पर जा रहा है। मैंने केवल डेल्फी विकल्प के साथ फ्री पास्कल में पास्कल चलाया है, न कि डेल्फी स्वयं। सी और पास्कल दोनों में सरल फ़ाइल प्रोसेसर हैं।

सिफरटेक्स्ट को स्कैम्बलिंग मूल क्लीयरक्स्ट को वापस देता है।

कोई भी बग तिथि नहीं है। आशा है इससे तुम्हारी समस्या का समाधान हो गया होगा।

rc4.h

#ifndef RC4_H 
#define RC4_H 

/* 
* rc4.h -- Declarations for a simple rc4 encryption/decryption implementation. 
* The code was inspired by libtomcrypt. See www.libtomcrypt.org. 
*/ 
typedef struct TRC4State_s { 
    int x, y; 
    unsigned char buf[256]; 
} TRC4State; 

/* rc4.c */ 
void init_rc4(TRC4State *state); 
void setup_rc4(TRC4State *state, char *key, int keylen); 
unsigned endecrypt_rc4(unsigned char *buf, unsigned len, TRC4State *state); 

#endif 

rc4.c

void init_rc4(TRC4State *state) 
{ 
    int x; 
    state->x = state->y = 0; 
    for (x = 0; x < 256; x++) 
    state->buf[x] = x; 
} 

void setup_rc4(TRC4State *state, char *key, int keylen) 
{ 
    unsigned tmp; 
    int x, y; 

    // use only first 256 characters of key 
    if (keylen > 256) 
    keylen = 256; 

    for (x = y = 0; x < 256; x++) { 
    y = (y + state->buf[x] + key[x % keylen]) & 255; 
    tmp = state->buf[x]; 
    state->buf[x] = state->buf[y]; 
    state->buf[y] = tmp; 
    } 
    state->x = 255; 
    state->y = y; 
} 

unsigned endecrypt_rc4(unsigned char *buf, unsigned len, TRC4State *state) 
{ 
    int x, y; 
    unsigned char *s, tmp; 
    unsigned n; 

    x = state->x; 
    y = state->y; 
    s = state->buf; 
    n = len; 
    while (n--) { 
    x = (x + 1) & 255; 
    y = (y + s[x]) & 255; 
    tmp = s[x]; s[x] = s[y]; s[y] = tmp; 
    tmp = (s[x] + s[y]) & 255; 
    *buf++ ^= s[tmp]; 
    } 
    state->x = x; 
    state->y = y; 
    return len; 
} 

int endecrypt_file(FILE *f_in, FILE *f_out, char *key) 
{ 
    TRC4State state[1]; 
    unsigned char buf[4096]; 
    size_t n_read, n_written; 

    init_rc4(state); 
    setup_rc4(state, key, strlen(key)); 
    do { 
    n_read = fread(buf, 1, sizeof buf, f_in); 
    endecrypt_rc4(buf, n_read, state); 
    n_written = fwrite(buf, 1, n_read, f_out); 
    } while (n_read == sizeof buf && n_written == n_read); 
    return (n_written == n_read) ? 0 : 1; 
} 

int endecrypt_file_at(char *f_in_name, char *f_out_name, char *key) 
{ 
    int rtn; 

    FILE *f_in = fopen(f_in_name, "rb"); 
    if (!f_in) { 
    return 1; 
    } 
    FILE *f_out = fopen(f_out_name, "wb"); 
    if (!f_out) { 
    close(f_in); 
    return 2; 
    } 
    rtn = endecrypt_file(f_in, f_out, key); 
    fclose(f_in); 
    fclose(f_out); 
    return rtn; 
} 

#ifdef TEST 

// Simple test. 
int main(void) 
{ 
    char *key = "This is the key!"; 

    endecrypt_file_at("rc4.pas", "rc4-scrambled.c", key); 
    endecrypt_file_at("rc4-scrambled.c", "rc4-unscrambled.c", key); 
    return 0; 
} 
#endif 

यहाँ हल्के से पास्कल परीक्षण किया जाता है। मैं सी में स्रोत कोड को भंग कर सकता हूं और पास्कल कार्यान्वयन के साथ इसे ठीक कर सकता हूं।

type 
    RC4State = record 
    x, y : Integer; 
    buf : array[0..255] of Byte; 
    end; 

    KeyString = String[255]; 

procedure initRC4(var state : RC4State); 
var 
    x : Integer; 
begin 
    state.x := 0; 
    state.y := 0; 
    for x := 0 to 255 do 
    state.buf[x] := Byte(x); 
end; 

procedure setupRC4(var state : RC4State; var key : KeyString); 
var 
    tmp : Byte; 
    x, y : Integer; 
begin 
    y := 0; 
    for x := 0 to 255 do begin 
    y := (y + state.buf[x] + Integer(key[1 + x mod Length(key)])) and 255; 
    tmp := state.buf[x]; 
    state.buf[x] := state.buf[y]; 
    state.buf[y] := tmp; 
    end; 
    state.x := 255; 
    state.y := y; 
end; 

procedure endecryptRC4(var buf : array of Byte; len : Integer; var state : RC4State); 
var 
    x, y, i : Integer; 
    tmp : Byte; 
begin 
    x := state.x; 
    y := state.y; 
    for i := 0 to len - 1 do begin 
    x := (x + 1) and 255; 
    y := (y + state.buf[x]) and 255; 
    tmp := state.buf[x]; 
    state.buf[x] := state.buf[y]; 
    state.buf[y] := tmp; 
    tmp := (state.buf[x] + state.buf[y]) and 255; 
    buf[i] := buf[i] xor state.buf[tmp] 
    end; 
    state.x := x; 
    state.y := y; 
end; 

procedure endecryptFile(var fIn, fOut : File; key : KeyString); 
var 
    nRead, nWritten : Longword; 
    buf : array[0..4095] of Byte; 
    state : RC4State; 
begin 
    initRC4(state); 
    setupRC4(state, key); 
    repeat 
    BlockRead(fIN, buf, sizeof(buf), nRead); 
    endecryptRC4(buf, nRead, state); 
    BlockWrite(fOut, buf, nRead, nWritten); 
    until (nRead <> sizeof(buf)) or (nRead <> nWritten); 
end; 

procedure endecryptFileAt(fInName, fOutName, key : String); 
var 
    fIn, fOut : File; 
begin 
    Assign(fIn, fInName); 
    Assign(fOut, fOutName); 
    Reset(fIn, 1); 
    Rewrite(fOut, 1); 
    endecryptFile(fIn, fOut, key); 
    Close(fIn); 
    Close(fOut); 
end; 

{$IFDEF TEST} 
// Very small test. 
const 
    key = 'This is the key!'; 
begin 
    endecryptFileAt('rc4.pas', 'rc4-scrambled.pas', key); 
    endecryptFileAt('rc4-scrambled.pas', 'rc4-unscrambled.pas', key); 
end. 
{$ENDIF} 
+1

में कैसे काम करेगा ठीक है मुझे डेल्फी की eval कॉपी मिल गई है और अगले दिन या दो में इसे बंद करने का प्रयास करेगा। – Gene

+0

मुझे उम्मीद है कि आप करेंगे। मेरे पास बक्षीस या सिस्टम का पुरस्कार देने के लिए 22 घंटे हैं - इसलिए मैं इसे आपको अभी दूंगा। डीएलएल का उपयोग करने के बारे में सुझाव भी अच्छा लगता है। – Mawg

+0

यदि आप डेल्फी और सी कोड पोस्ट करते हैं तो मैं अधिक बाउंस पॉइंट जोड़ूंगा जो दोनों दिशाओं में एक संपूर्ण फ़ाइल को एन/डी-क्रिप्ट करेगा। – Mawg

2

मैं के रूप में पर .NET Micro Framework का उपयोग कर सुझाव है पारिस्थितिक microcontroller (उदा। एटमेल सैम 7 एक्स) एक क्रिप्टो कॉप्रोसेसर के रूप में।आप इसे Netduino पर जांच सकते हैं, जिसे आप लगभग $ 35/£ 30 के लिए चुन सकते हैं। ढांचे में System.Security.Cryptography नेमस्पेस के तहत, अन्य क्रिप्टोग्राफिक फ़ंक्शंस के साथ-साथ आपके लिए उपयोगी हो सकता है, इसके तहत एईएस कार्यान्वयन भी शामिल है। यहां लाभ यह है कि आपको पूरी तरह से परीक्षण और कामकाजी कार्यान्वयन मिलता है, और प्रकार-सुरक्षित कोड के माध्यम से सुरक्षा में वृद्धि होती है।

आप दो माइक्रोकंट्रोलर के बीच संवाद करने के लिए एसपीआई या आई 2 सी का उपयोग कर सकते हैं, या उच्च थ्रूपुट की आवश्यकता होने पर समानांतर में कई आई/ओ लाइनों पर अपने डेटा ट्रांसफर प्रोटोकॉल को बिट-बैंग कर सकते हैं।

मैंने वास्तव में एक आर्डिनो और नेटडिनो (नेटडिनो का उपयोग हार्डवेयर बिटटोरेंट डिवाइस के लिए डेटा के हैश ब्लॉक के साथ किया) के साथ किया और एसपीआई और एक इंटरप्ट तंत्र के माध्यम से उपकरणों के बीच भेजे गए विभिन्न आदेशों का उपयोग करके एक प्राथमिक एसिंक्रोनस सिस्टम लागू किया।

  • Arduino एसपीआई मास्टर है, नेटडिनो एसपीआई गुलाम है।
  • नेटडिनो पर एक जीपीआईओ पिन आउटपुट के रूप में सेट किया गया है, और एक इनपुट के रूप में सेट किया गया है जो interrupt-enabled GPIO pin on the Arduino से जुड़ा हुआ है। यह अंतराल पिन है।
  • Arduino 0xF1 को "हैलो" प्रारंभिक संदेश के रूप में भेजता है।
  • नेटडिनो 0xF2 को एक अक्नोलॉल्जमेंट के रूप में वापस भेजता है।
  • जब Arduino एक ब्लॉक हैश करना चाहता है, तो यह डेटा के बाद 0x48 (ASCII 'एच') भेजता है। जब यह डेटा भेजता है, तो यह CS कम सेट करता है। इसे पूरे बाइट भेजना होगा; CS को कम करना जब प्राप्त बिट्स की संख्या 8 से विभाजित नहीं होती है तो त्रुटि होती है।
  • नेटडिनो डेटा प्राप्त करता है, और 212 बाइट हस्ताक्षरित पूर्णांक के रूप में प्राप्त बाइट्स की संख्या के बाद 0x68 (ASCII 'h') भेजता है। अगर कोई त्रुटि हुई, तो यह बदले में 0x21 (ASCII '!') भेजता है।
  • यदि यह सफल हुआ, तो नेटडिनो हैश की गणना करता है, फिर इंटरप्ट पिन को उच्च सेट करता है। गणना समय के दौरान, Arduino इंतजार करते समय अपनी नौकरी जारी रखने के लिए स्वतंत्र है।
  • Arduino परिणाम का अनुरोध करने के लिए 0x52 (ASCII 'R') भेजता है।
  • नेटडिनो इंटरप्ट पिन को कम करता है, फिर 0x72 (ASCII 'r') और कच्चे हैश डेटा को वापस भेजता है।

चूंकि आर्डिनो जीपीआईओ पिन के माध्यम से इंटरप्ट्स की सेवा कर सकता है, इसलिए उसने मुझे पूरी तरह से अतुल्यकालिक प्रसंस्करण करने की अनुमति दी। Arduino पक्ष पर एक चर ट्रैक करता है कि क्या हम वर्तमान में अपने कार्य को पूरा करने के लिए coprocessor पर इंतजार कर रहे हैं, इसलिए हम इसे एक नया ब्लॉक भेजने की कोशिश नहीं करते हैं, जबकि यह अभी भी पुराने पर काम कर रहा है।

आप एईएस ब्लॉक की गणना के लिए आसानी से इस योजना को अनुकूलित कर सकते हैं।

+1

मैं समय सभी कि (और उत्कृष्ट सहायता जो तुम मुझे अतीत में दे दिया है के लिए), लेकिन बहुत भारी कर्तव्य है कि ** रास्ता है ** लिखने के लिए समय निकालने के लिए +1 दे रहा हूँ। .NET ?? अतिरिक्त प्रोसेसर ?? मैं सिर्फ शेल्फ एस/डब्ल्यू और कम से कम झगड़े के साथ एक छोटी (अधिकतम 50k, शायद ** बहुत ** छोटी) फ़ाइल को एन/डी-क्रिप्ट करना चाहता हूं। आदर्श रूप में मैं एक सिंगल जोड़ना चाहता हूं। पीएएस फिएल और एसी/.एच जोड़ी और एक कॉल के साथ फाइल को एन/डी-क्रिप्ट करने में सक्षम होना चाहिए। – Mawg

+1

एक सुरक्षा परिप्रेक्ष्य से, पूर्व-लिखित पहले से जांच-पड़ताल कार्यान्वयन का उपयोग करना बेहतर है। यदि आप उत्पादन के लिए अपना खुद का कार्यान्वयन कर रहे हैं, तो अपने हार्डवेयर का पूर्ण विश्लेषण करने के लिए एक क्रिप्टोग्राफर और एक पेन्टस्टर किराए पर लें। यदि आप नहीं करते हैं, तो आपको लगभग निश्चित रूप से कोने के मामले मिलेंगे जहां आपका कार्यान्वयन टूट गया है, भले ही आपने "इसे इंटरनेट से खींच लिया", खासकर समय पर हमले, बिजली विश्लेषण इत्यादि के क्षेत्र में। कुछ रोलिंग की लागत पूर्व-निर्मित परामर्श से बहुत कम है, भले ही आपको हार्डवेयर हार्डवेयर प्रोसेसर को ऑफ़लोड करना पड़े। – Polynomial

+0

+1, @ पॉलिनोमियल - मैं शेल्फ से 10% कुछ मांग रहा हूं। किसी भी आवेदन में मैं केवल उन्हीं भागों को कोड करना चाहता हूं जो ऐप के लिए अद्वितीय हैं और कोशिश की गई और परीक्षण किए गए बिल्डिंग ब्लॉक का उपयोग करें। यह न केवल क्रिप्टो पर लागू होता है। आलसी होने से मुझे और अधिक उत्पादक बनाता है ;-) – Mawg

1

संदर्भ एईएस कार्यान्वयन (जो ब्लॉक के साथ काम करता है) प्राप्त करना आसान लगता है, और सीबीसी (या सीटीआर एन्क्रिप्शन) को संभालने के लिए कुछ कोड जोड़ना आसान लगता है। यह, आप केवल जोड़ने से कोड का 30-50 लाइनों की आवश्यकता होगी ~ (सीबीसी के लिए) निम्नलिखित की तरह कुछ:

aes_expand_key(); 

first_block = iv; 

for (i = 0; i < filesize/16; i++) 
{ 
    data_block = read(file, 16); 
    data_block = (data_block^iv); 
    iv = encrypt_block(data_block); 
    write(outputfile, iv); 
} 

// if filesize % 16 != 0, then you also need to add some padding and encrypt the last block 
+0

ओ, उसके लिए 1, धन्यवाद, लेकिन मैं उन अतिरिक्त 30-50 लाइनों को कोड कोड नहीं देख रहा हूं - डेल्फी और सी दोनों में। मैं विशेष रूप से उन्हें डीबग करने की तलाश नहीं कर रहा हूं। मैं शेल्फ समाधान बंद करने के लिए googling जारी रखेंगे। एक बार फिर धन्यवाद। – Mawg

2

Small C library for AES-256 इल्या लेविन ने। लघु कार्यान्वयन, एएसएम-कम, सरल उपयोग। यह सुनिश्चित नहीं है कि यह आपके वर्तमान माइक्रो सीपीयू पर कैसे काम करेगा।

[संपादित करें]
आप कुछ डेल्फी कार्यान्वयन होने का उल्लेख किया गया है, लेकिन मामला कुछ में एक साथ काम नहीं, this या this प्रयास करें।
इसके अलावा मुझे इलिया की लाइब्रेरी का उपयोग करके आर्डिनो (एवीआर-आधारित) मॉड्यूल मिला है - इसलिए इसे आपके माइक्रो सीपीयू पर भी काम करना चाहिए।

+0

+1 यह भी सुनिश्चित नहीं है कि यह डेल्फी – Mawg

2

क्या आप डेल्फी से सी कोड संकलित कर सकते हैं (आप सी ++ बिल्डर से डेल्फी कोड संकलित कर सकते हैं, वीवी के बारे में निश्चित नहीं हैं)। या शायद Free Borland Command line C++ compiler या यहां तक ​​कि एक और सी संकलक का उपयोग करें।

विचार आपके विंडोज ऐप में उसी सी कोड का उपयोग करना है जैसा कि आप अपने माइक्रोप्रोसेसर पर उपयोग करते हैं .. इस तरह आप उचित रूप से सुनिश्चित कर सकते हैं कि कोड दोनों दिशाओं में काम करेगा।


[अपडेट] देखें

http://www.drbob42.com/examines/examin92.htm
http://www.hflib.gov.cn/e_book/e_book_file/bcb/ch06.htm (डेल्फी में उपयोग करते हुए सी ++ कोड)
http://edn.embarcadero.com/article/10156#H11

ऐसा लगता है कि आप एक DLL उपयोग करने की आवश्यकता है, लेकिन आप स्थिर लिंक कर सकते हैं, तो आप इसे

1

एन्क्रिप्शन ताकत मान लिया जाये कि एक मुद्दा है, एक संगठन के चीनी दीवार आवश्यकता, बहुत ही सरल "Sawtooth" एन्क्रिप्शन (i% सापेक्ष 256 ++) fgetc करने के लिए() को जोड़ने की योजना को संतोषजनक के रूप में, नहीं है प्रत्येक बाइट के लिए , फ़ाइल की शुरुआत से शुरू हो सकता है, बस ठीक काम कर सकता है।

मुझे यूसीएचएआर के रूप में घोषित करने से मॉड्यूल आवश्यकता को खत्म कर दिया जाएगा, क्योंकि एकल बाइट इंटीजर मदद नहीं कर सकता है लेकिन इसकी 0-255 रेंज के माध्यम से चक्र हो सकता है।

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

यह बीजलेख हर संभव फ़ाइल प्रकार पर काम करता है, और यदि आप पहले से ही फ़ाइल 7Zipped गया है विशेष रूप से प्रभावी है।

प्रदर्शन असाधारण है। आपको यह भी पता नहीं चलेगा कि कोड वहां है। पूरी तरह से I/O बाध्य।