2011-02-09 51 views
5

Mặc dù đây là bài tập đại học (bài tập về nhà) Tôi đã đến với giải pháp tốt nhất mà tôi có thể nghĩ đến. Tôi sẽ đạt được điểm số đầy đủ với mã này vì nó phù hợp với câu hỏi, tuy nhiên tôi đặc biệt được phép phát triển nó trong C# hơn là mọi người khác sử dụng Java, loại "yeh, hiển thị những gì C# có thể làm" thách thức ;-)Điều chỉnh hiệu suất C# hoán vị và mã SHA1

Câu hỏi đặt ra là:

Tạo chương trình tìm mật khẩu của hàm băm SHA1 bằng kỹ thuật brute force, giả sử mật khẩu dài 6 ký tự và chỉ có thể chứa az và 0-9.

Tôi đã tạo truy vấn LINQ và sau khi tôi có các kết hợp có thể, tôi cần phải chạy chúng thông qua SHA1 để nhận băm và so sánh nó với băm mật khẩu được cung cấp.

Tôi tạo ra mã này:

public static string BruteForceHash(string hash) 
     { 

       var results = from c0 in Enumerable.Range(0, 36) 
           from c1 in Enumerable.Range(0, 36) 
           from c2 in Enumerable.Range(0, 36) 
           from c3 in Enumerable.Range(0, 36) 
           from c4 in Enumerable.Range(0, 36) 
           from c5 in Enumerable.Range(0, 36) 
           select new string(
            new[] 
           { 
            Characters[c0], 
            Characters[c1], 
            Characters[c2], 
            Characters[c3], 
            Characters[c4], 
            Characters[c5], 
           } 
           ); 

       string found = null; 
       Parallel.ForEach(results, (result, loopstate, a) => 
               { 
                string hashed = SHA1(result, Encoding.Default); 

                if (hashed == hash) 
                { 
                 found = result; 
                 loopstate.Break(); 
                } 
               }); 

       if (found != null) 
       { 
        return found; 
       } 

      return "Not found."; 
     } 

Bây giờ vấn đề thực sự của tôi là nó giải quyết mật khẩu dễ dàng nhanh chóng ("aaaaaa" là ngay lập tức) nhưng rõ ràng là mất nhiều thời gian hơn nữa mật khẩu là đi từ "aaaaaa".

Tôi hy vọng ai đó có thể cung cấp một số gợi ý về cách tăng hiệu suất.

+1

Giảm chi phí, đó chỉ là về nó. Bạn có thể thủ công một SHA1 thực hiện sử dụng 6 ký tự. Bạn có thể cố gắng giảm chi phí GC, như tại sao bạn sử dụng Enumerable.Range? Tại sao không: 'từ c1 trong ký tự'? Ngoài ra, bạn có thể xem xét thử: 'select (" "+ c0 + c1 + c 2) + (" "+ c3 + c4 + c5)' thay vì các hàm tạo chuỗi dựa trên mảng của bạn. Tuy nhiên, điều này chỉ đi để hiển thị, brute-lực là chậm. –

+2

Không "chạy nó trên một hộp thực sự lớn với rất nhiều lõi" tính? Heck, chạy nó trên một cụm azure ... –

+0

@marc: LOL! :) .... –

Trả lời

2

Nếu bạn khá hài lòng với việc triển khai thì tôi sẽ chạy mã với trình lược tả hiệu suất như YourKit hoặc DotTrace bạn có thể xem điểm nóng trong mã và xem điều chỉnh từ đó. Đôi khi nó tốt đẹp để làm điều này khi bạn đang sử dụng cú pháp có mã sugared như LINQ, theo cách đó bạn có thể có được một cảm giác cho những gì thực sự đang xảy ra dưới mui xe quá ...

Các vấn đề liên quan