美文网首页iOS大咖说工具iOS进阶指南
iOS开发中如何使用DES加密

iOS开发中如何使用DES加密

作者: 晨曦之光nl | 来源:发表于2016-05-09 15:56 被阅读3384次

    1.首先引入头文件

    #import <CommonCrypto/CommonCryptor.h>
    

    2.cocoaPods加入第三方框架GTMBase64,并引入头文件

    #import "GTMBase64.h"
    

    3.DES分为加密和解密

    //密钥
    #define gkey            @"mobilewinx@easipass@1234"
    //偏移量
    #define gIv             @"01234567"
    

    加密方法

    #pragma mark - 加密方法
    + (NSString*)encrypt:(NSString*)plainText {
        NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
        size_t plainTextBufferSize = [data length];
        const void *vplainText = (const void *)[data bytes];
        
        CCCryptorStatus ccStatus;
        uint8_t *bufferPtr = NULL;
        size_t bufferPtrSize = 0;
        size_t movedBytes = 0;
        
        bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
        bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
        memset((void *)bufferPtr, 0x0, bufferPtrSize);
        
        const void *vkey = (const void *) [gkey UTF8String];
        const void *vinitVec = (const void *) [gIv UTF8String];
        
        ccStatus = CCCrypt(kCCEncrypt,
                           kCCAlgorithm3DES,
                           kCCOptionPKCS7Padding,
                           vkey,
                           kCCKeySize3DES,
                           vinitVec,
                           vplainText,
                           plainTextBufferSize,
                           (void *)bufferPtr,
                           bufferPtrSize,
                           &movedBytes);
        
        NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
        NSString *result = [GTMBase64 stringByEncodingData:myData];
        return result;
    }
    

    解密方法

    // 解密方法
    + (NSString*)decrypt:(NSString*)encryptText {
        NSData *encryptData = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
        size_t plainTextBufferSize = [encryptData length];
        const void *vplainText = [encryptData bytes];
        
        CCCryptorStatus ccStatus;
        uint8_t *bufferPtr = NULL;
        size_t bufferPtrSize = 0;
        size_t movedBytes = 0;
        
        bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
        bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
        memset((void *)bufferPtr, 0x0, bufferPtrSize);
        
        const void *vkey = (const void *) [gkey UTF8String];
        const void *vinitVec = (const void *) [gIv UTF8String];
        
        ccStatus = CCCrypt(kCCDecrypt,
                           kCCAlgorithm3DES,
                           kCCOptionPKCS7Padding,
                           vkey,
                           kCCKeySize3DES,
                           vinitVec,
                           vplainText,
                           plainTextBufferSize,
                           (void *)bufferPtr,
                           bufferPtrSize,
                           &movedBytes);
        
        NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
                                                                         length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];
        return result;
    }
    

    相关文章

      网友评论

      • 新地球说着一口陌生腔调:偏移量可以去掉吗
      • 库斯科:这个是3DES加密解密吧?
      • 库斯科:偏移量怎么设置呢?
      • 未来的自己在哪里:解密出来是空的,是怎么回事
        d0ab8ef28fa2:@未来的自己在哪里

        能不能说清楚一点哟。
        我这也是解密出来有时候是空的。
        未来的自己在哪里:@晨曦之光n设置了,已经搞定了。/* 资料参考:http://www.2cto.com/kf/201304/205511.html
        * java服务端使用PKCS5Padding算法,密钥只能是8个字节。
        * 在ios中,支持的DES加密算法是kCCOptionPKCS7Padding |kCCOptionECBMode。在使用PKCS7Padding,它的密钥可以是8个字节,也可以不是。如果密钥不是8个字节的话,那么JAVA端的PKCS5Padding算法就不能解密了,只要遵守密钥为8个字节的约定两边就一致了,java: private static byte[] iv = {1, 2, 3, 4, 5, 6, 7, 8};
        */
        晨曦之光nl:@未来的自己在哪里 密钥和偏移量设置了吗

      本文标题:iOS开发中如何使用DES加密

      本文链接:https://www.haomeiwen.com/subject/hnjerttx.html