0

mbedtls ライブラリが非常に軽量な C ライブラリであることは誰もが知っています。ライブラリを使用して文字列を暗号化したい。だから私はこのような関数を持っています:

aes_encrypt.h:

#ifndef AES_ENCRYPT_H
#define AES_ENCRYPT_H

#define BOOL int
#define TRUE 1
#define FALSE 0

extern const unsigned char key[16];

BOOL ENC_STR(unsigned char *plain, size_t plain_len, 
             unsigned char *cipher, size_t *cipher_len);
#endif

そして実装:

const unsigned char KEY[16] = { 0x00, 0x01, 0x02, 0x03,
                                0x04, 0x05, 0x06, 0x07, 
                                0x08, 0x09, 0x0A, 0x0B, 
                                0x0C, 0x0D, 0x0F, 0xA0 };

BOOL ENC_STR(unsigned char *plain, size_t plain_len, unsigned char *cipher, size_t *cipher_len)
{
BOOL ret = FALSE;

// Prepare the cipher context
const mbedtls_cipher_info_t *cipher_info;
mbedtls_cipher_context_t cipher_ctx;
mbedtls_cipher_init(&cipher_ctx);

if ((cipher_info = mbedtls_cipher_info_from_type(AES_PARM)) == NULL)
{
    printf("Cipher Info ERR!\n");
    ret = -1;
    goto EXIT;
}

if ( (ret = mbedtls_cipher_setup(&cipher_ctx, cipher_info)) != 0)
{
    printf("Cipher Setup ERR!\n");
    goto EXIT;
}

if ( (ret = mbedtls_cipher_setkey(&cipher_ctx, KEY, cipher_info->key_bitlen, MBEDTLS_ENCRYPT)) != 0)
{
    printf("Cipher SetKey ERR!\n");
    goto EXIT;
}

// if ( (ret = mbedtls_cipher_set_padding_mode(&cipher_ctx, 1)) != 0) {
//     printf("Cipher SetPadding ERR!\n");
//     goto EXIT;
// }


if ( (ret = mbedtls_cipher_reset(&cipher_ctx)) != 0)
{
    printf("Cipher Reset ERR!\n");
    goto EXIT;
}

// encrypt
if ((ret = mbedtls_cipher_update(&cipher_ctx, plain, plain_len, cipher, cipher_len)) != 0) {
    printf("Cipher Update ERR!\n");
    goto EXIT;
}

EXIT:
    if (ret != TRUE) {
        char buf[1024] = {0};
        mbedtls_strerror(ret, buf, 1024);
        printf("Error Msg:\t%s\n", buf);
    }

    mbedtls_cipher_free(&cipher_ctx);
    return ret;
}

私は以下のような関数を呼び出します:

unsigned char *plain = (unsigned char*)"hello world";
size_t plain_len = 12;
unsigned char cipher[128] = {0};
size_t cipher_len = -1;
printf("the encrypt result is:\t%d\n", ENC_STR(plain, plain_len, cipher, &cipher_len));

そして、私は以下のようなエラーメッセージを受け取ります:

CIPHER - Decryption of block requires a full block

誰でも私を助けて、エラーメッセージの意味を説明できますか? ありがとう。

4

3 に答える 3

0

を呼び出して暗号化を完了する必要がありますmbedtls_cipher_finish

の理由finishは、パディングを追加する必要があるためupdateです。N * BlockSizePKCS7 パディング スキーム (デフォルトで使用されています) は、ソース データに長さがある場合でも常に何かを追加します。

https://tls.mbed.org/api/cipher_8h.html#a6678691c02cb3f1322b2179987bfffb2

于 2020-06-13T07:41:04.557 に答える
0

説明:

CIPHER - ブロックの復号化には完全なブロックが必要
です 誰でも私を助けて、エラーメッセージの意味を説明できますか?

AES はブロック暗号です。つまり、128 ビット ブロックを一度に暗号化するように実装されています。それ以上でもそれ以下でもありません。

そのため、ソース データが 1 つのブロックよりも短い場合は、パディングを使用して、データを必要な長さまで延長する必要があります。

一般に、任意の長さのデータを暗号化するには、操作モードを使用します。パディングを必要としないものもあります (CTR、CFB、OFB など)。

それでも、暗号化は安全とは言えません。IV (salt) と認証タグが必要です。

mbedtls ライブラリが非常に軽量な C ライブラリであることは誰もが知っています。

どうやらmbedtlはすでに複数の操作モードをサポートしているようです。選択するのはあなた次第です

于 2017-12-07T09:45:03.623 に答える