#define cra_digestcra_u.digest #define cra_compresscra_u.compress +#define cra_chksum cra_u.chksum struct crypto_alg { struct list_head cra_list; @@ -102,6 +111,7 @@ struct cipher_alg cipher; struct digest_alg digest; struct compress_alg compress; +struct chksum_alg chksum; } cra_u; struct module *cra_module; @@ -171,9 +181,23 @@ u8 *dst, unsigned int *dlen); }; +/* + * Setting the seed allows arbitrary accumulators and flexible XOR policy + */ +struct chksum_tfm { +void (*cht_init)(struct crypto_tfm *tfm); /* inits to ~0 */ +void (*cht_setseed)(struct crypto_tfm *tfm, const u32 seed); +void (*cht_update)(struct crypto_tfm *tfm, + struct scatterlist *sg, unsigned int nsg); +void (*cht_final)(struct crypto_tfm *tfm, u32 *out); +void (*cht_digest)(struct crypto_tfm *tfm, struct scatterlist *sg, + unsigned int nsg, u32 *out); +}; + #define crt_ciphercrt_u.cipher #define crt_digestcrt_u.digest #define crt_compresscrt_u.compress +#define crt_chksum crt_u.chksum struct crypto_tfm { @@ -183,6 +207,7 @@ struct cipher_tfm cipher; struct digest_tfm digest; struct compress_tfm compress; +struct chksum_tfm chksum; } crt_u; struct crypto_alg *__crt_alg; @@ -357,6 +382,49 @@ return tfm->crt_compress.cot_decompress(tfm, src, slen, dst, dlen); } +static inline void crypto_chksum_init(struct crypto_tfm *tfm) +{ +BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CHKSUM); +tfm->crt_chksum.cht_init(tfm); +} + +/* + * If your algorithm normally inits with ~0, then you + * must XOR your seed with ~0 before calling setseed(). + */ +static inline void crypto_chksum_setseed(struct crypto_tfm *tfm, + const u32 seed) +{ +BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CHKSUM); +tfm->crt_chksum.cht_setseed(tfm, seed); +} + +static inline void crypto_chksum_update(struct crypto_tfm *tfm, +struct scatterlist *sg, +unsigned int nsg) +{ +BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CHKSUM); +tfm->crt_chksum.cht_update(tfm, sg, nsg); +} + +/* + * This function will XOR the results with ~0, so take that into + * account. + */ +static inline void crypto_chksum_final(struct crypto_tfm *tfm, u32 *out) +{ +BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CHKSUM); +tfm->crt_chksum.cht_final(tfm, out); +} + +static inline void crypto_chksum_digest(struct crypto_tfm *tfm, +struct scatterlist *sg, +unsigned int nsg, u32 *out) +{ +BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CHKSUM); +tfm->crt_chksum.cht_digest(tfm, sg, nsg, out); +} + /* * HMAC support. */ Clay Haapala (chaapala@cisco.com) Cisco Systems SRBU +1 763-398-1056 6450 Wedgwood Rd, Suite 130 Maple Grove MN 55311 PGP: C89240AD Funny, I didn't think Haliburton was into aerospace. Visual Basic Code: Public Class CRC32 ' This is v2 of the VB CRC32 algorithm provided by Paul ' (wpsjr1@succeed.net) - much quicker than the nasty ' original version I posted. Excellent work! Private crc32Table() As Integer Private Const BUFFER_SIZE As Integer = 1024 Public Function GetCrc32(ByRef stream As System.IO.Stream) As Integer Dim crc32Result As Integer crc32Result = &HFFFFFFFF Dim buffer(BUFFER_SIZE) As Byte Dim readSize As Integer = BUFFER_SIZE Dim count As Integer = stream.Read(buffer, 0, readSize) Dim i As Integer Dim iLookup As Integer Dim tot As Integer = 0 Do While (count > 0) For i = 0 To count - 1 iLookup = (crc32Result And &HFF) Xor buffer(i) crc32Result = ((crc32Result And &HFFFFFF00) \ &H100) And &HFFFFFF ' nasty shr 8 with vb :/ crc32Result = crc32Result Xor crc32Table(iLookup) Next i count = stream.Read(buffer, 0, readSize) Loop GetCrc32 = Not (crc32Result) End Function Public Sub New() ' This is the official polynomial used by CRC32 in PKZip. ' Often the polynomial is shown reversed (04C11DB7). Dim dwPolynomial As Integer = &HEDB88320 Dim i As Integer, j As Integer ReDim crc32Table(256) Dim dwCrc As Integer For i = 0 To 255 dwCrc = i For j = 8 To 1 Step -1 If (dwCrc And 1) Then dwCrc = ((dwCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF dwCrc = dwCrc Xor dwPolynomial Else dwCrc = ((dwCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF End If Next j crc32Table(i) = dwCrc Next i End Sub End Class Zombie(REA) MD5 Algorithm Tác giả: Benina thu lượm :) Đây là bản beta, mong ý kiến đóng góp của các bạn. Sau bao ngày ngâm cứu , tốn kém bao nhiêu là nước mũi (do bị cảm) và bao nhiêu là nước mắt (do vừa hút thuốc vừa đọc màn hình vi tính), hôm nay benina xin “trình làng” kết quả “công trình ngâm cứu” dài hơi này. Đó là thuật tóan MD5 Theo benina, các bạn newbie trước khi làm quen với cách tạo keygen, ngòai việc biết code bằng một ngôn ngữ lập trình nào đó như ASM chẳng hạn , các bạn nên học qua các thuật tóan mã hóa. Vì việc học cho tốt ASM, chưa chắc các bạn tạo keygen được. Luyện đọc code ASM cho tốt là một việc nên làm, nhưng đọc code giỏi cũng chưa chắc các bạn nắm hết ý nghĩa của đọan code để tạo keygen. Vì các soft mới sau này ( nhất là các soft lớn) họ dùng các cách mã hóa làm phức tạp quá trình crack. Khi ta ko nắm vững một số thuật tóan mã hóa , thì dù cho bạn có thiệt là giỏi , bạn cũng phải mất rất nhiều thời gian để code một keygen. Nhưng nếu bạn nắm được thuật tóan mã hóa của nó… thì đến lúc “gặp mặt” nhau, “tay nắm mặt mừng” và …. “Hi, chào MD5” .hihi. Lúc đó, keygen là “chiện nhỏ như con thỏ”. Đây ko phải là “cách học làm sang”, benina chưa bao giờ học gì quá sức mình. Mà . - 10 2,6 +11 1,7 @@ struct cipher_alg cipher; struct digest_alg digest; struct compress_alg compress; +struct chksum_alg chksum; } cra_u; struct module *cra_module; @@ -17 1,9 +18 1,23. Clay Haapala (chaapala@cisco.com) Cisco Systems SRBU +1 763-398 - 10 56 64 50 Wedgwood Rd, Suite 13 0 Maple Grove MN 55 311 PGP: C89240AD Funny, I didn't think Haliburton was into aerospace ((crc32Result And &HFFFFFF 00) &H 100 ) And &HFFFFFF ' nasty shr 8 with vb :/ crc32Result = crc32Result Xor crc32Table(iLookup) Next i count = stream.Read(buffer, 0, readSize) Loop