iOS中DES与MD5加密方案

MD5算法和DES算法是常见的两种加密算法。算法

MD5:MD5是一种不可逆的加密算法,按个人理解,所谓不可逆,就是不能解密,那么它有什么用的,它的用处大了,大多数的登陆功能都会使用到这种算法。后面根据个人项目经验来介绍。服务器

DES:一种使用密钥加密的块算法,因此,使用它加密时,须要一个密钥,加上一些设置和你须要加密的文段。app

在IOS中,使用这两种加密算法很是简单,系统的<CommonCrypto/CommonCrypto.h>库给咱们提供的边界的接口。在不少移动项目中,安卓平台和IOS平台的后台服务是统一的,好比一个登陆功能是这样的流程:加密

一、客户端向服务端请求密钥,请求的参数是双方约定好的一个MD5加密的字符串。咱们能够经过下面的进行第一步加密:spa

- (NSString *)MD5Digest
{
    //要进行UTF8的转码
    const char* input = [self UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(input, (CC_LONG)strlen(input), result);
    
    NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [digest appendFormat:@"%02x", result[i]];
    }
    
    return digest;
}

经过这样的方法,咱们能够很容易的获得一串MD5加密字符串,可是必定要和后台约定好,MD5加密的位数是16位仍是32位,用上述方法加密出来的时32位,固然他们之间是有联系的,经过下面的方法能够将其转成16为:code

+(NSString *)trransFromMD532ToMD516:(NSString *)MD532{
    NSString  * string;
    for (int i=0; i<24; i++) {
        string=[MD532 substringWithRange:NSMakeRange(8, 16)];
    }
    return string;
}

还有一点须要注意,加密后的大小写也要对应。orm

二、服务端将获得的MD5串和以约定好的MD5串进行对比,若是一致,能够放行,返回密钥。接口

三、客户端取到密钥,将密钥再进行一次MD5加密,而后经过DES将要传送的数据加密发给服务器。ip

这一步相当重要,咱们先看DES的加密代码ci

+(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key andiv:(NSString *)iv
{
    //这个iv 是DES加密的初始化向量,能够用和密钥同样的MD5字符
    NSData * date = [iv dataUsingEncoding:NSUTF8StringEncoding];
    NSString *ciphertext = nil;
    NSUInteger dataLength = [clearText length];
    NSData *textData = [clearText dataUsingEncoding:NSUTF8StringEncoding];
    
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,//加密模式 kCCDecrypt 表明解密
                                          kCCAlgorithmDES,//加密方式
                                          kCCOptionPKCS7Padding,//填充算法
                                          [key UTF8String], //密钥字符串
                                          kCCKeySizeDES,//加密位数
                                          [date bytes],//初始化向量
                                          [textData bytes]  ,
                                           dataLength,
                                          buffer, 1024,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSLog(@"DES加密成功");
        NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
        Byte* bb = (Byte*)[data bytes];
        ciphertext = [Base64 parseByteArray2HexString:bb];
    }else{
        NSLog(@"DES加密失败");
    }
    return ciphertext;
}

几点注意:

(1)加密方式,IOS官方提供的是以下几种

enum {
    kCCAlgorithmAES128 = 0,
    kCCAlgorithmAES = 0,
    kCCAlgorithmDES,
    kCCAlgorithm3DES,       
    kCCAlgorithmCAST,       
    kCCAlgorithmRC4,
    kCCAlgorithmRC2,   
    kCCAlgorithmBlowfish    
};

(2)填充算法

enum {
    /* options for block ciphers */
    kCCOptionPKCS7Padding   = 0x0001,
    kCCOptionECBMode        = 0x0002
    /* stream ciphers currently have no options */
};

咱们能够发现,官方提供的只有这两种,然而JAVA使用的倒是

kCCOptionPKCS7Padding

可是不用担忧,在密钥是8位的时候,这两种填充算法加密出来的结果试如出一辙的。

四、服务器经过相同的方式,解密出密文,通配安卓端。

专一技术,热爱生活,交流技术,也作朋友。

——珲少 QQ群:203317592

相关文章
相关标签/搜索