Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Безопасность, Шифрование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2012, 22:01   #1
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию sha256

книжка говорит, что перед тем как считать хеш от сообщения, его нужно разбить на 64-х байтные чанки. более того нужно применить паддинг для того чтобы не было чанков размером меньше 64 байт. паддинг подразумевает добавление единицы, нулей и 64-битного целого. и чего я никак не могу понять, так это

1. нужно ли выполнять паддинг в случае если размер исходного сообщения кратен 64.
2. как выполнять паддинг если
____________________________ 64 - размер_неполного_чанка <= 8

нужна подсказка
f.hump вне форума Ответить с цитированием
Старый 04.04.2012, 13:03   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

вопрос решен. в обоих случаях нужно добавлять дополнительный чанк паддига.
f.hump вне форума Ответить с цитированием
Старый 13.01.2014, 22:42   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

просматривал старую писанину, обнаружил это
Код:
const unsigned int p_h256[] = {	0x6a09a667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19	};

const unsigned int p_r256[] = {	0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
								0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
								0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
								0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
								0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
								0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
								0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
								0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
							};


unsigned int bswap32(unsigned int ival) {
	return (ival >> 24) | (ival << 24) | ((ival >> 8) & 0xFF00) | ((ival & 0xFF00) << 8);
}

unsigned int s1(unsigned int vl) {
	return ((vl>>17) | (vl<<15)) ^ ((vl>>19) | (vl<<13)) ^ (vl>>10);
}

unsigned int s0(unsigned int vl) {
	return ((vl>>18) | (vl<<14)) ^ ((vl>>7) | (vl<<25)) ^ (vl>>3);
}

unsigned int S0(unsigned int vl) {
	return ((vl>>2) | (vl<<30)) ^ ((vl>>13) | (vl<<19)) ^ ((vl>>22) | (vl<<10));
}

unsigned int S1(unsigned int vl) {
	return ((vl>>6) | (vl<<26)) ^ ((vl>>11) | (vl<<21)) ^ ((vl>>25) | (vl<<7));
}

unsigned int Ch(unsigned int * po) {
	return (po[0] & po[1]) ^ (~po[0] & po[2]);
}

unsigned int Maj(unsigned int * po) {
	return (po[0] & po[1]) ^ (po[0] & po[2]) ^ (po[1] & po[2]);
}


void slow_sha256(unsigned int * hash, const char * message, unsigned int mlength, bool hist) {
	unsigned int w[64], totM(0), T1(0), T2(0), mumu[8], l0;
	char emes[128];
	const unsigned int * mess = reinterpret_cast<const unsigned int *>(message);
	

	for (unsigned int i(0);i<128;i++) emes[i] = 0;
	
	totM = mlength / 64;

	l0 = mlength % 64;
	for (unsigned int i(0);i<l0;i++) emes[i] = message[totM*64+i];
	emes[l0] = 0x80;

	if (l0<56) {
		reinterpret_cast<unsigned int *>(emes+60)[0] = bswap32(mlength*8);		
	} else {
		reinterpret_cast<unsigned int *>(emes+124)[0] = bswap32(mlength*8);		
	}

	if (hist) for (unsigned int i(0);i<8;i++) hash[i] = bswap32(hash[i]);
	else for (unsigned int i(0);i<8;i++) hash[i] = p_h256[i];
	
	for (unsigned int mc(0);mc<totM;mc++) {
// expansion		
		for (unsigned int i(0);i<16;i++) w[i] = bswap32(mess[mc*16+i]);
		
		for (unsigned int i(16);i<64;i++) w[i] = w[i-7] + w[i-16] + s1(w[i-2]) + s0(w[i-15]);

// compression
		for (unsigned int i(0);i<8;i++) mumu[i] = hash[i];

		for (unsigned int i(0);i<64;i++) {
			T1 = mumu[7] + S1(mumu[4]) + Ch(mumu+4) + w[i] + p_r256[i];
			T2 = S0(mumu[0]) + Maj(mumu);

			mumu[7] = mumu[6];
			mumu[6] = mumu[5];
			mumu[5] = mumu[4];
			mumu[4] = T1 + mumu[3];
			mumu[3] = mumu[2];
			mumu[2] = mumu[1];
			mumu[1] = mumu[0];
			mumu[0] = T1 + T2;
		}

		for (unsigned int i(0);i<8;i++) hash[i] += mumu[i];
	}

	l0 = (l0 / 56) + 1;
	mess = reinterpret_cast<unsigned int *>(emes);

	for (unsigned int mc(0);mc<l0;mc++) {
// expansion		
		for (unsigned int i(0);i<16;i++) w[i] = bswap32(mess[mc*16+i]);
		for (unsigned int i(16);i<64;i++) w[i] = w[i-7] + w[i-16] + s1(w[i-2]) + s0(w[i-15]);

// compression
		for (unsigned int i(0);i<8;i++) mumu[i] = hash[i];

		for (unsigned int i(0);i<64;i++) {
			T1 = mumu[7] + S1(mumu[4]) + Ch(mumu+4) + w[i] + p_r256[i];
			T2 = S0(mumu[0]) + Maj(mumu);

			mumu[7] = mumu[6];
			mumu[6] = mumu[5];
			mumu[5] = mumu[4];
			mumu[4] = T1 + mumu[3];
			mumu[3] = mumu[2];
			mumu[2] = mumu[1];
			mumu[1] = mumu[0];
			mumu[0] = T1 + T2;
		}

		for (unsigned int i(0);i<8;i++) hash[i] += mumu[i];
	}

	for (unsigned int i(0);i<8;i++) hash[i] = bswap32(hash[i]);
}
f.hump вне форума Ответить с цитированием
Старый 13.01.2014, 22:45   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
const unsigned __int64 p_h512[] = {	0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179	};

const unsigned __int64 p_r512[] = {	0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,
									0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,
									0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,
									0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,
									0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,
									0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,
									0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,
									0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,
									0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,
									0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
								};

unsigned __int64 bswap64(unsigned __int64 ival) {
	return (unsigned __int64)bswap32(ival>>32) | ((unsigned __int64)bswap32(ival & 0xFFFFFFFF) << 32);
}

unsigned __int64 s1_5(unsigned __int64 vl) {
	return ((vl>>19) | (vl<<45)) ^ ((vl>>61) | (vl<<3)) ^ (vl>>6);
}

unsigned __int64 s0_5(unsigned __int64 vl) {
	return ((vl>>1) | (vl<<63)) ^ ((vl>>8) | (vl<<56)) ^ (vl>>7);
}

unsigned __int64 S0_5(unsigned __int64 vl) {
	return ((vl>>28) | (vl<<36)) ^ ((vl>>34) | (vl<<30)) ^ ((vl>>39) | (vl<<25));
}

unsigned __int64 S1_5(unsigned __int64 vl) {
	return ((vl>>14) | (vl<<50)) ^ ((vl>>18) | (vl<<46)) ^ ((vl>>41) | (vl<<23));
}

unsigned __int64 Ch_5(unsigned __int64 * po) {
	return (po[0] & po[1]) ^ (~po[0] & po[2]);
}

unsigned __int64 Maj_5(unsigned __int64 * po) {
	return (po[0] & po[1]) ^ (po[0] & po[2]) ^ (po[1] & po[2]);
}
f.hump вне форума Ответить с цитированием
Старый 13.01.2014, 22:45   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
void slow_sha512(unsigned __int64 * hash, const char * message, unsigned __int64 mlength, bool hist) {
	unsigned __int64 w[80], totM(0), T1(0), T2(0), mumu[8], l0;
	char emes[256];
	const unsigned __int64 * mess = reinterpret_cast<const unsigned __int64 *>(message);

	for (unsigned int i(0);i<256;i++) emes[i] = 0;
	
	totM = mlength / 128;

	l0 = mlength % 128;
	for (unsigned int i(0);i<l0;i++) emes[i] = message[totM*128+i];
	emes[l0] = 0x80;

	if (l0<112) {
		reinterpret_cast<unsigned __int64 *>(emes+120)[0] = bswap64(mlength*8);
	} else {
		reinterpret_cast<unsigned __int64 *>(emes+248)[0] = bswap64(mlength*8);
	}

	if (hist) for (unsigned int i(0);i<8;i++) hash[i] = bswap64(hash[i]);
	else for (unsigned int i(0);i<8;i++) hash[i] = p_h512[i];
	

	for (unsigned int mc(0);mc<totM;mc++) {
// expansion		
		for (unsigned int i(0);i<16;i++) w[i] = bswap64(mess[mc*16+i]);

		for (unsigned int i(16);i<80;i++) w[i] = w[i-7] + w[i-16] + s1_5(w[i-2]) + s0_5(w[i-15]);

// compression
		for (unsigned int i(0);i<8;i++) mumu[i] = hash[i];

		for (unsigned int i(0);i<80;i++) {
			T1 = mumu[7] + S1_5(mumu[4]) + Ch_5(mumu+4) + w[i] + p_r512[i];
			T2 = S0_5(mumu[0]) + Maj_5(mumu);

			mumu[7] = mumu[6];
			mumu[6] = mumu[5];
			mumu[5] = mumu[4];
			mumu[4] = T1 + mumu[3];
			mumu[3] = mumu[2];
			mumu[2] = mumu[1];
			mumu[1] = mumu[0];
			mumu[0] = T1 + T2;
		}

		for (unsigned int i(0);i<8;i++) hash[i] += mumu[i];
	}

	l0 = (l0 / 112) + 1;
	mess = reinterpret_cast<unsigned __int64 *>(emes);

	for (unsigned __int64 mc(0);mc<l0;mc++) {
// expansion		
		for (unsigned int i(0);i<16;i++) w[i] = bswap64(mess[mc*16+i]);

		for (unsigned int i(16);i<80;i++) w[i] = w[i-7] + w[i-16] + s1_5(w[i-2]) + s0_5(w[i-15]);

// compression
		for (unsigned int i(0);i<8;i++) mumu[i] = hash[i];

		for (unsigned int i(0);i<80;i++) {
			T1 = mumu[7] + S1_5(mumu[4]) + Ch_5(mumu+4) + w[i] + p_r512[i];
			T2 = S0_5(mumu[0]) + Maj_5(mumu);

			mumu[7] = mumu[6];
			mumu[6] = mumu[5];
			mumu[5] = mumu[4];
			mumu[4] = T1 + mumu[3];
			mumu[3] = mumu[2];
			mumu[2] = mumu[1];
			mumu[1] = mumu[0];
			mumu[0] = T1 + T2;
		}

		for (unsigned int i(0);i<8;i++) hash[i] += mumu[i];
	}

	for (unsigned int i(0);i<8;i++) hash[i] = bswap64(hash[i]);
}
может кому пригодится
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск