2011-01-21 14 views
13

मैं वर्णों के विभिन्न सेटों के आधार पर हैश को क्रैक करने के लिए आवश्यक गणितीय समय जानना चाहता हूं।कितने SHA256 हैश एक आधुनिक कंप्यूटर गणना कर सकते हैं?

उदाहरण के लिए, केवल 7 अक्षर का उपयोग करके, यूएस-एएससीआईआई वर्णमाला वर्ण हम जानते हैं कि 26 संभावित अनुक्रमों का उपयोग किया जा सकता है। यह जानने के लिए कि इनमें से कितने कंप्यूटर द्वारा हर मिनट उत्पन्न किया जा सकता है, मुझे यह पता चल जाएगा कि सभी संभावित हैंश उत्पन्न करने में कितना समय लगेगा और एक निश्चित 7 वर्ण हैश (जन्मदिन पर हमले) को तोड़ देगा।

उदाहरण के लिए, ऊपर की संख्या लेना, यदि एक आधुनिक क्वाड कोर प्रत्येक मिनट में 1 मिलियन हैश उत्पन्न कर सकता है तो यह उस श्रेणी में सभी संभावित हैंश खोजने के लिए 8031810176/1000000/60 = 133.86 घंटे लेगा।

इसके अलावा, मूल एईएस के साथ नया सैंडी ब्रिज इंटेल चिप्स इस में कैसे खेलता है?

उत्तर

10

मैंने ओपनएसएसएल SHA256 कार्यान्वयन का उपयोग करके सी में यह परीक्षण लिखा था।

#include <stdio.h> 
#include <string.h> 
#include "openssl/sha.h" 

// http://stackoverflow.com/questions/4764608/generate-all-strings-under-length-n-in-c/4764686#4764686 
int inc(char *str) { 
    if (!str[0]) return 0; 

    if (str[0] == 'z') { 
     str[0] = 'a'; 
     return inc(str + sizeof(char)); 
    } 

    str[0]++; 
    return 1; 
} 

unsigned char buffer[65]; 
char* hashstring(char *str, int len) { 
    char hash[SHA256_DIGEST_LENGTH]; // the openssl hash 
    SHA256_CTX sha256; 
    int i; // counter 

    SHA256_Init(&sha256); 
    SHA256_Update(&sha256, str, len); 
    SHA256_Final(hash, &sha256); 

    for (i = 0; i < SHA256_DIGEST_LENGTH; i++) { 
     sprintf(buffer + (i * 2), "%02x", hash[i]); // convert openssl hash to mortal human string 
    } 

    return buffer; 
} 

int main(int argc, char *argv[]) { 
    int N = 4; // max length string 
    char str[N+1]; // the string holder 
    int i; // counter 

    unsigned int tot = 0; // number of hashes calculated 

    for (i = 0; i < N; i++) str[i] = 'a'; 
    str[N] = 0; 

    do { 
     hashstring(str, N); 
     tot++; 
    } while(inc(str)); 

    printf("%d\n", tot); 
} 

संकलित:

gcc -lcrypto -O3 -o test test.c 

और परिणाम (मुझे पता है, मैं computernames साथ बहुत ही रचनात्मक नहीं कर रहा हूँ):

[email protected]:~/c/sha256$ time ./test 
11881376 

real 3m2.431s 
user 3m2.335s 
sys 0m0.008s 

ताकि प्रति सेकंड 11881376/182.4 = 65139 हैश है। फिर यह सभी हैश की गणना करने के लिए 26^7/101821/3600 = 34 घंटे है। कृपया ध्यान दें, यह सब एक एकल-थ्रेडेड एप्लिकेशन में Q6600 क्वाड-कोर CPU पर किया गया था और फ़ाइल को हैश लिखने को छोड़ दिया गया था।

संपादित

ओह, मैं एन पात्रों और नीचे के साथ तार के सभी हैश की गणना की गई थी। सही और डेटा अपडेट किया गया।

+0

तो - अपने कार्यक्रमों में से 4 को स्पिन करें और आप लगभग 400k हैश/सेकंड उत्पन्न कर सकते हैं। – nos

+0

मैं गलत तार उत्पन्न कर रहा था, लेकिन अब यह ठीक है। मैं भी एक रन पर भाग्यशाली हो गया (नोट, यह एक पीसी है, बहुत सी चीजें भी चल रही हैं)। – orlp

+0

धन्यवाद, मेरे पास Q8200 है इसलिए यह मेरे लिए बहुत ही लागू है। मुझे आश्चर्य है कि एक नया सैंडी ब्रिज सीपीयू कितना तेज़ हो सकता है। – Xeoncross

8

याद रखें कि एक जीपीयू एक सीपीयू से 50x - 100x तेज हैश हो सकता है। कार्यक्रम के लिए यह कठिन है, लेकिन अधिक कुशल है। संख्याओं के लिए www.bitcointalk.com देखें। मुझे पता है कि मैं राडेन एचडी 5830 पर 622 मिलियन एसएचए -256 प्रति सेकेंड करता हूं।

+1

"यदि आप कुछ करने जा रहे हैं, तो इसे अच्छी तरह से करें" - जीपीयू – Xeoncross

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