SHA-256 - Verschlüsselung - Aber wie?



  • Hi ihr,

    Ich wollte eine Zeichenkette verschlüsseln und hab mir einfach mal einen Algorhythmus besorgt (Source am Ende des Beitrags).
    Sah alles ganz logisch aus und gleich mal ans Werk gemacht, aber ich scheiter schon an der Initialisierungs-Funktion.

    // test.cpp
    
    #include "sha2.c"
    
    int main()
    {
       sha2_context *sha;
       sha2_starts(sha); // Schreibfehler auf einen Speicher
    }
    
    // Structur von sha2_context
    // ## sha2.h - Zeile 17
    
    typedef struct 
    {
        ulong total[2];
        ulong state[8];
        uchar buffer[64];
    } sha2_context;
    
    // Die Initialisierungsfunktion
    // ## sha2.c - Zeile 60
    
    void sha2_starts( sha2_context *ctx )
    {
        ctx->total[0] = 0;
        ctx->total[1] = 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;
    }
    

    Das Sollte doch eine ganz einfache Zuweisung sein und er scheitert daran.
    Ich benutze den Dev-C++ von Bloodshed, aber daran sollte es doch nicht scheitern?!

    Ich hoffe ihr könnt mir helfen...
    Vielleicht mangelt es an meinem Wissen.
    Bin auch für hilfreiche Links dankbar!

    MfG Knickedi

    #ifndef _SHA2_H
    #define _SHA2_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #ifndef _STD_TYPES
    #define _STD_TYPES
    
    #define uchar   unsigned char
    #define uint    unsigned int
    #define ulong   unsigned long int
    
    #endif
    
    typedef struct 
    {
        ulong total[2];
        ulong state[8];
        uchar buffer[64];
    } sha2_context;
    
    /*
     * Core SHA-256 functions
     */
    void sha2_starts( sha2_context *ctx );
    void sha2_update( sha2_context *ctx, uchar *input, uint length );
    void sha2_finish( sha2_context *ctx, uchar digest[32] );
    
    /*
     * Output SHA-256(file contents), returns 0 if successful.
     */
    int sha2_file( char *filename, uchar digest[32] );
    
    /*
     * Output SHA-256(buf)
     */
    void sha2_csum( uchar *buf, uint buflen, uchar digest[32] );
    
    /*
     * Output HMAC-SHA-256(buf,key)
     */
    void sha2_hmac( uchar *buf, uint buflen, uchar *key, uint keylen,
                      uchar digest[32] );
    
    /*
     * Checkup routine
     */
    int sha2_self_test( void );
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* sha2.h */
    
    /*
     *  FIPS-180-2 compliant SHA-256 implementation
     *
     *  Copyright (C) 2003-2006  Christophe Devine
     *
     *  This library is free software; you can redistribute it and/or
     *  modify it under the terms of the GNU Lesser General Public
     *  License, version 2.1 as published by the Free Software Foundation.
     *
     *  This library is distributed in the hope that it will be useful,
     *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     *  Lesser General Public License for more details.
     *
     *  You should have received a copy of the GNU Lesser General Public
     *  License along with this library; if not, write to the Free Software
     *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
     *  MA  02110-1301  USA
     */
    /*
     *  The SHA-256 standard was published by NIST in 2002.
     *
     *  http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
     */
    
    #ifndef _CRT_SECURE_NO_DEPRECATE
    #define _CRT_SECURE_NO_DEPRECATE 1
    #endif
    
    #include <string.h>
    #include <stdio.h>
    
    #include "sha2.h"
    
    /* 
     * 32-bit integer manipulation macros (big endian)
     */
    #ifndef GET_UINT32_BE
    #define GET_UINT32_BE(n,b,i)                    \
    {                                               \
        (n) = ( (ulong) (b)[(i)    ] << 24 )        \
            | ( (ulong) (b)[(i) + 1] << 16 )        \
            | ( (ulong) (b)[(i) + 2] <<  8 )        \
            | ( (ulong) (b)[(i) + 3]       );       \
    }
    #endif
    #ifndef PUT_UINT32_BE
    #define PUT_UINT32_BE(n,b,i)                    \
    {                                               \
        (b)[(i)    ] = (uchar) ( (n) >> 24 );       \
        (b)[(i) + 1] = (uchar) ( (n) >> 16 );       \
        (b)[(i) + 2] = (uchar) ( (n) >>  8 );       \
        (b)[(i) + 3] = (uchar) ( (n)       );       \
    }
    #endif
    
    /*
     * Core SHA-256 functions
     */
    void sha2_starts( sha2_context *ctx )
    {
        ctx->total[0] = 0;
        ctx->total[1] = 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;
    }
    
    void sha2_process( sha2_context *ctx, uchar data[64] )
    {
        ulong temp1, temp2, W[64];
        ulong A, B, C, D, E, F, G, H;
    
        GET_UINT32_BE( W[0],  data,  0 );
        GET_UINT32_BE( W[1],  data,  4 );
        GET_UINT32_BE( W[2],  data,  8 );
        GET_UINT32_BE( W[3],  data, 12 );
        GET_UINT32_BE( W[4],  data, 16 );
        GET_UINT32_BE( W[5],  data, 20 );
        GET_UINT32_BE( W[6],  data, 24 );
        GET_UINT32_BE( W[7],  data, 28 );
        GET_UINT32_BE( W[8],  data, 32 );
        GET_UINT32_BE( W[9],  data, 36 );
        GET_UINT32_BE( W[10], data, 40 );
        GET_UINT32_BE( W[11], data, 44 );
        GET_UINT32_BE( W[12], data, 48 );
        GET_UINT32_BE( W[13], data, 52 );
        GET_UINT32_BE( W[14], data, 56 );
        GET_UINT32_BE( W[15], data, 60 );
    
    #define  SHR(x,n) ((x & 0xFFFFFFFF) >> n)
    #define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
    
    #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^  SHR(x, 3))
    #define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^  SHR(x,10))
    
    #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
    #define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
    
    #define F0(x,y,z) ((x & y) | (z & (x | y)))
    #define F1(x,y,z) (z ^ (x & (y ^ z)))
    
    #define R(t)                                    \
    (                                               \
        W[t] = S1(W[t -  2]) + W[t -  7] +          \
               S0(W[t - 15]) + W[t - 16]            \
    )
    
    #define P(a,b,c,d,e,f,g,h,x,K)                  \
    {                                               \
        temp1 = h + S3(e) + F1(e,f,g) + K + x;      \
        temp2 = S2(a) + F0(a,b,c);                  \
        d += temp1; h = temp1 + temp2;              \
    }
    
        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];
    
        P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
        P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
        P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
        P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
        P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
        P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
        P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
        P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
        P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
        P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
        P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
        P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
        P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
        P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
        P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
        P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
        P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
        P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
        P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
        P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
        P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
        P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
        P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
        P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
        P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
        P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
        P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
        P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
        P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
        P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
        P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
        P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
        P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
        P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
        P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
        P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
        P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
        P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
        P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
        P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
        P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
        P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
        P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
        P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
        P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
        P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
        P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
        P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
        P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
        P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
        P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
        P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
        P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
        P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
        P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
        P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
        P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
        P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
        P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
        P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
        P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
        P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
        P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
        P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
    
        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;
    }
    
    void sha2_update( sha2_context *ctx, uchar *input, uint length )
    {
        ulong left, fill;
    
        if( ! length ) return;
    
        left = ctx->total[0] & 0x3F;
        fill = 64 - left;
    
        ctx->total[0] += length;
        ctx->total[0] &= 0xFFFFFFFF;
    
        if( ctx->total[0] < length )
            ctx->total[1]++;
    
        if( left && length >= fill )
        {
            memcpy( (void *) (ctx->buffer + left),
                    (void *) input, fill );
            sha2_process( ctx, ctx->buffer );
            length -= fill;
            input  += fill;
            left = 0;
        }
    
        while( length >= 64 )
        {
            sha2_process( ctx, input );
            length -= 64;
            input  += 64;
        }
    
        if( length )
        {
            memcpy( (void *) (ctx->buffer + left),
                    (void *) input, length );
        }
    }
    
    static uchar sha2_padding[64] =
    {
     0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };
    
    void sha2_finish( sha2_context *ctx, uchar digest[32] )
    {
        ulong last, padn;
        ulong high, low;
        uchar msglen[8];
    
        high = ( ctx->total[0] >> 29 )
             | ( ctx->total[1] <<  3 );
        low  = ( ctx->total[0] <<  3 );
    
        PUT_UINT32_BE( high, msglen, 0 );
        PUT_UINT32_BE( low,  msglen, 4 );
    
        last = ctx->total[0] & 0x3F;
        padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
    
        sha2_update( ctx, sha2_padding, padn );
        sha2_update( ctx, msglen, 8 );
    
        PUT_UINT32_BE( ctx->state[0], digest,  0 );
        PUT_UINT32_BE( ctx->state[1], digest,  4 );
        PUT_UINT32_BE( ctx->state[2], digest,  8 );
        PUT_UINT32_BE( ctx->state[3], digest, 12 );
        PUT_UINT32_BE( ctx->state[4], digest, 16 );
        PUT_UINT32_BE( ctx->state[5], digest, 20 );
        PUT_UINT32_BE( ctx->state[6], digest, 24 );
        PUT_UINT32_BE( ctx->state[7], digest, 28 );
    }
    
    /*
     * Output SHA-256(file contents), returns 0 if successful.
     */
    int sha2_file( char *filename, uchar digest[32] )
    {
        FILE *f;
        size_t n;
        sha2_context ctx;
        uchar buf[1024];
    
        if( ( f = fopen( filename, "rb" ) ) == NULL )
            return( 1 );
    
        sha2_starts( &ctx );
    
        while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
            sha2_update( &ctx, buf, (uint) n );
    
        sha2_finish( &ctx, digest );
    
        fclose( f );
        return( 0 );
    }
    
    /*
     * Output SHA-256(buf)
     */
    void sha2_csum( uchar *buf, uint buflen, uchar digest[32] )
    {
        sha2_context ctx;
    
        sha2_starts( &ctx );
        sha2_update( &ctx, buf, buflen );
        sha2_finish( &ctx, digest );
    }
    
    /*
     * Output HMAC-SHA-256(buf,key)
     */
    void sha2_hmac( uchar *buf, uint buflen, uchar *key, uint keylen,
                      uchar digest[32] )
    {
        uint i;
        sha2_context ctx;
        uchar k_ipad[64];
        uchar k_opad[64];
        uchar tmpbuf[32];
    
        memset( k_ipad, 0x36, 64 );
        memset( k_opad, 0x5C, 64 );
    
        for( i = 0; i < keylen; i++ )
        {
            if( i >= 64 ) break;
    
            k_ipad[i] ^= key[i];
            k_opad[i] ^= key[i];
        }
    
        sha2_starts( &ctx );
        sha2_update( &ctx, k_ipad, 64 );
        sha2_update( &ctx, buf, buflen );
        sha2_finish( &ctx, tmpbuf );
    
        sha2_starts( &ctx );
        sha2_update( &ctx, k_opad, 64 );
        sha2_update( &ctx, tmpbuf, 32 );
        sha2_finish( &ctx, digest );
    
        memset( k_ipad, 0, 64 );
        memset( k_opad, 0, 64 );
        memset( tmpbuf, 0, 32 );
        memset( &ctx, 0, sizeof( sha2_context ) );
    }
    
    #ifdef SELF_TEST
    /* 
     * FIPS-180-2 test vectors
     */
    static char *sha2_test_str[3] = 
    {
        "abc",
        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
        NULL
    };
    
    static uchar sha2_test_sum[3][32] =
    {
        { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
          0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
          0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
          0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
        { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
          0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
          0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
          0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
        { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
          0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
          0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
          0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
    };
    
    /*
     * Checkup routine
     */
    int sha2_self_test( void )
    {
        int i, j;
        uchar buf[1000];
        uchar sha2sum[32];
        sha2_context ctx;
    
        for( i = 0; i < 3; i++ )
        {
            printf( "  SHA-256 test #%d: ", i + 1 );
    
            sha2_starts( &ctx );
    
            if( i < 2 )
                sha2_update( &ctx, (uchar *) sha2_test_str[i],
                               strlen( sha2_test_str[i] ) );
            else
            {
                memset( buf, 'a', 1000 );
                for( j = 0; j < 1000; j++ )
                    sha2_update( &ctx, (uchar *) buf, 1000 );
            }
    
            sha2_finish( &ctx, sha2sum );
    
            if( memcmp( sha2sum, sha2_test_sum[i], 20 ) != 0 )
            {
                printf( "failed\n" );
                return( 1 );
            }
    
            printf( "passed\n" );
        }
    
        printf( "\n" );
        return( 0 );
    }
    #else
    int sha2_self_test( void )
    {
        printf( "SHA-2 self-test not available\n\n" );
        return( 1 );
    }
    #endif
    


  • Knickedi schrieb:

    ...

    // test.cpp
    
    #include "sha2.c"
    
    int main()
    {
       sha2_context *sha;
       sha2_starts(sha); // Schreibfehler auf einen Speicher
    }
    

    ...

    Wo allozierst Du Speicher, auf den sha zeigen soll ?

    Gruß,

    Simon2.



  • Es ist kein Speicher für den sha2_context reserviert. sha2_starts erwartet das aber.

    Entweder

    #include "sha2.h"
    
    int main()
    {
       sha2_context *sha = new sha2_context();
       sha2_starts(sha); // Schreibfehler auf einen Speicher
       // ...
       delete sha;
    }
    

    oder (oft besser)

    #include "sha2.h"
    
    int main()
    {
       sha2_context sha;
       sha2_starts( &sha); // Schreibfehler auf einen Speicher
    }
    


  • Na kein Wunder, dein sha-Pointer ist ja auch nicht initialisiert. Und sha2_starts() schreibt gleich ins Nirvana.



  • OMG... programmier seit über einem Jahr und dann sowas...
    🙄 passiert wohl nicht nochmal^^

    Ich könnt mich hauen!

    Danke euch



  • Oder nimm gleich die cryptlib, das ist ne schöne C++ lib (also nix mit structs und selber initialisieren/freigeben etc.), und kann noch viel viel mehr als bloss SHA.

    http://www.cryptopp.com/


Anmelden zum Antworten