Реализация алгоритма шифрования HMAC в приложении iPhone - PullRequest
11 голосов
/ 03 мая 2011

Я хочу реализовать алгоритм шифрования HMAC для моего приложения iPhone. Любой пример кода действительно поможет. Также, пожалуйста, проведите меня с кратким описанием того же.

Ответы [ 2 ]

21 голосов
/ 03 мая 2011

Используйте функции Common Crypto. Документация находится на страницах руководства, так что вам придется немного поискать ее. Они находятся в libSystem на iOS и Mac OS X, поэтому нет необходимости добавлять другую библиотеку или фреймворк в ваш проект. Как видно из приведенного ниже примера, API очень похож на OpenSSL.

Если вы действительно заинтересованы в шифровании, в отличие от аутентификации данных, Common Crypto имеет функции для выполнения AES и 3DES (и DES, но не используйте его, он слишком слаб для современных нужд). Для получения подробной информации обратитесь к справочной странице CCCryptor .

Пример ниже эквивалентен выполнению openssl dgst -md5 -hmac secret < myfile.txt. Начните с инициализации CCHmacContext, а затем вызовите CCHmacUpdate, если у вас есть данные для аутентификации. Когда вы прочитаете все байты, вызовите CCHmacFinal, чтобы получить HMAC в буфер. Я предоставил грубый метод преобразования байтов HMAC в печатаемый гекс.

#include <CommonCrypto/CommonHMAC.h>

#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

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 );
}
4 голосов
/ 03 мая 2011

HMAC - это не механизм шифрования, а дайджест аутентификации. Он использует базовую функцию дайджеста сообщений, такую ​​как SHA-1, SHA-256, MD5 и т. Д., С секретным ключом для генерации кода, который можно использовать для аутентификации данных.

Создание дайджеста HMAC чрезвычайно просто. Вот описание из RFC2104 (через Википедию)

Пусть:

  • H (·) - криптографическая хеш-функция (т. Е. SHA-1, SHA-256, MD5 и т. Д.)
  • K - секретный ключ, дополняемый вправо дополнительными нулями до размера входного блока хэш-функции, или хэш оригинального ключа, если он длиннее этого размера блока
  • может быть сообщением для аутентификации
  • | обозначает конкатенацию
  • ⊕ обозначает эксклюзив или (XOR)
  • opad be external padding (0x5c5c5c… 5c5c, шестнадцатеричная константа длиной в один блок)
  • ipad - внутреннее заполнение (0x363636… 3636, шестнадцатеричная константа длиной в один блок)

Тогда HMAC (K, m) математически определяется как:

HMAC (K, m) = H ((K ⊕ opad) | H ((K ⊕ ipad) | m)).

Для базовой функции дайджеста вы можете обратиться к одной из реализаций C из OpenSSL. На самом деле он также имеет реализацию C HMAC, которую вы, вероятно, можете просто использовать как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...