ここにある 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 を返しません。
何が問題なのですか?おそらくパディング?私はそれを理解できないようです。