0

CCCrypt を使用してデータを暗号化しようとしていますが、何か問題があります。暗号化後にデータ長が変更されましたが、復号化では発生しませんでした。次のコードは次のとおりです。

- (NSData *)AES256EncryptWithKeyGenerateIV:(NSString *)key {
    char keyPtr[kCCKeySizeAES128+1];
    bzero(keyPtr, sizeof(keyPtr));

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

    char ivPtr[kCCKeySizeAES128+1];

    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5([key UTF8String], strlen([key UTF8String]), result);

    NSString* resultString = [NSString stringWithFormat:
                              @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                          result[0], result[1], result[2], result[3],
                          result[4], result[5], result[6], result[7],
                          result[8], result[9], result[10], result[11],
                          result[12], result[13], result[14], result[15]
                          ];
    resultString = [resultString substringToIndex:16];

    bzero(ivPtr, sizeof(ivPtr));
    [resultString getCString:ivPtr maxLength:sizeof(ivPtr)     encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [self length];

    NSLog(@"Before encrypt dataLength is %d",dataLength);

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

    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
                                      0,
                                      keyPtr, kCCBlockSizeAES128,
                                      ivPtr,
                                      [self bytes], dataLength,
                                      buffer, bufferSize,
                                      &numBytesDecrypted);

    NSLog(@"After file encrypted dataLength is %d",numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free(buffer);
    return nil;
}

ここに、データの長さを出力するログがあります。

2012-07-09 18:29:20.787 暗号化前 dataLength は 248
2012-07-09 18:29:20.788 ファイル暗号化後 dataLength は 240
2012-07-09 18:29:20.789 暗号化前 dataLength は 20
2012-07- 09 18:29:20.790 ファイル暗号化後 dataLength は 16
2012-07-09 18:29:20.792 暗号化前 dataLength は 583
2012-07-09 18:29:20.792 ファイル暗号化後 dataLength は 576
2012-07-09 18: 29:20.795 暗号化前 dataLength は 31120
2012-07-09 18:29:20.796 ファイル暗号化後 dataLength は 31120
2012-07-09 18:29:20.797 暗号化前 dataLength は 27551
2012-07-09 18:29:20.798 後ファイル暗号化 dataLength は 27536
2012-07-09 18:29:20.800 暗号化前 dataLength は 1266
2012-07-09 18:29:20.800 ファイル暗号化後 dataLength は 1264
2012-07-09 18:29:20.802 暗号化前 dataLength は 431315
2012-07-09 18:29:20.809 ファイル暗号化後 dataLength は 431312
2012-07 -09 18:29:20.815 暗号化前 dataLength は 204
2012-07-09 18:29:20.815 ファイル暗号化後 dataLength は 192
2012-07-09 18:29:20.817 暗号化前 dataLength は 1083
2012-07-09 18: 29:20.817 ファイル暗号化後 dataLength は 1072
2012-07-09 18:29:20.818 暗号化前 dataLength は 440
2012-07-09 18:29:20.819 ファイル暗号化後 dataLength は 432

誰かが理由を教えてもらえますか?

4

2 に答える 2

1

ブロック暗号を使用している場合は、プレーンテキストを暗号ブロックに合わせるためにパディングを適用する必要があります。AESはブロック暗号であり、128ビット、16バイトのブロックサイズを使用します。CCOptionsで明示的なパディングとCBCモードを試してみてください。これを行う方法については、CCCryptのAppleドキュメントを参照してください(ただし、私の人生で暗号化方式のより良い説明を見てきました)。

[編集]注:試しkCCOptionPKCS7Paddingてみてください。おそらくCBCがデフォルトです。

于 2012-07-09T11:10:28.657 に答える
1

CCCrypt 関数を使用して、何かを DES 暗号化します。暗号化するデータの長さが8Byteの倍数でない場合、エラーサイズが発生しました。

したがって、私はこれを次のように処理します。

- (NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key
{
    NSString *ciphertext = nil;
    const char *textBytes = [plainText UTF8String];
    NSUInteger dataLength = [plainText length];
    NSUInteger len1=dataLength % 8;

    if(len1!=0)
    {
        dataLength+=(8-len1);
    }    
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    size_t numBytesEncrypted = 0;

    Byte iv[] = {0x02, 0x00, 0x01, 0x02, 0x00, 0x06, 0x00, 0x05};

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
                                          NULL,
                                          [key UTF8String], kCCKeySizeDES,
                                          iv,
                                          textBytes, dataLength,
                                          buffer, 1024,
                                          &numBytesEncrypted);
.....
}

その後、すべて大丈夫です!

于 2013-08-09T06:48:03.823 に答える