1

ここにある EVP ライブラリを使用しています: https://www.openssl.org/docs/manmaster/crypto/EVP_EncryptInit.html

これが私の2つの暗号化関数と復号化関数です。

AES 128 CBC を使用して文字列を暗号化しようとしています。

文字列は通常、次の形式ですword1 word2 word3

char* encrypt(char *s, char *key) {
        unsigned char iv[16] = {[0 ... 15 ] = 0};
        unsigned char outbuf[1024] = {[0 ... 1023] = 0};
        int outlen1, outlen2;

        EVP_CIPHER_CTX ctx;

        EVP_CIPHER_CTX_init(&ctx);
        EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);
        if (EVP_EncryptUpdate(&ctx, outbuf, &outlen1, s, strlen(s)) == 1) {
                if (EVP_EncryptFinal_ex(&ctx, outbuf + outlen1, &outlen2) == 1) {
                        EVP_CIPHER_CTX_cleanup(&ctx);
                        return strdup(outbuf);
                }
        }
        EVP_CIPHER_CTX_cleanup(&ctx);
        return NULL;
}

char* decrypt(char *s, char *key) {
        unsigned char iv[16] = {[0 ... 15 ] = 0};
        unsigned char outbuf[1024] = {[0 ... 1023] = 0};
        int outlen1, outlen2;

        EVP_CIPHER_CTX ctx;

        EVP_CIPHER_CTX_init(&ctx);
        EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);
        if (EVP_DecryptUpdate(&ctx, outbuf, &outlen1, s, strlen(s)) == 1) {
                printf("After decrypt update\n");
                if (EVP_DecryptFinal_ex(&ctx, outbuf + outlen1, &outlen2) == 1) {
                        printf("After decrypt final\n");
                        EVP_CIPHER_CTX_cleanup(&ctx);
                        return strdup(outbuf);
                }
        }
        EVP_CIPHER_CTX_cleanup(&ctx);
        return NULL;
}

問題は、復号化の最終関数が一部の文字列では機能するが、他の文字列では機能しないことです。

暗号化される前の文字列が のようなものであるcat dog cow場合、復号化は機能します。

しかし、 のようなbat dog cow場合、特に関数で復号化に失敗しEVP_DecryptFinal_ex()ます。

一部の文字列では、復号化は常にEVP_DecryptFinal_ex()関数で失敗します。1 を返しません。

何が問題なのですか?おそらくパディング?私はそれを理解できないようです。

4

1 に答える 1