1

暗号化/復号化文字列値にCCCryptを使用しています。復号化された値は最初の値と等しいため、正常に機能しているように見えますが、問題は、復号化されたデータから適切なNSStringオブジェクトを抽出できないことです。

@implementation NSData (AES256) 

- (NSData *)AES256EncryptWithKey:(NSString *)key 
{
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                        keyPtr, kCCKeySizeAES256,
                                        NULL /* initialization vector (optional) */,
                                        [self bytes], dataLength, /* input */
                                        buffer, bufferSize, /* output */
                                        &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) { 
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer); //free the buffer;
    return nil;
}

- (NSData *)AES256DecryptWithKey:(NSString *)key {
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                        keyPtr, kCCKeySizeAES256,
                                        NULL /* initialization vector (optional) */,
                                        [self bytes], dataLength, /* input */
                                        buffer, bufferSize, /* output */
                                        &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free(buffer); //free the buffer;
    return nil;
}

何が悪いのかわからないので、誰か助けていただければ幸いです。

そして、質問の2番目の部分-AES暗号化方式のCBCモードを設定するにはどうすればよいですか。このモードはデフォルトで使用されるとドキュメントに記載されていますが、CCCryptメソッドの3番目の引数として何を渡す必要がありますか?

4

2 に答える 2

1

前の回答でコメントした質問に対処すると、暗号化されたデータが暗号化されているという事実を考えると、暗号化されたデータがと一致する可能性が非常に低いため、initWithData:encoding:関数が返されます。nilNSUTF8StringEncoding

完全な答えを持つ同じ質問:CommonCryptoを介した暗号化から戻ってNSDataをNSStringに変換した後、initWithDataがエラーを示すnilを返すのはなぜですか?余談ですが、base64は暗号化されたデータを表示可能な文字列にするのではなく、表示可能なASCII文字列にするためにさらに変更します。この文字列は、暗号化されたデータやデータの暗号化と同じであると想定するべきではありませんが、キーチェーンなどで文字列として使用する場合は問題なく機能します。

于 2012-05-25T20:01:15.213 に答える
0

復号化後に正確な文字列を取得するには、base64でデコードDecrypted Dataしてから、NSUTF8StringEncodingを使用してNSStringを作成する必要があります。

    NSString decryptedString = [[NSString alloc]initWithData:decryptedData];

    NSData *data = [NSData dataByBase64DecodingString:decryptedString];

    decryptedString = [data dataUsingEncoding:NSUTF8StrinEncoding];

decryptedString暗号化する前に、文字列を同じままにします。

base64デコードについては、この投稿を参照してください。

于 2012-04-05T15:19:15.547 に答える