关于MD5和SHA-1的简单的介绍

MD5的介绍

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

MD5算法的特点

1.压缩性:任意长度的数据,算出的MD5值的长度都是固定的

2.容易计算:从原数据计算出MD5值很容易

3.抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大

4.强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5的作用:

MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。

MD5的算法原理:

MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值;

/*
MD5代码实现原理
@implementation NSString (Encryption)

  • (NSString *)md5String{
    //先转为UTF_8编码的字符串
    const char* str = [self UTF8String];
    //设置一个接受字符数组
    //md5加密后是128bit, 16 字节 * 8位/字节 = 128 位
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    /*

    extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)官方封装好的加密方法
    
    把str字符串转换成了32位的16进制数列(这个过程不可逆转) 存储到了result这个空间中
    */

    CC_MD5(str, strlen(str), result);

    NSMutableString ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH 2];
    /*

    x表示十六进制,%02X  意思是不足两位将用0补齐,如果多余两位则不影响
    NSLog("%02X", 0x888);  //888
    NSLog("%02X", 0x4); //04
    */

    //将16字节的16进制转成32字节的16进制字符串
    for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {

       [ret appendFormat:@"%02x",result[i]];

    }
    return ret;
    }

*/

SHA-1的介绍:

SHA是美国国家安全局设计的,由美国国家标准和技术研究院发布的一系列密码散列函数。

1.SHA1算法简介

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。

最初载明的算法于1993年发布,称做安全散列标准 (Secure Hash Standard),FIPS PUB 180。这个版本常被称为 "SHA-0"。它在发布之后很快就被NSA撤回,并且以 1995年发布的修订版本 FIPS PUB 180-1 (通常称为 "SHA-1") 取代。根据 NSA的说法,它修正了一个在原始算法中会降低密码安全性的错误。然而 NSA 并没有提供任何进一步的解释或证明该错误已被修正。1998年,在一次对 SHA-0 的攻击中发现这次攻击并不能适用于 SHA-1 — 我们不知道这是否就是NSA 所发现的错误,但这或许暗示我们这次修正已经提升了安全性。SHA-1已经被公众密码社群做了非常严密的检验而还没发现到有不安全的地方,它被认为是安全的。

SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。

SHA-0和SHA-1会从一个最大2^64 位元的讯息中产生一串160位元的摘要,然后以设计MD4及MD5讯息摘要算法的MIT教授Ronald L. Rivest类似的原理为基础来加密。

3 SHA1算法描述

在SHA1算法中,我们必须把原始消息(字符串,文件等)转换成位字符串。SHA1算法只接受位作为输入。假设我们对字符串“abc”产生消息摘要。首先,我们将它转换成位字符串如下:01100001 01100010 01100011 ‘a’=97 ‘b’=98 ‘c’=99 这个位字符串的长度为24

MD5和SHA—1的区别

3.1 MD5与SHA-1的比较

由于MD5与SHA-1均是从MD4发展而来,它们的结构和强度等特性有很多相似之处,表(1)是对MD5与SHA-1的结构比较。SHA-1与MD5的最大区别在于其摘要比MD5摘要长32 比特。对于强行攻击,产生任何一个报文使之摘要等于给定报文摘要的难度:MD5是2128数量级的操作,SHA-1是2160数量级的操作。产生具有相同摘要的两个报文的难度:MD5是264是数量级的操作,SHA-1 是280数量级的操作。因而,SHA-1对强行攻击的强度更大。但由于SHA-1的循环步骤比MD5多80:64且要处理的缓存大160比特:128比特,SHA-1的运行速度比MD5慢。

2SHA1和MD5的算法说明

SHA1和MD5的算法都是从MD4算法改进而来的2种算法,基本思路都是将信息分成N个分组,每组64个字节,每个分组都进行摘要运算。当一个分组的摘要运算完毕后,将上一个分组的结果也用于下一个分组的运算。

信息的长度(注意是bit位长度,不是字节长度)用64位表示,也要参加信息摘要运算,而且是放在最后一个分组的末尾,所以长度信息要占据8个字节。

如果信息数据最后一个分组长度小于64个字节,在后面添加0x80标志结束,如果此时数据+结束标志已经<=56个字节,还可以放入长度数据,就在结束标志到第56个字节补0,然后放入长度,如果此时信息数据+结束标志已经大于56字节,那么这个分组后面补0,进行一次摘要运算,然后再建立一个分组,前面全部补0,最后16个字节放长度,再进行一次摘要。

需要注意的地方如下。

MD5最后生成的摘要信息是16个字节,SHA1是20个字节。

MD5和SHA1的分组信息运算,分组里面的的数据都会被视为16个DWORD,而MD5算法认为这些DWORD的字节序列是LITTLE-ENDIAN,而SHA1的算法认为DWORD是BIG-ENDIAN的。所以在不同字节序的主机上要进行转换。放入最后一个分组的长度信息,是原始数据长度,而且是BIT位长度,其是一个uint64_t,而MD5算法要求放入的长度是LITTLE-ENDIAN的,而SHA1算法则要求这个长度是BIG-ENDIAN的。不同的平台要进行转换。

/*
SHA1加密方式代码实现原理

  • (NSString*) sha1  
    {  
    const charchar *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];  
    NSData *data = [NSData dataWithBytes:cstr length:self.length]; 

    uint8_t digest[CC_SHA1_DIGEST_LENGTH]; 

    CC_SHA1(data.bytes, data.length, digest); 

    NSMutableString output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH 2]; 

    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)

       [output appendFormat:@"%02x", digest[i]];  
    

    return output;  
    }

*/

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/woxinfeixiangliudan/article/details/50371932
文章标签: md5 算法
个人分类: 加密算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭