
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдордВрдЧрд▓рд╡рд╛рд░ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдХрд╡рд╛рд╕ рдХрд╛рдо рдХреЗ рд╕рдкреНрддрд╛рд╣ рдХреЛ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рдПрдХ рд╢реМрдХ рд╣реИ, рдЕрдкрдиреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдмрд┐рдЯрдХреЙрдЗрди рдорд╛рдЗрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдХреИрд╕реЗ рд╣реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдмреЗрд╡рдХреВрдл рдиреЙрди рд╕рд░реНрдЪ рд╕реЗ рдмрдЪреЗрдВ рдФрд░ рдХрдо рд╕реЗ рдХрдо рдКрд░реНрдЬрд╛ рдЦрдкрдд рдХреЗ рд╕рд╛рде рд╣реИрд╢ рдорд┐рд▓рд╛рди рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдвреЗрдВред рдореБрдЭреЗ рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рдЕрднреА рддрдХ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЙрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рдЧрд╛ рд╣реИ рдЬреЛ рд╕рд┐рд░ рдореЗрдВ рдкреИрджрд╛ рд╣реБрдП рд╣реИрдВ? рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ ...
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рднреНрд░рдо рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдзреНрдпрдпрди рдХрд░ рд░рд╣рд╛ рд╣реИ
- рд╕реА ++ рднрд╛рд╖рд╛ рдФрд░ рдЙрд╕рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ
- рдХреБрдЫ рдбрд┐рдЬрд┐рдЯрд▓ рд╕рд░реНрдХрд┐рдЯрд░реА
- рд╕рдВрднрд╛рд╡рдирд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рд╕рдВрднрд╛рд╡реНрдп рдЕрдВрдХрдЧрдгрд┐рдд рдХрд╛ рдПрдХ рд╕рд╛
- рдмрд┐рдЯрдХреЙрдЗрди рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ
рд╣рдо рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ?
рд╢рд╛рдпрдж рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдЕрдВрддрд┐рдо рдФрд░ рд╕рдмрд╕реЗ рдЙрдмрд╛рдК рдЖрдЗрдЯрдо рд╕реЗ? рд╕рдмреНрд░ рдХрд░реЛ, рддреЛ рдФрд░ рдордЬрд╛ рдЖрдПрдЧрд╛ред
рдЖрдЗрдП рдмрд┐рдЯрдХреЙрдЗрди рдХреЗ рд╣реИрд╢рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рд╕рд░рд▓ F (x) = sha256 (sha256 (x)) рд╣реИ, рдЬрд╣рд╛рдВ x 80 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рдмреНрд▓реЙрдХ рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдмреНрд▓реЙрдХ рдХреЗ рд╡рд░реНрдЬрди рдирдВрдмрд░, рдкреНрд░рдЪрд▓рд┐рдд рдмреНрд▓реЙрдХ рд╣реИрд╢, рдорд░реНрдХрд▓ рд░реВрдЯ, рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк, рдмрд┐рдЯреНрд╕ рдФрд░ рдиреЙрдиред рдпрд╣рд╛рдБ рд╣рд╛рд▓ рд╣реА рдХреЗ рдмреНрд▓реЙрдХ рд╣реЗрдбрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рд╣реИрд╢рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:
рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдпрд╣ рд╕реЗрдЯ рдХрд╛рдлреА рдореВрд▓реНрдпрд╡рд╛рди рд╕рд╛рдордЧреНрд░реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣реЗрдбрд░ рдмрдирд╛рддреЗ рд╕рдордп рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрдХреНрд╕рд░ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЕрдХреНрд╕рд░ рд▓реЛ рдФрд░ рд╣рд╛рдИ рдмрд╛рдЗрдЯреНрд╕ (рдПрдВрдбрд┐рдпрди) рдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЙрд▓рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ, рдмреНрд▓реЙрдХ рд╣реЗрдбрд░ рд╕реЗ, 80 рдмрд╛рдЗрдЯ рдХреЛ sha256 рд╣реИрд╢ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдПрдХ рдФрд░ sha256ред
рд╕реНрд╡рдпрдВ Sha256 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо, рдпрджрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдорддреМрд░ рдкрд░ рдЪрд╛рд░ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ:
- рд╢реВрдиреНрдп sha256_init (SHA256_CTX * ctx);
- void sha256_transform (SHA256_CTX * ctx, const BYTE рдбреЗрдЯрд╛ []);
- void sha256_update (SHA256_CTX * ctx, const BYTE рдбреЗрдЯрд╛ [], size_t len);
- void sha256_final (SHA256_CTX * ctx, BYTE рд╣реИрд╢ []);
рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рд╣реИ sha256_init (), рдЬреЛ SHA256_CTX рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрда 32-рдмрд┐рдЯ рд░рд╛рдЬреНрдп рд╢рдмреНрджреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╡рд╣рд╛рдВ рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╢реБрд░реВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрджреЛрдВ рд╕реЗ рднрд░реЗ рд╣реЛрддреЗ рд╣реИрдВ:
void sha256_init(SHA256_CTX *ctx) { ctx->datalen = 0; ctx->bitlen = 0; ctx->state[0] = 0x6a09e667; ctx->state[1] = 0xbb67ae85; ctx->state[2] = 0x3c6ef372; ctx->state[3] = 0xa54ff53a; ctx->state[4] = 0x510e527f; ctx->state[5] = 0x9b05688c; ctx->state[6] = 0x1f83d9ab; ctx->state[7] = 0x5be0cd19; }
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдХреА рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдордирдорд╛рдиреЗ рдЖрдХрд╛рд░ рдХреЗ рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ sha256_update () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмреНрд▓реЙрдХ рдбреЗрдЯрд╛ рдФрд░ рдмреНрд▓реЙрдХ рд▓рдВрдмрд╛рдИ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╕рдорд╛рд░реЛрд╣ рд░рд╛рдЬреНрдп рд╕рд░рдгреА рдореЗрдВ SHA256_CTX рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╣реИрд╢ рдЬрдорд╛ рдХрд░рддрд╛ рд╣реИ:
void sha256_update(SHA256_CTX *ctx, const BYTE data[], size_t len) { uint32_t i; for (i = 0; i < len; ++i) { ctx->data[ctx->datalen] = data[i]; ctx->datalen++; if (ctx->datalen == 64) { sha256_transform(ctx, ctx->data); ctx->bitlen += 512; ctx->datalen = 0; } } }
рдЕрдкрдиреЗ рдЖрдк рд╕реЗ, sha256_update () рд╡рд░реНрдХрд╣реЛрд░реНрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ sha256_transform (), рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 64 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХреЗ рдмреНрд▓реЙрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b)))) #define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b)))) #define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z))) #define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) #define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22)) #define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25)) #define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3)) #define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10)) /**************************** VARIABLES *****************************/ static const uint32_t k[64] = { 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 }; /*********************** FUNCTION DEFINITIONS ***********************/ void sha256_transform(SHA256_CTX *ctx, const BYTE data[]) { uint32_t a, b, c, d, e, f, g, h, i, j, t1, t2, m[64]; for (i = 0, j = 0; i < 16; ++i, j += 4) m[i] = (data[j] << 24) | (data[j + 1] << 16) | (data[j + 2] << 8) | (data[j + 3]); for (; i < 64; ++i) m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16]; a = ctx->state[0]; b = ctx->state[1]; c = ctx->state[2]; d = ctx->state[3]; e = ctx->state[4]; f = ctx->state[5]; g = ctx->state[6]; h = ctx->state[7]; for (i = 0; i < 64; ++i) { t1 = h + EP1(e) + CH(e, f, g) + k[i] + m[i]; t2 = EP0(a) + MAJ(a, b, c); h = g; g = f; f = e; e = d + t1; d = c; c = b; b = a; a = t1 + t2; } ctx->state[0] += a; ctx->state[1] += b; ctx->state[2] += c; ctx->state[3] += d; ctx->state[4] += e; ctx->state[5] += f; ctx->state[6] += g; ctx->state[7] += h; }
рдЬрдм рдкреВрд░реА рд╣реИрд╢ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝ рд▓реА рдЧрдИ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА sha256_update () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рдЬреЛ рдХреБрдЫ рд╢реЗрд╖ рд╣реИ рд╡рд╣ рдЕрдВрддрд┐рдо sha256_final () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ 64 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдерд╛, рддреЛ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдЕрдВрддрд┐рдо рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреБрд▓ рдбреЗрдЯрд╛ рд▓рдВрдмрд╛рдИ рд▓рд┐рдЦреЗрдВред рдЕрдВрддрд┐рдо sha256_transform () рдХрд░реЗрдЧрд╛ред
рд╣реИрд╢ рдкрд░рд┐рдгрд╛рдо рд░рд╛рдЬреНрдп рд╕рд░рдгреА рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред
рдпрд╣ рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП "рдЙрдЪреНрдЪ рд╕реНрддрд░" рд╣реИред
рдмрд┐рдЯрдХреЙрдЗрди рдорд╛рдЗрдирд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдЫреЛрдЯреЗ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдпрд╣ рд╕рд░рд▓ рд╣реИ: рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдореЗрдВ рдХреЗрд╡рд▓ 80 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ, рдЬреЛ рдХрд┐ 64 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд╣рд▓реЗ sha256 рдХреЗ рд▓рд┐рдП рджреЛ sha256_transform () рдкрд╣рд▓реЗ рд╕реЗ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЦрдирд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдмреНрд▓реЙрдХ рдХрд╛ рдиреЙрди рд╣реЗрдбрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ sha256_transform () рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рддрдерд╛рдХрдерд┐рдд рдорд┐рдбрд╕реНрдЯреЗрдЯ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдорд╛рдЗрдирд░ рд╕рднреА рдЧреИрд░-рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдЬреЛ 4 рдмрд┐рд▓рд┐рдпрди, 2 ^ 32 рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рджреВрд╕рд░реЗ sha256_transform () рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдкрд╣рд▓реЗ sha256 рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЖрда 32-рдмрд┐рдЯ рд╢рдмреНрдж рд╣реИ, рдЬреЛ рдХрд┐ 32 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ sha256 рдвреВрдВрдврдирд╛ рдЖрд╕рд╛рди рд╣реИ - рдЕрдВрддрд┐рдо sha256_transform () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ sha256_transform () рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ 64 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ 32 рдмрд╛рдЗрдЯреНрд╕ рдЫреЛрдЯрд╛ рд╣реИред рддреЛ рдлрд┐рд░ рд╕реЗ рдмреНрд▓реЙрдХ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рдЧрджреНрджреЗрджрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХ рдХреА рд▓рдВрдмрд╛рдИ рджрд░реНрдЬ рдХреА рдЬрд╛рдПрдЧреАред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, sha256_transform () рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рддреАрди рдХреЙрд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдорд┐рдбрд╕реНрдЯреЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВрдиреЗ рдмрд┐рдЯрдХреЙрдЗрди рдмреНрд▓реЙрдХ рдХреЗ рд╣реЗрдбрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЛ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдХрд┐ рдкреВрд░реА рдЧрдгрдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрд┐рдЯрдХреЙрдЗрди рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИ рдФрд░ рдпрд╣реА рд╣реБрдЖ:
рдореИрдВрдиреЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ c ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛, рдпрд╣ рди рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рд╢рдмреНрджреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, uint32_t рдХрд╣ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ "T" рдХреЗ рд╢рдмреНрджреЛрдВ рдкрд░ рднреА рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рд╣реИ рдФрд░ рд░рд╛рдЬреНрдп sha256 рдХреЛ "T" рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ sha256_transform () рдкреНрд░рдХрд╛рд░ "T" рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдлрд╝рдВрдХреНрд╢рди рдЕрдм c ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд╣реИ:
template <typename T> T ror32(T word, unsigned int shift) { return (word >> shift) | (word << (32 - shift)); } template <typename T> T Ch(T x, T y, T z) { return z ^ (x & (y ^ z)); } template<typename T> T Maj(T x, T y, T z) { return (x & y) | (z & (x | y)); } #define e0(x) (ror32(x, 2) ^ ror32(x,13) ^ ror32(x,22)) #define e1(x) (ror32(x, 6) ^ ror32(x,11) ^ ror32(x,25)) #define s0(x) (ror32(x, 7) ^ ror32(x,18) ^ (x >> 3)) #define s1(x) (ror32(x,17) ^ ror32(x,19) ^ (x >> 10)) unsigned int ntohl(unsigned int in) { return ((in & 0xff) << 24) | ((in & 0xff00) << 8) | ((in & 0xff0000) >> 8) | ((in & 0xff000000) >> 24); } template <typename T> void LOAD_OP(int I, T *W, const u8 *input) { //W[I] = /*ntohl*/ (((u32*)(input))[I]); W[I] = ntohl(((u32*)(input))[I]); //W[I] = (input[3] << 24) | (input[2] << 16) | (input[1] << 8) | (input[0]); } template <typename T> void BLEND_OP(int I, T *W) { W[I] = s1(W[I - 2]) + W[I - 7] + s0(W[I - 15]) + W[I - 16]; } template <typename T> void sha256_transform(T *state, const T *input) { T a, b, c, d, e, f, g, h, t1, t2; TW[64]; int i; /* load the input */ for (i = 0; i < 16; i++) // MJ input is cast to u32* so this processes 16 DWORDS = 64 bytes W[i] = input[i]; /* now blend */ for (i = 16; i < 64; i++) BLEND_OP(i, W); /* load the state into our registers */ a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; f = state[5]; g = state[6]; h = state[7]; // t1 = h + e1(e) + Ch(e, f, g) + 0x428a2f98 + W[0]; t2 = e0(a) + Maj(a, b, c); d += t1; h = t1 + t2; t1 = g + e1(d) + Ch(d, e, f) + 0x71374491 + W[1]; t2 = e0(h) + Maj(h, a, b); c += t1; g = t1 + t2; t1 = f + e1(c) + Ch(c, d, e) + 0xb5c0fbcf + W[2]; t2 = e0(g) + Maj(g, h, a); b += t1; f = t1 + t2; t1 = e + e1(b) + Ch(b, c, d) + 0xe9b5dba5 + W[3]; t2 = e0(f) + Maj(f, g, h); a += t1; e = t1 + t2; t1 = d + e1(a) + Ch(a, b, c) + 0x3956c25b + W[4]; t2 = e0(e) + Maj(e, f, g); h += t1; d = t1 + t2; t1 = c + e1(h) + Ch(h, a, b) + 0x59f111f1 + W[5]; t2 = e0(d) + Maj(d, e, f); g += t1; c = t1 + t2; t1 = b + e1(g) + Ch(g, h, a) + 0x923f82a4 + W[6]; t2 = e0(c) + Maj(c, d, e); f += t1; b = t1 + t2; t1 = a + e1(f) + Ch(f, g, h) + 0xab1c5ed5 + W[7]; t2 = e0(b) + Maj(b, c, d); e += t1; a = t1 + t2; t1 = h + e1(e) + Ch(e, f, g) + 0xd807aa98 + W[8]; t2 = e0(a) + Maj(a, b, c); d += t1; h = t1 + t2; t1 = g + e1(d) + Ch(d, e, f) + 0x12835b01 + W[9]; t2 = e0(h) + Maj(h, a, b); c += t1; g = t1 + t2; t1 = f + e1(c) + Ch(c, d, e) + 0x243185be + W[10]; t2 = e0(g) + Maj(g, h, a); b += t1; f = t1 + t2; t1 = e + e1(b) + Ch(b, c, d) + 0x550c7dc3 + W[11]; t2 = e0(f) + Maj(f, g, h); a += t1; e = t1 + t2; t1 = d + e1(a) + Ch(a, b, c) + 0x72be5d74 + W[12]; t2 = e0(e) + Maj(e, f, g); h += t1; d = t1 + t2; t1 = c + e1(h) + Ch(h, a, b) + 0x80deb1fe + W[13]; t2 = e0(d) + Maj(d, e, f); g += t1; c = t1 + t2; t1 = b + e1(g) + Ch(g, h, a) + 0x9bdc06a7 + W[14]; t2 = e0(c) + Maj(c, d, e); f += t1; b = t1 + t2; t1 = a + e1(f) + Ch(f, g, h) + 0xc19bf174 + W[15]; t2 = e0(b) + Maj(b, c, d); e += t1; a = t1 + t2; t1 = h + e1(e) + Ch(e, f, g) + 0xe49b69c1 + W[16]; t2 = e0(a) + Maj(a, b, c); d += t1; h = t1 + t2; t1 = g + e1(d) + Ch(d, e, f) + 0xefbe4786 + W[17]; t2 = e0(h) + Maj(h, a, b); c += t1; g = t1 + t2; t1 = f + e1(c) + Ch(c, d, e) + 0x0fc19dc6 + W[18]; t2 = e0(g) + Maj(g, h, a); b += t1; f = t1 + t2; t1 = e + e1(b) + Ch(b, c, d) + 0x240ca1cc + W[19]; t2 = e0(f) + Maj(f, g, h); a += t1; e = t1 + t2; t1 = d + e1(a) + Ch(a, b, c) + 0x2de92c6f + W[20]; t2 = e0(e) + Maj(e, f, g); h += t1; d = t1 + t2; t1 = c + e1(h) + Ch(h, a, b) + 0x4a7484aa + W[21]; t2 = e0(d) + Maj(d, e, f); g += t1; c = t1 + t2; t1 = b + e1(g) + Ch(g, h, a) + 0x5cb0a9dc + W[22]; t2 = e0(c) + Maj(c, d, e); f += t1; b = t1 + t2; t1 = a + e1(f) + Ch(f, g, h) + 0x76f988da + W[23]; t2 = e0(b) + Maj(b, c, d); e += t1; a = t1 + t2; t1 = h + e1(e) + Ch(e, f, g) + 0x983e5152 + W[24]; t2 = e0(a) + Maj(a, b, c); d += t1; h = t1 + t2; t1 = g + e1(d) + Ch(d, e, f) + 0xa831c66d + W[25]; t2 = e0(h) + Maj(h, a, b); c += t1; g = t1 + t2; t1 = f + e1(c) + Ch(c, d, e) + 0xb00327c8 + W[26]; t2 = e0(g) + Maj(g, h, a); b += t1; f = t1 + t2; t1 = e + e1(b) + Ch(b, c, d) + 0xbf597fc7 + W[27]; t2 = e0(f) + Maj(f, g, h); a += t1; e = t1 + t2; t1 = d + e1(a) + Ch(a, b, c) + 0xc6e00bf3 + W[28]; t2 = e0(e) + Maj(e, f, g); h += t1; d = t1 + t2; t1 = c + e1(h) + Ch(h, a, b) + 0xd5a79147 + W[29]; t2 = e0(d) + Maj(d, e, f); g += t1; c = t1 + t2; t1 = b + e1(g) + Ch(g, h, a) + 0x06ca6351 + W[30]; t2 = e0(c) + Maj(c, d, e); f += t1; b = t1 + t2; t1 = a + e1(f) + Ch(f, g, h) + 0x14292967 + W[31]; t2 = e0(b) + Maj(b, c, d); e += t1; a = t1 + t2; t1 = h + e1(e) + Ch(e, f, g) + 0x27b70a85 + W[32]; t2 = e0(a) + Maj(a, b, c); d += t1; h = t1 + t2; t1 = g + e1(d) + Ch(d, e, f) + 0x2e1b2138 + W[33]; t2 = e0(h) + Maj(h, a, b); c += t1; g = t1 + t2; t1 = f + e1(c) + Ch(c, d, e) + 0x4d2c6dfc + W[34]; t2 = e0(g) + Maj(g, h, a); b += t1; f = t1 + t2; t1 = e + e1(b) + Ch(b, c, d) + 0x53380d13 + W[35]; t2 = e0(f) + Maj(f, g, h); a += t1; e = t1 + t2; t1 = d + e1(a) + Ch(a, b, c) + 0x650a7354 + W[36]; t2 = e0(e) + Maj(e, f, g); h += t1; d = t1 + t2; t1 = c + e1(h) + Ch(h, a, b) + 0x766a0abb + W[37]; t2 = e0(d) + Maj(d, e, f); g += t1; c = t1 + t2; t1 = b + e1(g) + Ch(g, h, a) + 0x81c2c92e + W[38]; t2 = e0(c) + Maj(c, d, e); f += t1; b = t1 + t2; t1 = a + e1(f) + Ch(f, g, h) + 0x92722c85 + W[39]; t2 = e0(b) + Maj(b, c, d); e += t1; a = t1 + t2; t1 = h + e1(e) + Ch(e, f, g) + 0xa2bfe8a1 + W[40]; t2 = e0(a) + Maj(a, b, c); d += t1; h = t1 + t2; t1 = g + e1(d) + Ch(d, e, f) + 0xa81a664b + W[41]; t2 = e0(h) + Maj(h, a, b); c += t1; g = t1 + t2; t1 = f + e1(c) + Ch(c, d, e) + 0xc24b8b70 + W[42]; t2 = e0(g) + Maj(g, h, a); b += t1; f = t1 + t2; t1 = e + e1(b) + Ch(b, c, d) + 0xc76c51a3 + W[43]; t2 = e0(f) + Maj(f, g, h); a += t1; e = t1 + t2; t1 = d + e1(a) + Ch(a, b, c) + 0xd192e819 + W[44]; t2 = e0(e) + Maj(e, f, g); h += t1; d = t1 + t2; t1 = c + e1(h) + Ch(h, a, b) + 0xd6990624 + W[45]; t2 = e0(d) + Maj(d, e, f); g += t1; c = t1 + t2; t1 = b + e1(g) + Ch(g, h, a) + 0xf40e3585 + W[46]; t2 = e0(c) + Maj(c, d, e); f += t1; b = t1 + t2; t1 = a + e1(f) + Ch(f, g, h) + 0x106aa070 + W[47]; t2 = e0(b) + Maj(b, c, d); e += t1; a = t1 + t2; t1 = h + e1(e) + Ch(e, f, g) + 0x19a4c116 + W[48]; t2 = e0(a) + Maj(a, b, c); d += t1; h = t1 + t2; t1 = g + e1(d) + Ch(d, e, f) + 0x1e376c08 + W[49]; t2 = e0(h) + Maj(h, a, b); c += t1; g = t1 + t2; t1 = f + e1(c) + Ch(c, d, e) + 0x2748774c + W[50]; t2 = e0(g) + Maj(g, h, a); b += t1; f = t1 + t2; t1 = e + e1(b) + Ch(b, c, d) + 0x34b0bcb5 + W[51]; t2 = e0(f) + Maj(f, g, h); a += t1; e = t1 + t2; t1 = d + e1(a) + Ch(a, b, c) + 0x391c0cb3 + W[52]; t2 = e0(e) + Maj(e, f, g); h += t1; d = t1 + t2; t1 = c + e1(h) + Ch(h, a, b) + 0x4ed8aa4a + W[53]; t2 = e0(d) + Maj(d, e, f); g += t1; c = t1 + t2; t1 = b + e1(g) + Ch(g, h, a) + 0x5b9cca4f + W[54]; t2 = e0(c) + Maj(c, d, e); f += t1; b = t1 + t2; t1 = a + e1(f) + Ch(f, g, h) + 0x682e6ff3 + W[55]; t2 = e0(b) + Maj(b, c, d); e += t1; a = t1 + t2; t1 = h + e1(e) + Ch(e, f, g) + 0x748f82ee + W[56]; t2 = e0(a) + Maj(a, b, c); d += t1; h = t1 + t2; t1 = g + e1(d) + Ch(d, e, f) + 0x78a5636f + W[57]; t2 = e0(h) + Maj(h, a, b); c += t1; g = t1 + t2; t1 = f + e1(c) + Ch(c, d, e) + 0x84c87814 + W[58]; t2 = e0(g) + Maj(g, h, a); b += t1; f = t1 + t2; t1 = e + e1(b) + Ch(b, c, d) + 0x8cc70208 + W[59]; t2 = e0(f) + Maj(f, g, h); a += t1; e = t1 + t2; t1 = d + e1(a) + Ch(a, b, c) + 0x90befffa + W[60]; t2 = e0(e) + Maj(e, f, g); h += t1; d = t1 + t2; t1 = c + e1(h) + Ch(h, a, b) + 0xa4506ceb + W[61]; t2 = e0(d) + Maj(d, e, f); g += t1; c = t1 + t2; t1 = b + e1(g) + Ch(g, h, a) + 0xbef9a3f7 + W[62]; t2 = e0(c) + Maj(c, d, e); f += t1; b = t1 + t2; t1 = a + e1(f) + Ch(f, g, h) + 0xc67178f2 + W[63]; t2 = e0(b) + Maj(b, c, d); e += t1; a = t1 + t2; state[0] += a; state[1] += b; state[2] += c; state[3] += d; state[4] += e; state[5] += f; state[6] += g; state[7] += h; }
C ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХрд┐ рдореИрдВ рдирд┐рдпрдорд┐рдд рдбреЗрдЯрд╛ рд╕реЗ рдЬрд┐рди рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:
const uint8_t header[] = { 0x02,0x00,0x00,0x00, 0x17,0x97,0x5b,0x97,0xc1,0x8e,0xd1,0xf7, 0xe2,0x55,0xad,0xf2,0x97,0x59,0x9b,0x55, 0x33,0x0e,0xda,0xb8,0x78,0x03,0xc8,0x17, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8a,0x97,0x29,0x5a,0x27,0x47,0xb4,0xf1, 0xa0,0xb3,0x94,0x8d,0xf3,0x99,0x03,0x44, 0xc0,0xe1,0x9f,0xa6,0xb2,0xb9,0x2b,0x3a, 0x19,0xc8,0xe6,0xba, 0xdc,0x14,0x17,0x87, 0x35,0x8b,0x05,0x53, 0x53,0x5f,0x01,0x19, 0x48,0x75,0x08,0x33 }; uint32_t test_nonce = 0x48750833; uint32_t result[8]; full_btc_hash(header, test_nonce, result); uint8_t* presult = (uint8_t * )result; for (int i = 0; i < 32; i++) printf("%02X ", presult[i]);
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ:
92 98 2A 50 91 FA BD 42 97 8A A5 2D CD C9 36 28 02 4A DD FE E0 67 A4 78 00 00 00 00 00 00 00 00 00
рд╣реИрд╢ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрдИ рд╢реВрдиреНрдп, рдПрдХ рд╕реБрдВрджрд░ рд╣реИрд╢, рдмрд┐рдВрдЧреЛ, рдЖрджрд┐ рд╣реЛрддреЗ рд╣реИрдВред
рдФрд░ рдЕрдм рдЖрдЧреЗ, рдореИрдВ рдЗрд╕ рд╣реИрд╢рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд╛рдзрд╛рд░рдг uint32_t рдбреЗрдЯрд╛ рдирд╣реАрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд╡рд┐рд╢реЗрд╖ C ++ рд╡рд░реНрдЧ, рдЬреЛ рд╕рднреА рдЕрдВрдХрдЧрдгрд┐рдд рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ред
рд╣рд╛рдБ, рд╣рд╛рдБред рдореИрдВ "рд╡реИрдХрд▓реНрдкрд┐рдХ" рд╕рдВрднрд╛рд╡реНрдп рдЧрдгрд┐рдд рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред
рдореИрдВрдиреЗ рдЦреБрдж рдЗрд╕рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛, рдЗрд╕рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд┐рдпрд╛, рдЦреБрдж рдЗрд╕рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЪреБрдЯрдХреБрд▓рд╛ред рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдореИрдВ рдРрд╕рд╛ рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдБ рдЬрд┐рд╕реЗ рдореИрдВ рдХреНрд░реИрдВрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред
рдЕрдм рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВред
рдбрд┐рдЬрд┐рдЯрд▓ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХреНрд╕ рдореЗрдВ рд╕рднреА рдЕрдВрдХрдЧрдгрд┐рдд рдмрд┐рдЯреНрд╕ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдЦреНрддреА рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░, рдпрд╛, рдирд╣реАрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╛ред рд╡реИрд╕реЗ, рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдмреБрд▓рд┐рдпрди рдмреАрдЬрдЧрдгрд┐рдд рдореЗрдВ рдХреМрди рд╕реА рд╕рддреНрдп рд╕рд╛рд░рдгреА рд╣реИрдВред
рдореИрдВ рдЧрдгрдирд╛ рдореЗрдВ рдереЛрдбрд╝реА рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рд╕реЗ рд╡реЗ рд╕рдВрднрд╛рд╡реНрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рд╢рдмреНрдж рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ рдХреЛ рди рдХреЗрд╡рд▓ рд╕рдВрднрд╡ рд╢реВрдиреНрдп рдФрд░ рдПрдХ рдорд╛рди рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рднреА рд╣реИрдВ! рдореИрдВ рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреЗ рд╣реЛрдиреЗ рдпрд╛ рди рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрд┐рдЯ рдХреЗ рдореВрд▓реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИред рдФрд░ рдЕрдЧрд░ рдХреБрдЫ рдбреЗрдЯрд╛ рдореЗрдВ рдереЛрдбрд╝реА рдХрдореА рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдорд╛рди рд▓реЗрдВ рдХрд┐ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рдШрдЯрдирд╛рдПрдБ рд╣реИрдВ "рдП" рдФрд░ "рдмреА", рдЬрд┐рдирдХреЗ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рд╕реЗ рдПрдХ рддрдХ рдХреНрд░рдорд╢рдГ рдкрд╛ рдФрд░ рдкреАрдмреА рд╣реИред рдПрдХ рд╕рд╛рде рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреНрдпрд╛ рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдо рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ P = Pa * Pb рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рд╕рд╣реА рдЙрддреНрддрд░ рд╣реИ!
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ 3 рдбреА рдЧреНрд░рд╛рдл рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ (рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд┐рдВрджреБрдУрдВ рд╕реЗ):

рдФрд░ рдХреНрдпрд╛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╛ рддреЛ Pa рдШрдЯрдирд╛ рдпрд╛ Pb рдШрдЯрдирд╛ рд╣реЛрдЧреА?
рд╕рдВрднрд╛рд╡реНрдпрддрд╛ P = рдкрд╛ + Pb-Pa * Pbред рдлрд╝рдВрдХреНрд╢рди рдЧреНрд░рд╛рдлрд╝ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ рдШрдЯрдирд╛ рдХреЗ рдШрдЯрд┐рдд рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдШрдЯрдирд╛ рдШрдЯрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреА?
рдкреА = 1 - рдкрд╛ред
рдЕрдм рдПрдХ рдзрд╛рд░рдгрд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрд╛рд░реНрдХрд┐рдХ рддрддреНрд╡ рд╣реИрдВ рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдИрд╡реЗрдВрдЯ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрдирдкреБрдЯ рдЗрд╡реЗрдВрдЯ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЬрд╛рдирддреЗ рд╣реБрдП:

рдРрд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рддрддреНрд╡ рд╣реЛрдиреЗ рд╕реЗ рд╡реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдирдиреНрдп рдпрд╛, XOR:

рдЕрдм рдЗрд╕ XOR рддрд░реНрдХ рддрддреНрд╡ рдХреЗ рдЖрд░реЗрдЦ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрднрд╛рд╡реНрдп XOR рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдШрдЯрдирд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреНрдпрд╛ рд╣реЛрдЧреА:

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред рд╣рдо рдПрдХ рдкреВрд░реНрдг рдпреЛрдЬрдХ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реНрдХ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкреВрд░реНрдг рдпреЛрдЬрдХ рд╕реЗ рдПрдХ рдмрд╣реБ-рдмрд┐рдЯ рдпреЛрдЬрдХ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рддреЛ рдЕрдм, рдЙрдирдХреА рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдм рд╣рдо рдЗрдирдкреБрдЯ рдкрд░ рд╕рдВрдХреЗрддреЛрдВ рдХреА рдЬреНрдЮрд╛рдд рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдЗрд╕рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╕рдВрдХреЗрддреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВ c ++ рдореЗрдВ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ "32-рдмрд┐рдЯ" рд╡рд░реНрдЧ (рдореИрдВ рдЗрд╕реЗ x32 рдХрд╣реВрдВрдЧрд╛) рдХреЛ рд╕рдВрднрд╛рд╡реНрдп рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕рднреА sha256 рд╕рдВрдЪрд╛рд▓рди рдЬреИрд╕реЗ AND, OR, XOR, ADD рдФрд░ рдкрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдХрдХреНрд╖рд╛ рдореЗрдВ 32 рдмрд┐рдЯреНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ рд╣реИред рдРрд╕реЗ 32-рдмрд┐рдЯ рдирдВрдмрд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд░реНрдХрд┐рдХ рдпрд╛ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди, рддрд╛рд░реНрдХрд┐рдХ рдпрд╛ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХреЗ рдЬреНрдЮрд╛рдд рдпрд╛ рдЕрд▓реНрдк-рдЬреНрдЮрд╛рдд рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ рдХреЗ рдореВрд▓реНрдп рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред
рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдореЗрд░реЗ рд╕рдВрднрд╛рд╡реНрдп рдЧрдгрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
typedef std::numeric_limits< double > dbl; int main(int argc, char *argv[]) { cout.precision(dbl::max_digits10); x32 a = 0xaabbccdd; x32 b = 0x12345678; <b>
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рджреЛ 32-рдмрд┐рдЯ рдирдВрдмрд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред
рдЬрдмрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ b.setBit (4, 0.75) рд╣реИ; рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдЯреАрдХ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рднреА рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдЬреНрдЮрд╛рдд рд╣реИрдВред рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ:
result = 0xbcf02355 bit0 = 1 bit1 = 0 bit2 = 1 bit3 = 0 bit4 = 1 bit5 = 0 bit6 = 1 bit7 = 0 bit8 = 1 bit9 = 1 bit10 = 0 bit11 = 0 bit12 = 0 bit13 = 1 bit14 = 0 bit15 = 0 bit16 = 0 bit17 = 0 bit18 = 0 bit19 = 0 bit20 = 1 bit21 = 1 bit22 = 1 bit23 = 1 bit24 = 0 bit25 = 0 bit26 = 1 bit27 = 1 bit28 = 1 bit29 = 1 bit30 = 0 bit31 = 1
рдЕрдЧрд░ рдореИрдВ рд▓рд╛рдЗрди b.setBit (4, 0.75) рдХреЛ рдЕрдирдлреЙрд▓реЛ рдХрд░ рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдореИрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдХрд╣реВрдВрдЧрд╛: "рдЗрди рджреЛ рдирдВрдмрд░реЛрдВ рдХреЛ рдореЗрд░реЗ рд╕рд╛рде рдЬреЛрдбрд╝реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рдмрд┐рдЯ 4 рдХреЗ рдореВрд▓реНрдп рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ 0.75 рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реИ"ред
рдлрд┐рд░ рдЬреЛрдбрд╝ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдЙрдЯрдкреБрдЯ рд╕рдВрдХреЗрддреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреА рдкреВрд░реА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде, рдЕрд░реНрдерд╛рдд, рдмрд┐рдЯреНрд╕:
bit not stable bit not stable bit not stable result = 0xbcf02305 bit0 = 1 bit1 = 0 bit2 = 1 bit3 = 0 bit4 = 0.75 bit5 = 0.1875 bit6 = 0.8125 bit7 = 0 bit8 = 1 bit9 = 1 bit10 = 0 bit11 = 0 bit12 = 0 bit13 = 1 bit14 = 0 bit15 = 0 bit16 = 0 bit17 = 0 bit18 = 0 bit19 = 0 bit20 = 1 bit21 = 1 bit22 = 1 bit23 = 1 bit24 = 0 bit25 = 0 bit26 = 1 bit27 = 1 bit28 = 1 bit29 = 1 bit30 = 0 bit31 = 1
рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рдереЗ, рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреЛ рдирд╣реАрдВ рдЧрд┐рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЙрд╕реЗ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рдлрдЬреА рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдЕрджреНрднреБрдд 32-рдмрд┐рдЯ c ++ рд╡рд░реНрдЧ рд╣реИ, рддреЛ рдореИрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ x_ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреВрд░реНрдг (btc_hash) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдорд╛рдирд┐рдд .h рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
X32 рд╡рд░реНрдЧ рдХреЗ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ: #pragma once #include <string> #include <list> #include <iostream> #include <utility> #include <stdint.h> #include <vector> #include <limits> using namespace std; #include <boost/math/constants/constants.hpp> #include <boost/multiprecision/cpp_dec_float.hpp> using boost::multiprecision::cpp_dec_float_50; //typedef double MY_FP; typedef cpp_dec_float_50 MY_FP; class x32 { public: x32(); x32(uint32_t n); void init(MY_FP val); void init(double* pval); void setBit(int i, MY_FP val) { bvi[i] = val; }; ~x32() {}; x32 operator|(const x32& right); x32 operator&(const x32& right); x32 operator^(const x32& right); x32 operator+(const x32& right); x32& x32::operator+=(const x32& right); x32 operator~(); x32 operator<<(const unsigned int& right); x32 operator>>(const unsigned int& right); void print(); uint32_t get32(); MY_FP get_bvi(uint32_t idx) { return bvi[idx]; }; private: MY_FP not(MY_FP a); MY_FP and(MY_FP a, MY_FP b); MY_FP or (MY_FP a, MY_FP b); MY_FP xor(MY_FP a, MY_FP b); MY_FP bvi[32]; //bit values }; #include "stdafx.h" #include "x32.h" x32::x32() { for (int i = 0; i < 32; i++) { bvi[i] = 0.0; } } x32::x32(uint32_t n) { for (int i = 0; i < 32; i++) { bvi[i] = (n&(1 << i)) ? 1.0 : 0.0; } } void x32::init(MY_FP val) { for (int i = 0; i < 32; i++) { bvi[i] = val; } } void x32::init(double* pval) { for (int i = 0; i < 32; i++) { bvi[i] = pval[i]; } } x32 x32::operator<<(const unsigned int& right) { x32 t; for (int i = 31; i >= 0; i--) { if (i < right) { t.bvi[i] = 0.0; } else { t.bvi[i] = bvi[i - right]; } } return t; } x32 x32::operator>>(const unsigned int& right) { x32 t; for (unsigned int i = 0; i < 32; i++) { if (i >= (32 - right)) { t.bvi[i] = 0; } else { t.bvi[i] = bvi[i + right]; } } return t; } MY_FP x32::not(MY_FP a) { return 1.0 - a; } MY_FP x32::and(MY_FP a, MY_FP b) { return a * b; } MY_FP x32::or(MY_FP a, MY_FP b) { return a + b - a * b; } MY_FP x32::xor (MY_FP a, MY_FP b) { //(~(A & B)) & (A | B) return and( not( and(a,b) ) , or(a,b) ); } x32 x32::operator|(const x32& right) { x32 t; for (int i = 0; i < 32; i++) { t.bvi[i] = or ( bvi[i], right.bvi[i] ); } return t; } x32 x32::operator&(const x32& right) { x32 t; for (int i = 0; i < 32; i++) { t.bvi[i] = and (bvi[i], right.bvi[i]); } return t; } x32 x32::operator~() { x32 t; for (int i = 0; i < 32; i++) { t.bvi[i] = not(bvi[i]); } return t; } x32 x32::operator^(const x32& right) { x32 t; for (int i = 0; i < 32; i++) { t.bvi[i] = xor (bvi[i], right.bvi[i]); } return t; } x32 x32::operator+(const x32& right) { x32 r; r.bvi[0] = xor (bvi[0], right.bvi[0]); MY_FP cout = and (bvi[0], right.bvi[0]); for (unsigned int i = 1; i < 32; i++) { MY_FP xor_a_b = xor (bvi[i], right.bvi[i]); r.bvi[i] = xor( xor_a_b, cout ); MY_FP and1 = and (bvi[i], right.bvi[i]); MY_FP and2 = and (xor_a_b, cout); cout = or (and1,and2); } return r; } x32& x32::operator+=(const x32& right) { MY_FP cout = and (bvi[0], right.bvi[0]); bvi[0] = xor (bvi[0], right.bvi[0]); for (unsigned int i = 1; i < 32; i++) { MY_FP xor_a_b = xor (bvi[i], right.bvi[i]); MY_FP and1 = and (bvi[i], right.bvi[i]); MY_FP and2 = and (xor_a_b, cout); bvi[i] = xor (xor_a_b, cout); cout = or (and1, and2); } return *this; } void x32::print() { for (int i = 0; i < 32; i++) { cout << bvi[i] << "\n"; } } uint32_t x32::get32() { uint32_t r = 0; for (int i = 0; i < 32; i++) { if (bvi[i] == 1.0) r = r | (1 << i); else if (bvi[i] == 0.0) { //ok } else { //oops.. cout << "bit not stable\n"; } } return r; }
рдпрд╣ рд╕рдм рдХрд┐рд╕ рд▓рд┐рдП рд╣реИ?
рдмрд┐рдЯрдХреЙрдЗрди рдорд╛рдЗрдирд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ 32x рдиреЙрдирд╕ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдореВрд▓реНрдп рд╣реИред рдЬрдм рддрдХ рд╣реИрд╢ рдХреА рд╕рдВрдЦреНрдпрд╛ "рд╕реБрдВрджрд░" рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА, рддрдм рддрдХ рд╕рднреА рдХреЛ 4 рдмрд┐рд▓рд┐рдпрди рд╕реЗ рдЕрдзрд┐рдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╣реИрд╢ рдХреЛ рдЧрд┐рдирдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╣реИрд╢ рдХрд╛ рдореВрд▓реНрдп рд▓рдХреНрд╖реНрдп рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред
рдлрдЬреА рдкреНрд░реЛрдмреЗрдмрд┐рд▓рд┐рд╕реНрдЯрд┐рдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╣рд╛рдВ, рдореИрдВ рд╢реБрд░реВ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдиреЙрди рдмрд┐рдЯреНрд╕ рдХрд╛ рдЕрд░реНрде рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рддреЛ рдХреЛрдИ рдмрдХрд╡рд╛рд╕ рди рдХрд░реЗрдВ - рдЧреИрд░-рдмрд┐рдЯреНрд╕ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ 0.5 рд╣реИред рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рднреА, рдореИрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реИрд╢ рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╡реЗ 0.5 рдкреНрд▓рд╕ рдпрд╛ рдорд╛рдЗрдирд╕ рдЖрдзрд╛ рдкреИрд╕рд╛ рднреА рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред
, 0.5 0.9 0.1 1.0 , . . .
, , , 0.5 , , nonce[0] = 0.9:
typedef std::numeric_limits< double > dbl; int main(int argc, char *argv[]) { cout.precision(dbl::max_digits10);
x32::get_bvi() .
, nonce[0] 0.5 0.9, , :
0.44525679540883948 0.44525679540840074 0.55268174813167364 0.5526817481315932 0.57758654725359399 0.57758654725360606 0.49595026978928474 0.49595026978930477 0.57118578561406703 0.57118578561407746 0.53237003739057907 0.5323700373905661 0.57269859374138096 0.57269859374138162 0.57631236396381141 0.5763123639638157 0.47943176373960149 0.47943176373960219 0.54955992675177704 0.5495599267517755 0.53321116270879686 0.53321116270879733 0.57294025883744952 0.57294025883744984 0.53131857821387693 0.53131857821387655 0.57253530821899101 0.57253530821899102 0.50661432403287194 0.50661432403287198 0.57149419848354913 0.57149419848354916 0.53220327148366491 0.53220327148366487 0.57268927270412251 0.57268927270412251 0.57632130426913003 0.57632130426913005 0.57233970084776142 0.57233970084776143 0.56824728628552812 0.56824728628552813 0.45247155441889921 0.45247155441889922 0.56875940568326509 0.56875940568326509 0.57524323439326321 0.57524323439326321 0.57587726902392535 0.57587726902392535 0.57597043124557292 0.57597043124557292 0.52847748894672118 0.52847748894672118 0.54512141953055808 0.54512141953055808 0.57362254577539695 0.57362254577539695 0.53082194129771177 0.53082194129771177 0.54404489702929382 0.54404489702929382 0.54065386336136847 0.54065386336136847
, 10 . тАж - . , ?
, , , :
double nonce_bits[32]; for (int i = 0; i < 32; i++) nonce_bits[i] = (real_nonce32&(1 << i)) ? 1.0 : 0.0; x32 nonce_x32; nonce_x32.init(nonce_bits); full_btc_hash(strxx, nonce_x32, result_x32);
рддрдм рд╕рдВрднрд╛рд╡реНрдп рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдкрд░ рд╣рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ - рдЖрдЙрдЯрдкреБрдЯ, рдмрд┐рдВрдЧреЛ рдкрд░ рдПрдХ "рд╕реБрдВрджрд░" рд╣реИрд╢редрдЗрд╕рд▓рд┐рдП рдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдпрд╣реАрдВ рд╣реИредрдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рд╡рд╛ рдХреА рд╕рд╛рдВрд╕ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП ... рдФрд░ рд╣реИрд╢ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИредрдпрд╣ рдмрдХрд╡рд╛рд╕ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрдХрд╡рд╛рд╕ рд╣реИ - рдФрд░ рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рдЪреЗрддрд╛рд╡рдиреА рджреА рдереАредрдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА:- рдХрд╛рдЧрдЬ рдФрд░ рдХрд▓рдо рдХреЗ рд╕рд╛рде рдорд┐рдирд┐рдо рдмрд┐рдЯрдХреЙрдЗрдиред
- рдХреНрдпрд╛ рдмрд┐рдЯрдХреЙрдЗрди рдХреА рддреЗрдЬрд╝, рдЖрд╕рд╛рди рдпрд╛ рдЖрд╕рд╛рди рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?
- рдореИрдВ рдХреИрд╕реЗ blakecoin рдЦрд╛рди рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛
- рдордВрдЧрд▓ рд░реЛрд╡рд░ рдмреЛрд░реНрдб 3 рдкрд░ FPGA рдмрд┐рдЯрдХреЙрдЗрди рдорд╛рдЗрдирд░
- рдмреНрд▓реЗрдХ рдПрд▓рдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде FPGA рдЦрд╛рди