美文网首页
iOS AES/Des解密 偏移量取加密数据的前16位(Byte

iOS AES/Des解密 偏移量取加密数据的前16位(Byte

作者: Jody526 | 来源:发表于2020-05-15 11:03 被阅读0次

    最近在弄AES解密,解密方法是 iv取加密文件内容的前16位,然后解密之后把内容里面的填充字符b"\0"去掉

    1.首先是把data转成Byte数组 然后取前16位
    Byte *testByte = (Byte *)[data bytes];
    Byte *bytes =malloc(sizeof(*bytes)*data.length);
    for(int i=0;i<16;i++){
        bytes[i] = testByte[i];
    }
    
    2.跟后端同步好补位方法 我这里是不补位填0 其他补位方法自行查找
    3.去掉数据里面补位的0,我这里是把data转换成字符串 ,我这边是不足16位,会补够0到16位
    final
    
    +(NSString *)AES128Decrypt:(NSData *)data key:(NSString *)key{
        char keyPtr[kCCKeySizeAES128 + 1];
        memset(keyPtr, 0, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
        NSUInteger dataLength = [data length];
        size_t bufferSize = dataLength + kCCBlockSizeAES128;
        void *buffer = malloc(bufferSize);
        
        //16字节的偏移量
        Byte *testByte = (Byte *)[data bytes];
        Byte *bytes =malloc(sizeof(*bytes)*data.length);
        for(int i=0;i<16;i++){
            bytes[i] = testByte[i];
        }
        size_t numBytesCrypted = 0;
        CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                              kCCAlgorithmAES128,
                                              0,//不补位
                                              keyPtr,
                                              kCCBlockSizeAES128,
                                              bytes,
                                              [data bytes],
                                              dataLength,
                                              buffer,
                                              bufferSize, &numBytesCrypted);
        if (cryptStatus == kCCSuccess) {
            //原始数据
            NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
            //原始数据去掉前面16位的偏移量
            NSData *subData = [resultData subdataWithRange:NSMakeRange(16, resultData.length-16)];
            //方法:https://www.jianshu.com/p/fb9d3a69d3d3
            NSString *plaintext = @"";
            char termChar[1] = {'\0'};
            NSMutableData *data = [NSMutableData dataWithBytes:subData.bytes length:subData.length];
            [data appendBytes:termChar length:1];
            plaintext = [[NSString alloc] initWithCString:data.bytes encoding:NSUTF8StringEncoding];
            return plaintext;
        }
        free(buffer);
        return nil;
    }
    
    
    AES解密使用方法
        NSData *testData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"1.txt" ofType:@""]];
        NSString *laststr = [QLAESDecrypt AES128Decrypt:testData key:@"keykeykey"];
        NSLog(@"laststr::%@",laststr);
    
    下面是Des解密 单纯MARK下
    //Des解密
    +(NSData *)decryptUseDES:(NSString *)plainText key:(NSString *)key{
    
        NSData *plaindata = nil;
        NSData *cipherdata = [[NSData alloc] initWithBase64EncodedString:plainText options:NSDataBase64DecodingIgnoreUnknownCharacters];
        
        size_t bufferSize = cipherdata.length;
        void * buffer = malloc(bufferSize);
    
        NSData * date = [key dataUsingEncoding:NSUTF8StringEncoding];
        size_t numBytesDecrypted = 0;
        CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                              kCCAlgorithmDES,/* 算法 */
                                              kCCOptionPKCS7Padding,
                                              [key UTF8String],
                                              kCCKeySizeDES,
                                              [date bytes],
                                              [cipherdata bytes],
                                              [cipherdata length],
                                              buffer,
                                              bufferSize,
                                              &numBytesDecrypted);
        if(cryptStatus == kCCSuccess)
        {
            plaindata = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
            return plaindata;
            
        }
        
         return plaindata;
    }
    
    

    相关文章

      网友评论

          本文标题:iOS AES/Des解密 偏移量取加密数据的前16位(Byte

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