C++ファイルの暗号化・復号化の実装方法
C++ではファイルの暗号化と復号化に暗号化アルゴリズムを使用できます。
一般的な暗号化アルゴリズムにはAES(Advanced Encryption Standard)があります。以下に、AESアルゴリズムを使用してファイルを暗号化および復号化するサンプルコードを示します。
#include <iostream>
#include <fstream>
#include <string>
#include <openssl/aes.h>
const int AES_KEY_LENGTH = 128; // 使用128位的AES加密
std::string encryptFile(const std::string& inputFile, const std::string& outputFile, const std::string& key) {
std::ifstream fin(inputFile, std::ios::binary);
std::ofstream fout(outputFile, std::ios::binary);
// 设置AES加密密钥
AES_KEY aesKey;
AES_set_encrypt_key((const unsigned char*)key.c_str(), AES_KEY_LENGTH, &aesKey);
// 加密文件
unsigned char inBuffer[AES_BLOCK_SIZE];
unsigned char outBuffer[AES_BLOCK_SIZE];
while (fin.read((char*)inBuffer, AES_BLOCK_SIZE)) {
AES_encrypt(inBuffer, outBuffer, &aesKey);
fout.write((char*)outBuffer, AES_BLOCK_SIZE);
}
fin.close();
fout.close();
return outputFile;
}
std::string decryptFile(const std::string& inputFile, const std::string& outputFile, const std::string& key) {
std::ifstream fin(inputFile, std::ios::binary);
std::ofstream fout(outputFile, std::ios::binary);
// 设置AES解密密钥
AES_KEY aesKey;
AES_set_decrypt_key((const unsigned char*)key.c_str(), AES_KEY_LENGTH, &aesKey);
// 解密文件
unsigned char inBuffer[AES_BLOCK_SIZE];
unsigned char outBuffer[AES_BLOCK_SIZE];
while (fin.read((char*)inBuffer, AES_BLOCK_SIZE)) {
AES_decrypt(inBuffer, outBuffer, &aesKey);
fout.write((char*)outBuffer, AES_BLOCK_SIZE);
}
fin.close();
fout.close();
return outputFile;
}
int main() {
std::string inputFile = "input.txt";
std::string encryptedFile = "encrypted.txt";
std::string decryptedFile = "decrypted.txt";
std::string key = "mykey1234567890"; // 密钥
encryptFile(inputFile, encryptedFile, key);
decryptFile(encryptedFile, decryptedFile, key);
return 0;
}
OpenSSLライブラリーのAES関数が上記のコードで使われています。encryptFile関数は入力ファイルパス、出力ファイルパス、鍵を受け取り、入力ファイルの内容を暗号化して出力ファイルに書き込みます。decryptFile関数は暗号化されたファイルパス、復号化後のファイルパス、鍵を受け取り、暗号化されたファイルの内容を復号化して復号化後のファイルに書き込みます。
これは、AESの暗号化と復号だけを示す簡単なサンプルコードであることに注意してください。実際には、キーの生成と格納、暗号化モードの選択など、さらに多くのセキュリティ上の問題を考慮する必要があります。