zoukankan      html  css  js  c++  java
  • iOS -- DES算法

    算法步骤:

    DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位(实际用到了56位,第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1),其算法主要分为两步:
    1)初始置换
    其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50……D8;R0=D57D49……D7。
    其置换规则见下表:
    58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,
    62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,
    57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,
    61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,
    2)逆置换
    经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。
    此算法是对称加密算法体系中的代表,在计算机网络系统中广泛使用.
     
    OC 代码:
    #import "NSString+MFDES.h"
    #import <CommonCrypto/CommonCrypto.h>
    // key 必须8位
    #define key @"01234567"
    // 向量
    static Byte iv[] = {1, 2, 3, 4, 5, 6, 7, 8};
    
    @implementation NSString (MFDES)
    
    // 1. 字符串对称加密(DES)
    - (NSString *)stringWithDES{
        // 1. 将字符串本身转化为C字符串
        const char *string = [self UTF8String];
        // 2. 接收容器
        unsigned char byte[1024];
        // 3. 容器大小
        size_t dataOutMoved = 0;
        // 4. DES加密过程
        // 1. 参数1. 加密 或者 解密
        // 2. 参数2: 加密 / 解密 方式
        // 3. 参数3: 分组密码的选项
        // 4. 参数4: 秘钥
        // 5. 参数5: 秘钥的大小
        // 6. 参数6: 向量
        // 7. 参数7: c的字符串
        // 8. 参数8: 字符串的长度
        // 9. 参数9: 接收容器
        // 10. 参数10: 容器的大小
        // 11. 参数11: 容器最终的个数
        CCCryptorStatus cryptorStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, string, strlen(string), byte, 1024, &dataOutMoved);
        
        if (cryptorStatus == kCCSuccess) {
            // 转成字符串 ==== base64返回
            NSLog(@"加密成功");
            NSData *desData = [NSData dataWithBytes:byte length:dataOutMoved];
            NSString *desBaseString = [desData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
            return desBaseString;
            
        } else {
            
            NSLog(@"加密失败");
            
        }
        
        return @"";
        
    }
    
    // 2. 字符串对称解密(DES)
    - (NSString *)desWithString{
        
        NSData *base64Data = [[NSData alloc] initWithBase64EncodedString:self options:NSDataBase64DecodingIgnoreUnknownCharacters];
        
        const void *byte = base64Data.bytes;
        unsigned char buffer[1024];
        size_t dataOutMoved = 0;
        
        // C 语言方法
        CCCryptorStatus cryptorStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, byte, base64Data.length, buffer, 1024, &dataOutMoved);
        
        if (cryptorStatus == kCCSuccess) {
            
            NSLog(@"解密成功");
            NSData *desData = [NSData dataWithBytes:buffer length:dataOutMoved];
            NSString *desBaseString = [[NSString alloc] initWithData:desData encoding:NSUTF8StringEncoding];
            return desBaseString;
            
        } else {
            
            NSLog(@"解密失败");
            
        }
        
        return @"";
        
    }
    
  • 相关阅读:
    [BZOJ2179]FFT快速傅立叶
    [UOJ#34]多项式乘法
    [BZOJ4636]蒟蒻的数列
    [BZOJ4632]树的编码
    [BZOJ1070][SCOI2007]修车
    [BZOJ1529][POI2005]ska Piggy banks
    [BZOJ2654]tree
    腾讯应用管理中心,腾讯开放平台应用认领
    Sony/索尼 NW-ZX300A ZX300 无损音乐播放器4.4口
    read progress
  • 原文地址:https://www.cnblogs.com/mafeng/p/5777842.html
Copyright © 2011-2022 走看看