“ngồi mát ăn bát vàng”. Nghề này chỉ có làm một việc là nhận 1 message text (như thư từ chẳng hạn), sau đó chuyển thông tin text đó thành 1 chuổi mật mã 0,1 theo một quy luật gọi là khóa “Key” và rồi “gỏ” tín hiệu 0,1 đó bằng 1 công cụ đặc biệt để chuyển đi bằng sóng điện từ (nên được gọi là gỏ dây thép). Người nhận tín hiệu bên kia ghi lại chuổi mã hóa 0,1 và dựa vào khóa “key” qui định mà chuyển ra tín hiệu text. Đấy là qui trình chuyển 1 tín hiệu mã hóa. Ví dụ này để các bạn dể hình dung ra cách mã hóa tin hiệu text như thế nào và nó cũng là một ví dụ thật “thô sơ” cho thuật tóan mã hóa Blowfish. GIỚI THIỆU VÀ THUẬT NGỮ Trong chu trình mã hóa, plaintext là tín hiệu mà bạn chuyển đi. Tín hiệu này có thể là một bản báo cáo kiểm tra sức khỏe, một bức thư tình…. Hay một cái gì đó mà nó có thể được diễn tả ra thành một luồng bits. Quá trình mã hóa là biến tín hiệu plaintext thành ciphertext (văn bản đã mã hóa), và quá trình giải mã thì ngược lại chuyển ciphertext thành plaintext Thông thường người ta hay nói rằng, thuật tóan mã hóa có 2 lọai , symmetric (đối xứng) và public (công khai). Thuật tóan đối xứng như Blowfish chẳng hạn , dùng khóa bí mật giống nhau (same secret key) để mã hóa và giải mã. Bạn phải giấu key một cách bí mật chỉ cho người nhận và gởi tín hiệu biết mà thôi. Ví dụ như chúng ta thường sử dụng một password trong IT,thì chỉ có người nhận và người gởi biết mà thôi. Thuật tóan mã hóa khóa công khai (public) là dùng 2 key, một cho mã hóa, khóa kia cho giải mã. Khóa được dùng cho mã hóa gọi là “public key” (khóa công khai) không cần giữ bí mật. Người gởi tín hiệu dùng khóa này để gởi tín hiệu của họ. và người nhận tín hiệu dùng khóa giải mã bí mật hay còn gọi là “private key” (khóa riêng) để đọc tín hiệu nhận được. Khóa public key nó “locks” tín hiệu, còn khóa private key thì “unclocks” tín hiệu: một tín hiệu được mã hóa bằng public key, thì ko ai ngọai trừ người giữ khóa private key có thể giải mã được tín hiệu. RSA là một thuật tóan mã hóa public key thông dụng. Ở đây tui xin lấy một ví dụ để mô tả kiểu mã hóa key public và symmetric như sau (ko biết đúng ko nhe nhưng dễ hình dung,hihi). Nếu các bạn nào có đi du lịch ở khách sạn, hay gia đình khá giả chắc các bạn sẽ biết và đã từng xem truyền hình cáp. Thực ra nó cũng giống như lọai truyền hình bình thường, không phải nối cáp từ đài phát hình đến truyền hình của ta như là cái tên của nó dễ làm ta nhằm lẩn. Nó chỉ khác ở chổ, truyền hình bình thường, các bạn cứ tường tượng tín hiệu của nó là lọai tín hiệu được mã hóa đối xứng, tức là tín hiệu hình ảnh được mã hóa bằng một chuổi tín hiệu được truyền qua sóng điện từ đến truyền hình của ta. Lúc đó truyền hình sẽ giải mã chuổi tín hiệu đó thành hình ảnh bằng 1 khóa giống nhau (same secret key) khi mã hóa và giải mã. Đây là lọai mã hóa đối xứng symmetric . Còn truyền hình cáp thì khác, đài phát hình sẽ mã hóa hình ảnh bằng một khóa “public key” mà tất cả các ăn-ten truyền hình nào cũng nhận được. Nhưng bạn phải có một đầu giải mả tín hiệu (hình dáng giống như một cái đầu máy DVD), có nhiệm vụ giải mã tín hiệu truyền hình đã mã hóa thành tín hiệu hình ảnh thông qua một khóa riêng “private key” kết hợp với khóa “public key” để giải mả. Đó chính là lọai thuật tóan mã hóa công khai. Vậy muốn giải mã một tín hiệu mã hóa bằng thuật tóan symmetric ta phải biết khóa “same secret key” . Và muốn giải mã một tín hiệu mã hóa bằng thuật tóan public key chúng ta bắt buộc phải biết khóa “private key” Ngòai ví dụ trên, các thuật tóan mã hóa còn được sử dụng rất nhiều trong thực tế như : tín hiệu điện thọai di động, hay một vi chương trình cập nhật nâng cấp mà chúng ta thường thấy ,nó sẽ gởi 1 tín hiệu về trang chủ của soft để báo có cần nâng cấp soft ko khi có 1 bản upgrade mới,hoặc được sử dụng trong Embedded systems, vân vân nhiều lắm. Phần lớn thuật tóan đáng tin cậy nhất đã được xuất bản free để cho phân tích (analysis) thỏai mái, bởi vì khóa bảo mật của chúng được sử dụng trong thực tế kiểm chứng rất an tòan. Một thuật tóan tốt nó giống như “ một cái hầm chứa tiền của nhà băng ”: Cái hầm này được làm rất hòan chỉnh , nó là lọai tốt nhất , bạn ko thể vào bên trong hầm mà ko có khóa. Blowfish chính là thuật tóan lọai này, nó rất đáng tin cậy đã được public công khai. Đôi khi một thuật tóan mã hóa bị giới hạn ko free, có nghĩa là chính thuật tóan này được giử bí mật. Chính vì vậy bạn sẽ ko bao giờ biết chắc rằng thuật tóan bị giới hạn đó thật sự yếu kém như thế nào, bởi vì người phát triển ko cho bất cứ ai một cơ hội để phân tích nó. Thuật tóan có thể được sử dụng bảo mật những lọai dữ liệu khác nhau. Đôi khi bạn muốn dữ liệu được “tòan vẹn” khi gởi đi, và tin chắc rằng người nhận sẽ nhận được những thông tin giống đúng như bạn đã gởi,lúc đó bạn cũng phải sử dụng đến thuật tóan mã hóa. Thuật tóan mã hóa cũng cung cấp những “xác nhận”, cho biết chắc rằng một tín hiệu đến từ một người nào đó đã gởi nó đến đó là một vài mục đích sử dụng của thuật tóan mã hóa .Một ứng dụng nữa của các thuật tóan mã hóa nói chung và Blowfish nói riêng là bảo mật phần mềm , ko cho các cracker chôm chỉa. Nó sẽ mã hóa chuổi password (là plaintext) thành chuổi mã hóa ciphertext. Và sao đó sẽ xử lý chuổi ciphertext này Trên đây là những giới thiệu sơ khởi về thuật tóan mã hóa và các ứng dụng của nó trong thực tế nhằm mục đích khởi xứng cho việc ứng dụng vào cracking mà chúng ta quan tâm . Tui xin tóm tắt lại các ý chính trên để chúng ta bắt đầu đi vào phần chính của vấn đề là phân tích thuật tóan Blowfish và ứng dụng trong cracking như thế nào: -plaintext là tín hiệu mà bạn chuyển đi -Ciphertext: tín hiệu mã hóa -Thuật tóan mã hóa có 2 lọai , symmetric (đối xứng) và public (công khai) - Thuật tóan đối xứng (symmetric) như Blowfish chẳng hạn , dùng khóa bí mật giống nhau (same secret key) để mã hóa và giải mã - Thuật tóan mã hóa khóa công khai (public) là dùng 2 key, một cho mã hóa, khóa kia cho giải mã. Khóa được dùng cho mã hóa gọi là “public key” (khóa công khai) không cần giữ bí mật.Khóa được dùng cho giải mã là “private key” (khóa riêng). RSA là một thuật tóan mã hóa public key thông dụng - Vậy muốn giải mã một tín hiệu mã hóa bằng thuật tóan symmetric ta phải biết khóa “same secret key” . Và muốn giải mã một tín hiệu mã hóa bằng thuật tóan public key chúng ta bắt buộc phải biết khóa “private key” -Encryption algorithm thuật tóan mã hóa ở đây khác thuật tóan hash chuổi MD5 là: Thuật tóan mã hóa sẽ mã hóa ra 1 Ciphertext và có thể giải mã ngược lại 1 ciphertext thành 1 plaintext. Còn thuật tóan MD5 thì sẽ hash chuổi thành 1 tín hiệu MD nhưng ko thể biến đổi từ 1 chuổi MD về tín hiệu gốc. Đến đây thì hết phần giới thiệu, phần sao sẽ “chua” hơn phần này . Benina 2004 Patch: Add CRC32C chksums to crypto routines Linux Code: This patch against 2.6.1 adds CRC32C checksumming capabilities to the crypto routines. The structure of it is based wholly on the existing digest (md5) routines, the main difference being that chksums are often used in an "accumulator" fashion, effectively requiring one to set the seed, and the digest algorithms don't do that. CRC32C is a 32-bit CRC variant used by the iSCSI protocol and in other drivers. iSCSI uses scatterlists, so it was strongly suggested by the SCSI maintainers during reviews of Version 4 of the linux-iscsi driver that the code be added to the crypto routines, which operate on scatterlists. Test routines have been added to tcrypt.c. The linux-iscsi project can be found on SourceForge: http://sourceforge.net/projects/linux-iscsi/ diff -urN exclude '*.ko' exclude '*.mod.*' exclude '*~' exclude '*.o*' exclude '.*' exclude '*.cmd' exclude drivers linux-2.6.1.orig/crypto/Kconfig linux/crypto/Kconfig linux-2.6.1.orig/crypto/KconfigFri Jan 9 01:00:03 2004 +++ linux/crypto/KconfigMon Jan 12 10:33:59 2004 @@ -22,6 +22,14 @@ help These are 'Null' algorithms, used by IPsec, which do nothing. +config CRYPTO_CRC32C +tristate "CRC32c CRC algorithm" +depends on CRYPTO +help + Castagnoli, et al Cyclic Redundancy-Check Algorithm. Used + by iSCSI for header and data digests and by others. + See Castagnoli93. + config CRYPTO_MD4 tristate "MD4 digest algorithm" depends on CRYPTO diff -urN exclude '*.ko' exclude '*.mod.*' exclude '*~' exclude '*.o*' exclude '.*' exclude '*.cmd' exclude drivers linux-2.6.1.orig/crypto/Makefile linux/crypto/Makefile linux-2.6.1.orig/crypto/MakefileFri Jan 9 01:00:04 2004 +++ linux/crypto/MakefileMon Jan 12 10:33:59 2004 @@ -4,11 +4,12 @@ proc-crypto-$(CONFIG_PROC_FS) = proc.o -obj-$(CONFIG_CRYPTO) += api.o cipher.o digest.o compress.o \ +obj-$(CONFIG_CRYPTO) += api.o cipher.o digest.o compress.o chksum.o \ $(proc-crypto-y) obj-$(CONFIG_CRYPTO_HMAC) += hmac.o obj-$(CONFIG_CRYPTO_NULL) += crypto_null.o +obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o obj-$(CONFIG_CRYPTO_MD4) += md4.o obj-$(CONFIG_CRYPTO_MD5) += md5.o obj-$(CONFIG_CRYPTO_SHA1) += sha1.o diff -urN exclude '*.ko' exclude '*.mod.*' exclude '*~' exclude '*.o*' exclude '.*' exclude '*.cmd' exclude drivers linux-2.6.1.orig/crypto/api.c linux/crypto/api.c linux-2.6.1.orig/crypto/api.cFri Jan 9 01:00:04 2004 +++ linux/crypto/api.cMon Jan 12 10:33:59 2004 @@ -68,6 +68,9 @@ case CRYPTO_ALG_TYPE_COMPRESS: return crypto_init_compress_flags(tfm, flags); +case CRYPTO_ALG_TYPE_CHKSUM: +return crypto_init_chksum_flags(tfm, flags); + default: break; } @@ -88,6 +91,9 @@ case CRYPTO_ALG_TYPE_COMPRESS: return crypto_init_compress_ops(tfm); +case CRYPTO_ALG_TYPE_CHKSUM: +return crypto_init_chksum_ops(tfm); + default: break; } @@ -111,6 +117,10 @@ crypto_exit_compress_ops(tfm); break;