• IOS开发-OC学习-MD5加密


    MD5的全称是Message-Digest Algorithm 5。

    MD5加密算法为现在应用最广泛的哈希算法之一,该算法广泛应用于互联网网站的用户文件加密,能够将用户密码加密为128位的长整数。数据库并不明文存储用户密码,而是在用户登录时将输入密码字符串进行MD5加密,与数据库中所存储的MD5值匹配,从而降低密码数据库被盗取后用户损失的风险。

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

    在MD5加密算法中,首先需要对信息进行填充,使其字节长度对512求余数的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。

    填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后再在这个结果后面附加一个以64位二进制表示的填充前的信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍数。这样做的原因是为满足后面处理中对信息长度的要求。

    MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:

    A=0x01234567

    B=0x89abcdef

    C=0xfedcba98

    D=0x76543210

    当设置好这四个链接变量后,就开始进入算法的四轮循环运算,循环的次数是信息中512位信息分组的数目。

    将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。 主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量(文本中的一个子分组和一个常数)。

    再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。 以一下是每次操作中用到的四个非线性函数(每轮一个)。

    F(X,Y,Z)=(X∧Y)∨(( X)∧Z)
    G(X,Y,Z)=(X∧Z)∨(Y∧( Z))
    H(X,Y,Z)=X?Y?Z
    I(X,Y,Z)=Y?(X∨( Z))

    其中,?是异或,∧是与,∨是或, 是反符号。

    如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。所有这些完成之后,将A,B,C,D分别加上a,b,c,d。然后用下一分组数据继续运行算法,最后的输出是A,B,C和D的级联。最后得到的A,B,C,D就是输出结果,A是低位,D为高位,DCBA组成128位输出结果。

    在ios开发中,实现如下:

    NSString+MD5.h文件:

    1 #import <Foundation/Foundation.h>
    2 #import <CommonCrypto/CommonCrypto.h>
    3 @interface NSString (MD5)
    4 - (id)MD5;
    5 @end

    .h文件中声明了一个对象方法,即MD5方法。

    NSString+MD5.m文件如下:

     1 #import "NSString+MD5.h"
     2 @implementation NSString (MD5)
     3 - (id)MD5
     4 {
     5     const char *cStr = [self UTF8String];
     6     unsigned char digest[16];
     7     unsigned int x=(int)strlen(cStr) ;
     8     CC_MD5( cStr, x, digest );
     9     // This is the md5 call
    10     NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    11 
    12     for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
    13         [output appendFormat:@"%02x", digest[i]];
    14 
    15     return  output;
    16 }
    17 @end

    NSString+MD5.m文件中实现了MD5方法。

    调用的时候只需要:

    1       NSString *ss=@"abcdefgh";
    2       NSString *ssmd5=[ss2 MD5];  

    就可以生成字符串ss的密文字符串ssmd5.

  • 相关阅读:
    js之判断非空
    解决eclipse添加不了tomcat8的问题
    Java(eclipse)连接MySQL8.0以上版本数据库方式
    面试必备的:Redis和MongoDB的区别
    简述关系型数据库和非关系型数据库
    非关系型数据库MongoDB初探,以及和Redis的对比
    day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询
    day52:django:ORM单表/多表操作
    day51:django:dispatch&模板渲染&过滤器&标签&组件&静态文件配置
    day50:django:有名/无名分组&FBV/CBV
  • 原文地址:https://www.cnblogs.com/jiwangbujiu/p/5321263.html
Copyright © 2020-2023  润新知