Пример реализации Java CBCBlockCipherMac в Objective c

Может кто-нибудь поделиться примером кода о том, как реализовать CBCBlockCipherMac в цели C. Вот, как далеко я получил, и это дает отличный результат от реализации Java.

const unsigned char key[16] = "\x1\x2\x3\x4\x5\x6\x7\x8\x9\x0\x1\x2\x3\x4\x5\x6";
const unsigned char data[14] = "\x54\x68\x69\x73\x69\x73\x6d\x79\x73\x74\x72\x69\x6e\x67";

CMAC_CTX *ctx = CMAC_CTX_new();
ret = CMAC_Init(ctx, key, sizeof(key), EVP_des_ede3(), 0);


printf("CMAC_Init = %d\n", ret);

ret = CMAC_Update(ctx, data, sizeof(data));

printf("CMAC_Update = %d\n", ret);

size_t size;
//unsigned int size;
unsigned char tag[4];
ret = CMAC_Final(ctx, tag, &size);


printf("CMAC_Final = %d, size = %u\n", ret, size);

CMAC_CTX_free(ctx);

printf("expected: 391d1520\n"
       "got:      ");
size_t index;
for (index = 0; index < sizeof(tag) - 1; ++index) {
    printf("%02x", tag[index]);
    if ((index + 1) % 4 == 0) {
        printf(" ");
    }
}
printf("%02x\n", tag[sizeof(tag) - 1]);

И мой код Java выглядит так

String *data = "Thisismystring";
String *keyString = "1234567890123456";


bytes[]mac = new byte[4];
CBCBlockCipherMac macCipher = new CBCBlockCipherMac(DESedeEngine);
DESedeParameters keyParameter = new DESedeParameters(keyString.getBytes());
DESedeEngine engine = new DESedeEngine();
engine,init(true, keyParameter);
byte[] dataBytes = data.getBytes();
macCipher.update(dataBytes,0,data.length());
macCipher.doFinal(mac,0);
byte[] macBytesEncoded = Hex.encode(mac);
String macString = new String(macBytesEncoded);

Это дает мне "391d1520". Но цель c дает мне "01000000"

1 ответ

CMAC - это не то же самое, что CBC MAC. CMAC имеет дополнительный шаг в начале и в конце расчета. Если возможно, я бы посоветовал вам обновить код Java для использования CMAC, так как CBC не так безопасен, например, используя org.bouncycastle.crypto.macs.CMac,

OpenSSL, по-видимому, не реализует CBC MAC напрямую (по крайней мере, я не могу найти какую-либо ссылку на него). Так что если вам это нужно, вам нужно реализовать это самостоятельно.

Вы можете использовать шифрование в режиме CBC с нулевым IV и взять последние 16 байтов шифрования. Конечно, это означает, что вам нужно где-то хранить оставшуюся часть зашифрованного текста в буфере, или вам нужно использовать функции обновления с умом (многократное повторное использование одного и того же буфера для зашифрованного текста).

Другие вопросы по тегам