Обновилась библиотека cryptohash.lib от 22.12.06 by drizz <1of00@gmx.net> http://drizz.t35.com/ Добавился twofish, реверс CRC32, расширился набор инструментов для работы со строками, оптимизировались CRC16, CRC32 и появилась папка examples с тестами библиотеки на масме и на c. Однако, тест на с <chtest2.c> не сравнить с тестом на масме ((, поэтому написал свой тест на c - по образу и подобию масмовского, вроде бы прошёлся по всем хэшам, чексумам и сипхерсам. Сырец в аттаче. Код (Text): // R4iN test for cryptohash.lib updated 22.12.06 by drizz <1of00@gmx.net> // http://drizz.t35.com/ // M$VC compile: cl r4intest.c #include "cryptohash.h" #pragma comment(lib,"cryptohash.lib") void main() { unsigned char Key[] = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"; unsigned char InBuffer[255], OutBuffer[255], TempBuffer[255]; unsigned int InBufferSize, Passes, DigestSizeBits; printf("Enter string to hash: "); gets(InBuffer); InBufferSize = strlen(InBuffer); printf("hashing '%s' lenght: %d\n\n", InBuffer, InBufferSize); // checksums CRC16, CRC32, ADLER32 printf("CRC16: \t%X\n", CRC16(&InBuffer[0], InBufferSize, INIT_CRC16)); printf("CRC32: \t%X\n", CRC32(&InBuffer[0], InBufferSize, INIT_CRC32)); printf("ADLER32: %X\n", Adler32(&InBuffer[0], InBufferSize, INIT_ADLER32)); // hashes MD2, MD4, MD5, RMD128, RMD160, RMD256, RMD320, SHA0, SHA1, SHA256, SHA384, SHA512, Tiger, Whirlpool, Haval MD2Init(); MD2Update(&InBuffer[0],InBufferSize); HexEncode(MD2Final(),MD2_DIGESTSIZE,&OutBuffer[0]); printf("MD2: \t%s\n", OutBuffer); MD4Init(); MD4Update(&InBuffer[0],InBufferSize); HexEncode(MD4Final(),MD4_DIGESTSIZE,&OutBuffer[0]); printf("MD4: \t%s\n", OutBuffer); MD5Init(); MD5Update(&InBuffer[0],InBufferSize); HexEncode(MD5Final(),MD5_DIGESTSIZE,&OutBuffer[0]); printf("MD5: \t%s\n", OutBuffer); RMD128Init(); RMD128Update(&InBuffer[0],InBufferSize); HexEncode(RMD128Final(),RMD128_DIGESTSIZE,&OutBuffer[0]); printf("RMD128: %s\n", OutBuffer); RMD160Init(); RMD160Update(&InBuffer[0],InBufferSize); HexEncode(RMD160Final(),RMD160_DIGESTSIZE,&OutBuffer[0]); printf("RMD160: %s\n", OutBuffer); RMD256Init(); RMD256Update(&InBuffer[0],InBufferSize); HexEncode(RMD256Final(),RMD256_DIGESTSIZE,&OutBuffer[0]); printf("RMD256: %s\n", OutBuffer); RMD320Init(); RMD320Update(&InBuffer[0],InBufferSize); HexEncode(RMD320Final(),RMD320_DIGESTSIZE,&OutBuffer[0]); printf("RMD320: %s\n", OutBuffer); SHA0Init(); SHA0Update(&InBuffer[0],InBufferSize); HexEncode(SHA0Final(),SHA0_DIGESTSIZE,&OutBuffer[0]); printf("SHA0: %s\n", OutBuffer); SHA1Init(); SHA1Update(&InBuffer[0],InBufferSize); HexEncode(SHA1Final(),SHA1_DIGESTSIZE,&OutBuffer[0]); printf("SHA1: %s\n", OutBuffer); SHA256Init(); SHA256Update(&InBuffer[0],InBufferSize); HexEncode(SHA256Final(),SHA256_DIGESTSIZE,&OutBuffer[0]); printf("SHA256: %s\n", OutBuffer); SHA384Init(); SHA384Update(&InBuffer[0],InBufferSize); HexEncode(SHA384Final(),SHA384_DIGESTSIZE,&OutBuffer[0]); printf("SHA384: %s\n", OutBuffer); SHA512Init(); SHA512Update(&InBuffer[0],InBufferSize); HexEncode(SHA512Final(),SHA512_DIGESTSIZE,&OutBuffer[0]); printf("SHA512: %s\n", OutBuffer); TigerInit(); TigerUpdate(&InBuffer[0],InBufferSize); HexEncode(TigerFinal(),TIGER_DIGESTSIZE,&OutBuffer[0]); printf("Tiger: %s\n", OutBuffer); WhirlpoolInit(); WhirlpoolUpdate(&InBuffer[0],InBufferSize); HexEncode(WhirlpoolFinal(),WHIRLPOOL_DIGESTSIZE,&OutBuffer[0]); printf("Whirlpool: %s\n", OutBuffer); for(DigestSizeBits = 128; DigestSizeBits <= 256; DigestSizeBits +=32) { for(Passes = 3; Passes <= 5; Passes++) { HavalInit(DigestSizeBits,Passes); HavalUpdate(&InBuffer[0],InBufferSize); HexEncode(HavalFinal(),DigestSizeBits/8,&OutBuffer[0]); printf("Haval(%d,%d): %s\n", DigestSizeBits, Passes, OutBuffer); } } // ciphers DES, RC2, RC4, RC5, RC6, TEA, XTEA, Rijndael, ThreeWay, Blowfish, Twofish DESSetKey(&Key[0]); DESSetKeyEnc(&Key[0]); DESEncrypt (&InBuffer[0],&TempBuffer[0]); HexEncode(&TempBuffer[0],8,&OutBuffer[0]); printf("DES: %.16s\n", OutBuffer); RC2Init(&Key[0],sizeof(Key) - 1); RC2Encrypt(&InBuffer[0],&TempBuffer[0]); HexEncode(&TempBuffer[0],8,&OutBuffer[0]); printf("RC2: %.16s\n", OutBuffer); RC4Init(&Key[0],sizeof(Key) - 1); memcpy(&TempBuffer,&InBuffer,8); // like drizz recommended to do RC4Encrypt(&TempBuffer[0],8); HexEncode(&TempBuffer[0],8,&OutBuffer[0]); printf("RC4: %.16s\n", OutBuffer); RC5Init(&Key[0]); RC5Encrypt(&InBuffer[0],&TempBuffer[0]); HexEncode(&TempBuffer[0],8,&OutBuffer[0]); printf("RC5: %.16s\n", OutBuffer); RC6Init(&Key[0],sizeof(Key) - 1); RC6Encrypt(&InBuffer[0],&TempBuffer[0]); HexEncode(&TempBuffer[0],16,&OutBuffer[0]); printf("RC6: %.32s\n", OutBuffer); TEAInit(&Key[0]); TEAEncrypt(&InBuffer[0],&TempBuffer[0]); HexEncode(&TempBuffer[0],8,&OutBuffer[0]); printf("TEA: %.16s\n", OutBuffer); XTEAInit(&Key[0],32); XTEAEncrypt(&InBuffer[0],&TempBuffer[0]); HexEncode(&TempBuffer[0],8,&OutBuffer[0]); printf("XTEA: %.16s\n", OutBuffer); RijndaelInit(&Key[0],sizeof(Key) - 1); RijndaelEncrypt(&InBuffer[0],&TempBuffer[0]); HexEncode(&TempBuffer[0],16,&OutBuffer[0]); printf("Rijndael: %.32s\n", OutBuffer); ThreeWayInit(&Key[0]); ThreeWayEncrypt(&InBuffer[0],&TempBuffer[0]); HexEncode(&TempBuffer[0],12,&OutBuffer[0]); printf("ThreeWay: %.24s\n", OutBuffer); BlowfishInit(&Key[0],sizeof(Key) - 1); BlowfishEncrypt(&InBuffer[0],&TempBuffer[0]); HexEncode(&TempBuffer[0],8,&OutBuffer[0]); printf("Blowfish: %.16s\n", OutBuffer); TwofishInit(&Key[0],sizeof(Key) - 1); TwofishEncrypt(&InBuffer[0],&TempBuffer[0]); HexEncode(&TempBuffer[0],16,&OutBuffer[0]); printf("Twofish: %.32s\n", OutBuffer); getchar(); }