HÀM HASH (tiếp theo và hết) Quote: Hàm hash (hash function) là hàm một chiều mà nếu đưa một lượng dữ liệu bất kì qua hàm này sẽ cho ra một chuỗi có độ dài cố định ở đầu ra. Ví dụ, từ "Illuminatus" đi qua hàm SHA-1 cho kết quả E783A3AE2ACDD7DBA5E1FA0269CBC58D. Ta chỉ cần đổi "Illuminatus" thành "Illuminati" (chuyển "us" thành "i") kết quả sẽ trở nên hoàn toàn khác (nhưng vẫn có độ dài cố định là 160 bit) A766F44DDEA5CACC3323CE3E7D73AE82. Hai tính chất quan trọng của hàm này là: • Tính một chiều: không thể suy ra dữ liệu ban đầu từ kết quả, điều này tương tự như việc bạn không thể chỉ dựa vào một dấu vân tay lạ mà suy ra ai là chủ của nó được. • Tính duy nhất: xác suất để có một vụ va chạm (hash collision), tức là hai thông điệp khác nhau có cùng một kết quả hash, là cực kì nhỏ. Một số ứng dụng của hàm hash: • Chống và phát hiện xâm nhập: chương trình chống xâm nhập so sánh giá trị hash của một file với giá trị trước đó để kiểm tra xem file đó có bị ai đó thay đổi hay không. • Bảo vệ tính toàn vẹn của thông điệp được gửi qua mạng bằng cách kiểm tra giá trị hash của thông điệp trước và sau khi gửi nhằm phát hiện những thay đổi cho dù là nhỏ nhất. • Tạo chìa khóa từ mật khẩu. • Tạo chữ kí điện tử. SHA-1 và MD5 là hai hàm hash thông dụng nhất và được sử dụng trong rất nhiều hệ thống bảo mật. Vào tháng 8 năm 2004, tại hội nghị Crypto 2004, người ta đã tìm thấy va chạm đối với MD5 và SHA-0, một phiên bản yếu hơn của hàm hash SHA-1. Không bao lâu sau đó, vào khoảng giữa tháng 2 năm 2005, một nhóm ba nhà mật mã học người Trung Quốc đã phát hiện ra một phương pháp có thể tìm thấy va chạm đối với SHA-1 chỉ trong vòng 269 bước tính toán (tức là có thể nhanh hơn brute-force vài nghìn lần). Người dùng bình thường cũng không cần phải hoảng sợ trước những phát hiện này bởi vì ít nhất phải một vài năm nữa người ta mới có khả năng mang những kết quả đó vào trong thực tế. Tuy vậy, các chuyên gia vẫn khuyên nên bắt đầu chuyển sang các hàm hash an toàn hơn như SHA-256, SHA-384 hay SHA-512. Tài liệu tham khảo Về mã hóa ngoài quyển kinh điển "Applied Cryptography Second Edition Protocols Algorthms And Source Code In C" của tác giả BRUCE SCHNEIER (Bruce Schneier là một chuyên gia nổi tiếng thế giới trong lĩnh vực Security đồng thời cũng là tác giả của nhiều cuốn sách rất hay. Ông được đánh giá là một bậc thầy trong lĩnh vực security (Security Guru). Ông là con người sống ngay thẳng và đồng thời là người có những góp ý vể Security rất hay. Khi một người nào đó muốn hiểu thực sự Seurity là như thế nào, tất cả họ đều tìm đến ông. Applied Cryptography, là một trong những cuốn sách bán chạy nhất của ông _ Mọi người có thể tìm thêm thông tin về tác giả qua site : http://www.schneier.com/. Còn có một quyển khác của William Stallings đó là "Cryptography and Network Security"_Quyển này có một bộ Slides gồm 20 Slides Mọi người có thể lên Google để tìm. Kienmanowar(REA) Tutorial is writed by anarchriz Translated by kienmanowar CRC and how to Reverse it A CRC Tutorial & The c00l way to Reverse CRC Lời mở đầu : Bạn luôn luôn muốn biết rằng vậy chính xác CRC nó là cái gì ? Và cũng muốn biết rằng nó thực hiện như thế nào ? Thậm chí bạn cũng đã từng nghĩ ra nhiều cách để reverse CRC, nhưng chưa có cách nào thành công? Và bạn cũng đã từng Patch một đoạn code mà bản thân đoạn code đó không được cảnh báo là CRC ? Thậm chí bạn cũng đã muốn viết một số mẹo anti-antivius để làm cho CRC kiểm tra một cách vô ích ? Tốt , vậy thì bạn đã tìm đến đúng chỗ rồi đó ! Introduction : Bài viết này bao gồm có một bài hướng dẫn về CRC và một bài nói về cách để làm thế nào thay đổi CRC hay nói cách khác là reverse CRC . Có rất nhiều các Coders /Reversers không biết một cách chính xác CRC hoạt động như thế nào và hầu hết không ai biết làm thế nào để reverse nó , trong khi những kiến thức cần phải biết về CRC thì lại rất quan trọng. Dó đó trong tut đầu tiên này sẽ chỉ cho bạn biết làm thế nào để tính CRC (cách thường dùng nhất) , bạn có thể sử dụng nó như một dữ liệu hoặc là code protection. Phần thứ hai là phẩn reverse (đây là phần chính) , sẽ giúp bạn làm thế nào để reverse CRC-32 , bạn có thể sử dụng các kiến thức trong phần này để phá vỡ các CRC protection trong chương trình hay các chương trình khác ví dụ như anti-virus.Có thể đây là một cách hữu dụng và thiết thực nhất mà từ đó tôi có thể ‘correct’ về CRCs cho bạn , nhưng tôi cũng e rằng chúng cũng không thể giải thích được là chúng đang làm cái gì. Tôi cũng muốn cảnh báo với các bạn rằng , từ đây sẽ có một số hàm được sử dụng trong bài viết này. Điều này sẽ không làm ảnh hưởng đến bất kì ai , vì ai cũng có thể hiểu được chúng một cách dễ dàng ngay cả khi chúng ta chỉ là những avarage Coders or Reversers. Tại sao ư, đơn giản thôi vì nếu như bạn không biết được tại sao hàm đó được sử dụng trong CRC thì tôi khuyên bạn rằng bạn nên click chuột vào nút ‘x’ ở phía trên bên phải của màn hình. Vì vậy , tôi cho rằng các bạn đã nắm chắc các kiến thức cơ bản về số nhị phân và các phép toán dùng trong số nhị phân. Tutorials : Part1 : CRC Tutorial, what it is and how to calculate it Cyclic Redundancy Code or CRC -Tất cả chúng ta biết về CRC . Thậm chí nếu bạn không nhắc lại , bạn sẽ nhớ lại về những thông báo đã từng làm cho bạn bực mình của các chương trình nén thông dụng như RAR , ZIP hay là những chương trình nén khác bắn ra khi một file nào đó bị hư hỏng tại vì bad connections hoặc là những đĩa mềm bị hỏng (!@#$% floppies) . CRC là một giá trị được tính toán thông qua một đoạn dữ liệu , lấy ví dụ với mối file khác nhau thì thời gian nén sẽ khác nhau . Khi một archiver đang unpacking một file , nó sẽ đọc CRC và sẽ kiểm tra CRC này với CRC mới đã tính được của file đã được giải nén ( trong trường hợp này chắc là file sau khi Unpacking). Nếu chúng khớp nhau , thì đó là dấu hiệu tốt chứng tỏ các file giống y hệt nhau. Với CRC-32 , cơ hội để nhận biết ra sự khác nhau, sự thay đổi trong dữ liệu là 1/2^32 (Trích dẫn : With CRC-32,there is a chance of 1/2^32 of the check failing to recognize a change in data.) Hầu hết mọi người đều nghĩ rằng CRC là từ viết tắt của Cyclic Redundancy Check . Nếu quả thực CRC là từ viết tắt của Cyclic Redundancy Check thì lại có rất nhiều người sử dụng không đúng thuật ngữ này. Nếu nói như vậy thì bạn không thể nói CRC của một chương trình là 12345678 . Mọi người cũng thường xuyên nói một chương trình cụ thể nào đó có một CRC check, không phải là Cyclic Redundancy Check . Nhưng nói tóm lại là CRC là từ viết tắt của Cyclic Redundancy Code chứ không phải là Cyclic Redundancy Check. Vậy thì việc tính toán được thực hiện như thế nào ? Well , ý tưởng chính là để quan sát , hiểu rõ một file khi mà một chuỗi lớn các bít được chia bởi nhiều số , mà sẽ cho bạn một số dư đó là CRC!. Bạn sẽ luôn có được một số dư ( cũng có thể là 0 ) . Ví dụ (9/3=3 số dư =0 ; (9+2)/3=3 số dư =2). Nhưng ở đây việc chia các bít được thực hiện sẽ có những khác biệt nhỏ . Phép chia là việc lặp đi lặp lại của ( x lần ) phép trừ một số ( số chia ) từ một số mà bạn muốn chia, và từ đó sẽ cho bạn một số dư . Nếu bạn muốn có lại số ban đầu thì bạn có thể nhân kết quả với số chia hoặc có thể cộng (x lần ) số chia với nhau và cuối cùng là đem kết quả đó cộng với số dư sẽ cho ta số bị chia ban đầu. ( Ok sau khi dịch xong đoạn này mình có thể lấy ví dụ cho các bạn như sau : 1) 11/3 = 3 số dư = 2 > vậy để có được số ban đầu là 11 ta thực hiện như sau : lấy kết quả của phép chia (= 3) đem nhân với số chia ( = 3) được bao nhiêu cuối cùng đem cộng với số dư thu được (= 2) . Vậy cuối cùng 11 = 3*3 + 2. 2) Cũng với trường hợp trên nhưng mình lấy ví dụ là phép trừ : 11 – 3 = 8 8 - 3 = 5 5 – 3 = 2 2 – 3 = ke ke đến đây không trừ nữa Các bạn có thể thấy ở trên là việc lặp đi lặp lại của phép trừ , mà ở đây ta có số lần thực hiện là ( x =3 lần) . Do đó để có được số ban đầu ( = 11 ) thì bạn thực hiện như sau : chúng ta sẽ cộng (x = 3 lần) số chia ( = 3 ) với chính nó , kết quả của phép cộng này được bao nhiêu thì chúng ta đem cộng với cái số dư kia ( = 2 ) . Vậy tóm lại : 11 = 3 + 3 + 3 + 2. ). Ok tiếp tục , vậy thì việc tính toán CRC cũng sử dụng một cách đặc biệt của các phép toán trừ và cộng . Lấy ví dụ , có một số mới. Trong quá trình tính toán số nhớ cho mỗi bít thì có một số bị mất. Bạn sẽ xem hai ví dụ sau đây để hiểu rõ hơn về phép cộng không có nhớ và phép cộng có nhớ khác nhau như thế nào . Ví dụ thứ nhất dưới đây chỉ là việc thực hiện một phép trừ bình thường không có gì cả , nhưng các bạn hãy tập trung vào ví dụ 2 & 3 đó là các ví dụ về việc bit carry ( bít nhớ) bị “forgotten”. http://pg.photos.yahoo.com/ph/kienbi &.dnm=ea6d.jpg Trong ví dụ (1) , cột thứ hai tính từ bên phải sang sẽ thực hiện phép tính là 0 – 1 = -1 , vì vậy nó sẽ phải mượn một (vay một ) bít từ bít ngay cạnh nó và điều này sẽ cho bạn một phép tính như sau (10+0) – 1 = 1 ( như bạn thấy phép tính này cũng tương tự như khi bạn trừ trên giấy đối với các số ở hệ 10 ( thập phân )). Trong hai ví dụ đặc biệt tiếp theo là (2) & (3) , phép tính 1 + 1 sẽ cho kết quả là 10 , vậy bít 1 sẽ chính là bít nhờ và bít này sẽ được chuyển cho bít bên cạnh khi ta thực hiện phép tính tiếp theo. Và như các bạn đã thấy , bít này sẽ bị mất đi khi chúng ta tính toán ở bít cuối cùng . Đối với trường hợp đặc biệt 0 - 1 , thì câu trả lời sẽ là = -1 , vậy thì điều gì sẽ tác động lên bít ngay bên cạnh nó ( xem ví dụ 1) . Giá trị này cũng bị mất đi . Nếu bạn biết một chút ít về lập trình , thì nó chính là phép toán XOR. . ( 10 +0) – 1 = 1 ( như bạn thấy phép tính này cũng tương tự như khi bạn trừ trên giấy đối với các số ở hệ 10 ( thập phân )). Trong hai ví dụ đặc biệt tiếp theo là (2) & (3) , phép tính 1 + 1. (1) , cột thứ hai tính từ bên phải sang sẽ thực hiện phép tính là 0 – 1 = -1 , vì vậy nó sẽ phải mượn một (vay một ) bít từ bít ngay cạnh nó và điều này sẽ cho bạn một phép tính như sau ( 10 +0) . SHA -1 và MD5 là hai hàm hash thông dụng nhất và được sử dụng trong rất nhiều hệ thống bảo mật. Vào tháng 8 năm 200 4, tại hội nghị Crypto 200 4, người ta đã tìm thấy va chạm đối với MD5 và SHA -0,