Implementing HMAC encryption algorithm in iPhone application

前端 未结 2 791
醉话见心
醉话见心 2021-01-31 06:23

I want to implement HMAC encryption algorithm for my iPhone application. Any sample code will really help. Also, please guide me with brief implementation of the same.

2条回答
  •  别那么骄傲
    2021-01-31 07:08

    Use the Common Crypto functions. The documentation is in man pages, so you'll need to hunt for it a bit. They're in libSystem on iOS and Mac OS X, so no need to add another library or framework to your project. As you can see from the example below, the API is very similar to OpenSSL's.

    If you are actually interested in encrypting, as opposed to authenticating data, Common Crypto has functions to perform AES and 3DES (and DES, but don't use it, it's far too weak for modern needs). Take a look at the CCCryptor man page for details.

    The example below is equivalent to running openssl dgst -md5 -hmac secret < myfile.txt. Start by initializing the the CCHmacContext, and then call CCHmacUpdate as long as you have data to authenticate. When you've read all the bytes, call CCHmacFinal to get the HMAC into a buffer. I've provided a crude method to convert the HMAC bytes into printable hex.

    #include 
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    extern int      errno;
    
        int
    main( int ac, char *av[] )
    {
        CCHmacContext    ctx;
        char             *key = "secret";
        char             buf[ 8192 ];
        unsigned char    mac[ CC_MD5_DIGEST_LENGTH ];
        char             hexmac[ 2 * CC_MD5_DIGEST_LENGTH + 1 ];
        char             *p;
        int              fd;
        int              rr, i;
    
        if ( ac != 2 ) {
            fprintf( stderr, "usage: %s path\n", av[ 0 ] );
            exit( 1 );
        }
    
        if (( fd = open( av[ 1 ], O_RDONLY )) < 0 ) {
            fprintf( stderr, "open %s: %s\n", av[ 1 ], strerror( errno ));
            exit( 2 );
        }
    
        CCHmacInit( &ctx, kCCHmacAlgMD5, key, strlen( key ));
    
        while (( rr = read( fd, buf, sizeof( buf ))) > 0 ) {
            CCHmacUpdate( &ctx, buf, rr );
        }
        if ( rr < 0 ) {
            perror( "read" );
            exit( 2 );
        }
        CCHmacFinal( &ctx, mac );
    
        (void)close( fd );
    
        p = hexmac;
        for ( i = 0; i < CC_MD5_DIGEST_LENGTH; i++ ) {
            snprintf( p, 3, "%02x", mac[ i ] );
            p += 2;
        }
    
        printf( "%s\n", hexmac );
    
        return( 0 );
    }
    

提交回复
热议问题