1

iPhone アプリで AES 256 復号化を実行する必要があります。シナリオは、プレーン テキストが base64 でエンコードされ、オンライン Web ページで AES256 ビット (OFB モード) を使用して暗号化されているというものです。私のアプリでは、その Web ページから暗号化されたテキストをクエリ文字列として取得します。ここでは、base64 デコードと AES256 復号化を行いました。しかし、私は -4304 ステータスを取得しています。

私は使用しkCCOptionPKCS7Paddingました。パディングも変更しても、適切な復号化されたプレーンテキストが得られません。判読できないテキストのみが表示されます。

OFB モードを設定して、base64 で AES256 暗号化をチェックするためにhttp://isv.appspot.com/app/encを使用しました。

次のコードには、base64 デコードと AES256 復号化に使用した 2 つの方法があります。

+ (NSString*)decryptBase64String:(NSString*)encryptedBase64String keyString:(NSString*)keyString
{
    NSData* encryptedData = [NSData dataFromBase64String:encryptedBase64String];
    NSLog(@"encryptedData %@",encryptedData);
    // NSData *strData = [encryptedData subdataWithRange:NSMakeRange(0, [encryptedData length] - 2)];
    // NSString* newStr = nil;
    NSData* keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
    NSData* data = [self decryptData:encryptedData
                                 key:keyData
                                  iv:nil];
   // newStr = [NSString stringWithCString:[strData bytes] encoding:NSUTF8StringEncoding];

    if (data) {

        return [[[NSString alloc] initWithData:data
                                      encoding:NSASCIIStringEncoding] autorelease];
    } else {
        return nil;
    }
}



+ (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,
                                          kCCOptionPKCS7Padding,
                                          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;
}

この方法を使用してプレーンテキストを取得するのを手伝ってくれる人はいますか?

4

1 に答える 1

0

質問の事実に基づいて、base64 でエンコードされたデータは暗号化されており、そのデータのデコードされたバリエーションではありません。このため、base64 でエンコードされたデータを復号化してから、base64 でデコードする必要があります。

于 2012-06-25T21:55:46.597 に答える