IOS中DES与MD5加密方案

转载 2016年08月29日 09:48:43
项目中用的的加密算法,因为要和安卓版的适配,中间遇到许多麻烦。 

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

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

DES:一种使用密钥加密的块算法,所以,使用它加密时,需要一个密钥,加上一些设置和你需要加密的文段。 

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

1、客户端向服务端请求密钥,请求的参数是双方约定好的一个MD5加密的字符串。我们可以通过下面的进行第一步加密: 

- (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位: 

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

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

2、服务端将得到的MD5串和以约定好的MD5串进行对比,如果一致,可以放行,返回密钥。 

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

这一步至关重要,我们先看DES的加密代码 

+(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位的时候,这两种填充算法加密出来的结果试一模一样的。 

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

iOS AES256/RSA/DES/MD5/sha-1 (加密/解密)

分享源码,让苦逼的开发生活见鬼去。      最近一直苦于开发,今天稍微有些时间,趁机先分享一下数据的加解密。后续补充用户数据的加密存储以及数据存储管理。      1.AES加密     AES加...
  • llyouss
  • llyouss
  • 2016年10月17日 00:49
  • 2309

iOS一行代码进行RSA、DES 、AES、MD5加密、解密

本文为投稿文章,作者:Flying_Einstein(简书) 加密的Demo,欢迎下载 JAVA端的加密解密,读者可以看我同事的这篇文章:http://www.jianshu.com/p/98569e...

iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

加密的Demo 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,服务器也会返回数据,服务器是用Java开发的,客户端要同时支持多平台(Android、iOS),在处理iOS的...

iOS加密方式:RSA DES MD5

最近用到了信息安全加密,主要用到了RSA DES MD5 MD5:加密后不可逆(只能加密不可解密),我们用于加密用户的登录密码 DES:对称加密(服务器和客户端公用同一个秘钥),缺点:一旦被抓包破解...

iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

加密的Demo,欢迎下载 JAVA端的加密解密,读者可以看我同事的这篇文章:http://www.jianshu.com/p/98569e81cc0b 最近做了一个移动项目,是有服务器和客...

iOS - 加密 Base64 MD5 DES AES RSA

一、Base64原理: ● base64的编码都是按字符串长度,以每3个8bit的字符为一组, ● 然后针对每组,首先获取每个字符的ASCII编码, ● 然后将ASCII编码转换成8...

IOS- 加密解密(MD5/AES/DES等)

关于iOS加密解密,系统有提供一套C接口的API,在CommonCrypto中。具体从哪个版本开始有的我不清楚,但是iOS5.0中已经有了。 本文简单的归纳了一下iOS使用的各种加密解密算法(因为比...

iOS 加密总结(Base64 、DES、MD5)持续更新

开篇应该先说明一下这是我写的第一篇技术博客,水平高低的大家多提宝贵意见。 最近做的一个和蓝牙交互的iOS APP中用到了各种各样的加密和验证,包括:Base64 加解密、MD5 加密、DES 加解密、...

IOS 加密解密(AES、DES、base64、md5)

md5加密: + (NSString *)md5HexDigest:(NSString*)input { const char* str = [input UTF8String]; ...

iOS,一行代码进行RSA、DES 、AES加密、解密及MD5加密

更新:MD5加密是单向的,只能加密不能解密(破解除外)。标题可能会引起读者误解,已经改正,感谢Li_Cheng同学的提醒,另外笔者发现Li_Cheng同学有篇MD5加密更为详尽的文章,推荐阅读:iOS...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS中DES与MD5加密方案
举报原因:
原因补充:

(最多只允许输入30个字)