0

以下のコードでは、復号化されたテキストが元のプレーンテキストと一致していません。最初の12バイトはめちゃくちゃです。ブロック暗号のパディングが無効になっていることに注意してください。BUF_SIZEにさまざまな値を試しましたが、すべて16の倍数です。復号化されたデータの最初の12バイトが間違っているたびに。出力は次のとおりです。

    plain buf[32]:
    11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
    11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
    outlen=32
    outlen=32
    dec buf[32]:
    0C 08 01 46 6D 3D FC E9 98 0A 2D E1 AF A3 95 3A
    0B 31 1B 9D 11 11 11 11 11 11 11 11 11 11 11 11

コードは次のとおりです。

#include <stdio.h>
#include <string.h>
#include <CommonCrypto/CommonCryptor.h>

static void
dumpbuf(const char* label, const unsigned char* pkt, unsigned int len)
{
    const int bytesPerLine = 16;

    if (label) {
        printf("%s[%d]:\n", label, len);
    }

    for (int i = 0; i < int(len); i++) {
        if (i && ((i % bytesPerLine) == 0)) {
            printf("\n");
        }
        unsigned int c = (unsigned int)pkt[i] & 0xFFu;
        printf("%02X ", c);
    }
    printf("\n");
}

int main(int argc, char* argv[])
{
    unsigned char key[16];
    unsigned char iv[16];

    memset(key, 0x22, sizeof(key));
    memset(iv, 0x33, sizeof(iv));

#define BUF_SIZE  32
    unsigned char plainBuf[BUF_SIZE];
    unsigned char encBuf[BUF_SIZE];
    memset(plainBuf, 0x11, sizeof(plainBuf));
    dumpbuf("plain buf", plainBuf, sizeof(plainBuf));

    int outlen;
    CCCryptorStatus status;
    status = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 0,
            key, kCCKeySizeAES128, iv, plainBuf, sizeof(plainBuf),
            encBuf, sizeof(encBuf), (size_t*)&outlen);
    if (kCCSuccess != status) {
        fprintf(stderr, "FEcipher: CCCrypt failure\n");
        return -1;
    }
    printf("outlen=%d\n", outlen);

    status = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0,
            key, kCCKeySizeAES128, iv, encBuf, sizeof(encBuf),
            plainBuf, sizeof(plainBuf), (size_t*)&outlen);
    if (kCCSuccess != status) {
        fprintf(stderr, "FEcipher: CCCrypt failure\n");
        return -1;
    }
    printf("outlen=%d\n", outlen);
    dumpbuf("dec buf", plainBuf, sizeof(plainBuf));
    return 0;
}

ありがとう、ハリ

4

2 に答える 2

0

@owlstead、ご返信ありがとうございます。CBC がデフォルトです。これを有効にするためにオプションで特別なことを指定する必要はありません。

CCCrypt() を使用した同じコードは、以前は機能していました。何が変わったのかわかりません - 更新中に新しいライブラリがインストールされた可能性があります。便利な関数 CCCrypt() を使用する代わりに、Create/Update/Final API を使用しています。これは機能するため、回避策があります。

于 2012-12-16T04:15:39.153 に答える
-1

outlen は int ではなく size_t にする必要があります。

于 2013-06-20T03:28:26.000 に答える