开源polarssl加密库使用详解之三:哈希函数

1.散列算法(即哈希算法)

       散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为“雪崩效应”。散列还应该是防冲突的,即找不出具有相同散列结果的两条不同信息。具有这些特性的散列结果就可以用于验证信息是否被修改。单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:

            1) MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法。

            2) SHA-1(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160 位的哈希数值。

            3)SHA-2:最新的哈希算法,比SHA-1 更复杂,安全性更高,并提供更多的加密输出(SHA-256、SHA-384、SHA-512 等)。

       在最新的美国联邦信息处理公开标准文件(FIPS 180-2)[1] 中,一共定义了下列四种安全的哈希算法:SHA-1,SHA-256,SHA-384,SHA-512。每种算法都是某种单向哈希函数的迭代过程,通过这些哈希函数可以处理任意长度的消息输入,产生经过压缩的“消息摘要”(Message Digest)。这些算法充分保证了原数据的完整性;对原数据的任何改动,都将导致生成不同的消息摘要。正是哈希算法的这一特性,使得其在生成和验证数字签名、消息认证码,以及随机数产生等领域得到广泛应用。


2.HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)

    HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。计算HMAC需要一个散列函数hash(可以是md5或者sha-1)和一个密钥key。用L表示hash函数输出字符串长(md5是16),用B表示数据块的长度(md5和sha-1的分割数据块长都是64)。密钥key的长度可以小于等于数据块长B,如果大于数据块长度,可以使用hash函数对key进行转换,结果就是一个L长的key。
  然后创建两个B长的不同字符串:
  innerpad = 长度为B的 0×36
  outterpad = 长度为B的 0×5C
  计算输入字符串str的HMAC:
  hash(key ^ outterpad, hash(key ^ innerpad, str))

3.polarssl中哈希函数的接口使用方法

1)sha1
/*
 * output = SHA-1( input buffer )
 */
void sha1( const unsigned char *input, size_t ilen, unsigned char output[20] )//input是你输入的数据,ilen输入数据的长度,output计算的20个字节的哈希值
{
    sha1_context ctx;

    sha1_starts( &ctx );
    sha1_update( &ctx, input, ilen );
    sha1_finish( &ctx, output );

    memset( &ctx, 0, sizeof( sha1_context ) );
}

2)sha2
void sha256( const unsigned char *input, size_t ilen,
             unsigned char output[32], int is224 ) //input是输入的数据,输出256位的数据;如果is224是0,计算sha256 否是是sha224
{
    sha256_context ctx;

    sha256_starts( &ctx, is224 );
    sha256_update( &ctx, input, ilen );
    sha256_finish( &ctx, output );

    memset( &ctx, 0, sizeof( sha256_context ) );
}

3)Md2
void md2( const unsigned char *input, size_t ilen, unsigned char output[16] )
{
    md2_context ctx;


    md2_starts( &ctx );
    md2_update( &ctx, input, ilen );
    md2_finish( &ctx, output );


    memset( &ctx, 0, sizeof( md2_context ) );
}

4)MD4
void md4( const unsigned char *input, size_t ilen, unsigned char output[16] )
{
    md4_context ctx;

    md4_starts( &ctx );
    md4_update( &ctx, input, ilen );
    md4_finish( &ctx, output );

    memset( &ctx, 0, sizeof( md4_context ) );
}

5)MD5
/*
 * output = MD5( input buffer )
 */
void md5( const unsigned char *input, size_t ilen, unsigned char output[16] )
{
    md5_context ctx;

    md5_starts( &ctx );
    md5_update( &ctx, input, ilen );
    md5_finish( &ctx, output );

    memset( &ctx, 0, sizeof( md5_context ) );
}

6)polarssl中的md_context_t结构题,定义了通用的消息摘要容器。次容器包含哈希函数的所有接口函数,具体在:md_wrap.c中定义。我们可以方便的调用哈希函数以及其HMAC接口。
const md_info_t md2_info = {
    POLARSSL_MD_MD2,
    "MD2",
    16,
    md2_starts_wrap,
    md2_update_wrap,
    md2_finish_wrap,
    md2,
    md2_file_wrap,
    md2_hmac_starts_wrap,
    md2_hmac_update_wrap,
    md2_hmac_finish_wrap,
    md2_hmac_reset_wrap,
    md2_hmac,
    md2_ctx_alloc,
    md2_ctx_free,
    md2_process_wrap,
};

const md_info_t md4_info = {
    POLARSSL_MD_MD4,
    "MD4",
    16,
    md4_starts_wrap,
    md4_update_wrap,
    md4_finish_wrap,
    md4,
    md4_file_wrap,
    md4_hmac_starts_wrap,
    md4_hmac_update_wrap,
    md4_hmac_finish_wrap,
    md4_hmac_reset_wrap,
    md4_hmac,
    md4_ctx_alloc,
    md4_ctx_free,
    md4_process_wrap,
};

const md_info_t sha224_info = {
    POLARSSL_MD_SHA224,
    "SHA224",
    28,
    sha224_starts_wrap,
    sha224_update_wrap,
    sha224_finish_wrap,
    sha224_wrap,
    sha224_file_wrap,
    sha224_hmac_starts_wrap,
    sha224_hmac_update_wrap,
    sha224_hmac_finish_wrap,
    sha224_hmac_reset_wrap,
    sha224_hmac_wrap,
    sha224_ctx_alloc,
    sha224_ctx_free,
    sha224_process_wrap,
};
。。。。。。。。。。

通过函数下面的函数调用消息摘要容器
const md_info_t *md_info_from_type( md_type_t md_type )
{
    switch( md_type )
    {
#if defined(POLARSSL_MD2_C)
        case POLARSSL_MD_MD2:
            return &md2_info;
#endif
#if defined(POLARSSL_MD4_C)
        case POLARSSL_MD_MD4:
            return &md4_info;
#endif
#if defined(POLARSSL_MD5_C)
        case POLARSSL_MD_MD5:
            return &md5_info;
#endif
#if defined(POLARSSL_SHA1_C)
        case POLARSSL_MD_SHA1:
            return &sha1_info;
#endif
#if defined(POLARSSL_SHA256_C)
        case POLARSSL_MD_SHA224:
            return &sha224_info;
        case POLARSSL_MD_SHA256:
            return &sha256_info;
#endif
#if defined(POLARSSL_SHA512_C)
        case POLARSSL_MD_SHA384:
            return &sha384_info;
        case POLARSSL_MD_SHA512:
            return &sha512_info;
#endif
        default:
            return NULL;
    }
}

总之上面只是介绍了polarssl中哈希函数的使用方法,对于算法的具体实现没有深究。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值