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需要一个散列函数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中哈希函数的使用方法,对于算法的具体实现没有深究。。