我想在目标 c 中使用无填充的 CFB 加密创建 AES 128 [英] I Want to Create AES 128 using CFB Encryption with No Padding in objective c

查看:19
本文介绍了我想在目标 c 中使用无填充的 CFB 加密创建 AES 128的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用无填充的 CFB 加密创建 AES 128,即

I Want to Create AES 128 using CFB Encryption with No Padding i.e.

示例 1:秘密数据是HELLO WORLD"钥匙:10 A5 88 69 D7 4B E5 A3 74 CF 86 7C FB 47 38 59IV:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00明文(未加密):48 45 4C 4C 4F 20 57 4F 52 4C 44密文:25 60 52 25 0B 90 06 AF 1C E6 2B

Sample 1: secret data is "HELLO WORLD" key:10 A5 88 69 D7 4B E5 A3 74 CF 86 7C FB 47 38 59 IV:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Clear text (unencrypted):48 45 4C 4C 4F 20 57 4F 52 4C 44 encrypted text:25 60 52 25 0B 90 06 AF 1C E6 2B

但我得到加密的十六进制字符串 ==,即没有字符串.我的加密成功了,但没有加密数据 有什么建议吗?

But I am getting Encrypted Hex String == i.e. no string. My encryption get success but no encrypted data Any suggestion?

这里是代码:

NSData *commandData = [@"HELLO WORLD" dataUsingEncoding:NSASCIIStringEncoding];
calling Method [commandData AES128OperationWithCreate:kCCEncrypt key:@"10a58869d74be5a374cf867cfb473859" iv:@"00000000000000000000000000000000"]

@implementation NSData (AES)
- (NSData *)AES128OperationWithCreate:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv{
 char ivPtr[kCCBlockSizeAES128 + 1];
            bzero(ivPtr, sizeof(ivPtr));
            if (iv) {
                [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
            }

            char keyPtr[kCCKeySizeAES128 + 1];
            bzero(keyPtr, sizeof(keyPtr));
            [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];


            CCCryptorRef cryptor = NULL;
            CCCryptorStatus result = CCCryptorCreateWithMode(operation,
                                                             kCCModeCFB,
                                                             kCCAlgorithmAES128,
                                                             ccNoPadding,
                                                             ivPtr,
                                                             keyPtr,
                                                             kCCKeySizeAES128,
                                                             NULL,
                                                             0,
                                                             0,
                                                             0,
                                                             &cryptor);

            if (result != kCCSuccess) {

                NSLog(@"encryptAESCTRData: createWithMode error: %@", @(result));
                result = CCCryptorRelease(cryptor);
                return nil;
            }
            size_t bufferLength = CCCryptorGetOutputLength(cryptor, [self length], true);
            NSMutableData *buffer = [NSMutableData dataWithLength:bufferLength];
            NSMutableData *cipherData = [NSMutableData data];

            size_t outLength;
            result = CCCryptorUpdate(cryptor,
                                     [self bytes],
                                     [self length],
                                     [buffer mutableBytes],
                                     [buffer length],
                                     &outLength);

            // FIXME: Release cryptor and return error
            if (result != kCCSuccess) {

                NSLog(@"encryptAESCTRData: CCCryptorUpdate error: %@", @(result));
                result = CCCryptorRelease(cryptor);
                return nil;
            }

            result = CCCryptorFinal(cryptor,
                                    [buffer mutableBytes],
                                    [buffer length],
                                    &outLength);

            // FIXME: Release cryptor and return error
            if (result != kCCSuccess) {

                NSLog(@"encryptAESCTRData: CCCryptorFinal error: %@", @(result));
                result = CCCryptorRelease(cryptor);
                return nil;
            }
           [cipherData appendBytes:buffer.bytes length:outLength];
           return cipherData;
           //return [NSData dataWithBytesNoCopy:(__bridge void * _Nonnull)(buffer) length:outLength freeWhenDone:YES];
        }

推荐答案

我用这个方法解决了

- (NSData *)AES128OperationWithEncriptionMode:(CCOperation)operation key:(NSData *)key iv:(NSData *)iv {


    CCCryptorRef cryptor = NULL;
    // 1. Create a cryptographic context.
    CCCryptorStatus status = CCCryptorCreateWithMode(operation, kCCModeCFB, kCCAlgorithmAES, ccNoPadding, [iv bytes], [key bytes], [key length], NULL, 0, 0, kCCModeOptionCTR_BE, &cryptor);

    NSAssert(status == kCCSuccess, @"Failed to create a cryptographic context.");

    NSMutableData *retData = [NSMutableData new];

    // 2. Encrypt or decrypt data.
    NSMutableData *buffer = [NSMutableData data];
    [buffer setLength:CCCryptorGetOutputLength(cryptor, [self length], true)]; // We'll reuse the buffer in -finish

    size_t dataOutMoved;
    status = CCCryptorUpdate(cryptor, self.bytes, self.length, buffer.mutableBytes, buffer.length, &dataOutMoved);
    NSAssert(status == kCCSuccess, @"Failed to encrypt or decrypt data");
    [retData appendData:[buffer subdataWithRange:NSMakeRange(0, dataOutMoved)]];

    // 3. Finish the encrypt or decrypt operation.
    status = CCCryptorFinal(cryptor, buffer.mutableBytes, buffer.length, &dataOutMoved);
    NSAssert(status == kCCSuccess, @"Failed to finish the encrypt or decrypt operation");
    [retData appendData:[buffer subdataWithRange:NSMakeRange(0, dataOutMoved)]];
    CCCryptorRelease(cryptor);

    return [retData copy];
}

这篇关于我想在目标 c 中使用无填充的 CFB 加密创建 AES 128的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆