【问题标题】:Request Failed Asi HTTP请求失败的 Asi HTTP
【发布时间】:2015-02-24 07:02:45
【问题描述】:

我正在使用 AES 加密算法 (ECB) 并使用 ASI http 库,但由于 401 未经授权,我的请求失败。 我在下面附上了我的代码。

加密算法。(AES 128 加密)

+ (NSData*)encryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv;
{
    NSData* result = nil;

    // setup key
    unsigned char cKey[FBENCRYPT_KEY_SIZE];
    bzero(cKey, sizeof(cKey));
    [key getBytes:cKey length:FBENCRYPT_KEY_SIZE];

    // setup iv
    char cIv[FBENCRYPT_BLOCK_SIZE];
    bzero(cIv, FBENCRYPT_BLOCK_SIZE);
    if (iv) {
        [iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE];
    }

    // setup output buffer
    size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE;
    void *buffer = malloc(bufferSize);

    // do encrypt
    size_t encryptedSize = 0;

//  /  CCCryptorStatus cryptStatus2 = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, [data bytes], [data length], NULL, [cipherData bytes], outLength, [decodedData mutableBytes], [decodedData length], &outLength);

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          FBENCRYPT_ALGORITHM,
                                           kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          cKey,
                                          FBENCRYPT_KEY_SIZE,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &encryptedSize);
    if (cryptStatus == kCCSuccess) {
        result = [NSData dataWithBytesNoCopy:buffer length:encryptedSize];
    } else {
        free(buffer);
        NSLog(@"[ERROR] failed to encrypt|CCCryptoStatus: %d", cryptStatus);
    }

    return result;
}

解密算法。(AES 128 解密)

+ (NSData*)decryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv;
{
    NSData* result = nil;

    // setup key
    unsigned char cKey[FBENCRYPT_KEY_SIZE];
    bzero(cKey, sizeof(cKey));
    [key getBytes:cKey length:FBENCRYPT_KEY_SIZE];

    // setup iv
    char cIv[FBENCRYPT_BLOCK_SIZE];
    bzero(cIv, FBENCRYPT_BLOCK_SIZE);
    if (iv) {
        [iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE];
    }

    // setup output buffer
    size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE;
    void *buffer = malloc(bufferSize);

    // do decrypt
    size_t decryptedSize = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          FBENCRYPT_ALGORITHM,
                                           kCCOptionECBMode,
                                          cKey,
                                          FBENCRYPT_KEY_SIZE,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &decryptedSize);

    if (cryptStatus == kCCSuccess) {
        result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
    } else {
        free(buffer);
        NSLog(@"[ERROR] failed to decrypt| CCCryptoStatus: %d", cryptStatus);
    }

    return result;
}

Base 64 算法。

- (NSString *)base64EncodedString
{
    size_t outputLength;
    char *outputBuffer =
        NewBase64Encode([self bytes], [self length], true, &outputLength);

    NSString *result =
        [[[NSString alloc]
            initWithBytes:outputBuffer
            length:outputLength
            encoding:NSASCIIStringEncoding]
        autorelease];
    free(outputBuffer);
    return result;
}

请做必要的事。 提前致谢

【问题讨论】:

  • 是什么让您认为问题在于加密?密钥、数据输入和输出的十六进制转储在哪里? ECB 确实不安全,尤其是对于图像,但有设置 iv 的代码。即使作者建议不要使用 ASI,您为什么还要使用它,AFNetworking 是最新的并且正在积极维护中。为什么使用 Apple 提供的第 3 方 Base64 代码?你为什么不使用 ARC?
  • 我想大部分问题都可以通过选择第 3 方项目来回答,选择更好、更当前的项目。 RNCryptor 是最新的,可能适合您的需求。
  • 感谢您的回复,但是已经在 php 端实现了 ECB,所以我不能使用 CBC,否则 php 服务器无法解密我的请求。
  • 由于 unicodes 我的请求失败了,是否有任何替代方案可以为 RNCryptor 实施 ECB?
  • 加密是基于数据的,您将字符串转换为数据并加密/解密数据,然后再转换回所需的任何格式。

标签: ios objective-c iphone encryption aes


【解决方案1】:

这是一个基本的加密/解密方法。密钥的长度必须正确。值上下文是kCCEncryptkCCDcrypt

将字符串转换为数据并加密/解密数据,然后转换回所需的任何格式。 Base64编码使用NSData提供的方法。

在PKCS7Padding用于加密但不用于解密的问题中,两者必须相同。

+ (NSData *)doCipher:(NSData *)dataIn
                 key:(NSData *)symmetricKey
             context:(CCOperation)encryptOrDecrypt
               error:(NSError **)error
{
    CCCryptorStatus ccStatus   = kCCSuccess;
    size_t          cryptBytes = 0;
    NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];

    ccStatus = CCCrypt( encryptOrDecrypt,
                       kCCAlgorithmAES128,
                       kCCOptionPKCS7Padding | kCCOptionECBMode,
                       symmetricKey.bytes, 
                       kCCKeySizeAES128,
                       nil,
                       dataIn.bytes, dataIn.length,
                       dataOut.mutableBytes, dataOut.length,
                       &cryptBytes);

    if (ccStatus == kCCSuccess) {
        dataOut.length = cryptBytes;
    }
    else {
        if (error) {
            *error = [NSError errorWithDomain:@"kEncryptionError" code:ccStatus userInfo:nil];
        }
        dataOut = nil;
    }
    return dataOut;
}

【讨论】:

  • 我已经尝试过你的方法,但仍然相同的响应请求失败:(
  • 知道了。状态码:401,状态信息:HTTP/1.1 401 Unauthorized
  • 您需要真正检查 API,到底需要什么。
  • 我认为服务器端 API 可能存在问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 2014-11-19
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
相关资源
最近更新 更多