OpenSSL ライブラリを使用して、DES-ofb (libcrypto) で txt ファイルを暗号化および復号化する必要があります。キーと初期化ベクトルは、1 つの bin.file(key+iv) で指定されます。しかし、EVP_DecryptUpdate() による復号化の後、復号化されたテキストとプレーン テキストはまったく似ていません。
だから私はplain.txt 8バイトと「keyandIV.bin」ファイルを読みました。keyandIVbuffer から最初の 8 バイトを DES の KEY として取得し、残りを IV として取得しました。したがって、8 バイトのキーと 8 バイトの IV があり、両方の末尾に '\0' が追加されています (ここで '\0' は必要ですか? キーの長さは 64 ビットまたは 56 ビットでなければなりませんか?)。
これは、DES ofb を使用した暗号化の私のコードです。
printf("ENCRYPTION:\n");
int howmany = 0, final1;
const EVP_CIPHER *CIPHER_TYPE = EVP_des_ofb();
EVP_CIPHER_CTX *ctx_encrypt = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx_encrypt);
EVP_EncryptInit(ctx_encrypt, CIPHER_TYPE, keybuf1, ivbuf1);
if(!EVP_EncryptUpdate(ctx_encrypt, ciphertextbuf1, &howmany, plaintextbuf1, plainlength1))return -1;
if(!EVP_EncryptUpdate(ctx_encrypt, ciphertextbuf1, &howmany, plaintextbuf1, plainlength1)) return -1;
EVP_EncryptFinal_ex(ctx_encrypt, ciphertextbuf1 + howmany , &final1);
EVP_CIPHER_CTX_cleanup(ctx_encrypt);
暗号化されたバッファを取得して復号化するよりも、次のようにします。
printf("DECRYPTION:\n");
int final2;
EVP_CIPHER_CTX *ctx_decrypt = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx_decrypt);
EVP_DecryptInit(ctx_decrypt, CIPHER_TYPE, keybuf1, ivbuf1);
if(!EVP_DecryptUpdate(ctx_decrypt, decryptedtext, &howmany, ciphertextbuf1, strlen(ciphertextbuf1))) return -1;
if(!EVP_EncryptFinal_ex(ctx_decrypt, decryptedtext + howmany, &final2)) return -1;
EVP_CIPHER_CTX_cleanup(ctx_decrypt);
私は間違いなくDESの理解に問題があります。1 つのファイルからキーと IV を作成することで、何か問題があったのかもしれません。多くの例を見てきましたが、自分のプログラムで何が間違っていたのかまだわかりません。