在C++中,我们可以使用标准库中的<fstream>
来处理文件的读取和写入,以及<iostream>
来进行输出
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <openssl/sha.h>
std::string calculate_sha256(const std::string &file_path) {
std::ifstream file(file_path, std::ios::binary);
if (!file) {
std::cerr << "Error opening file: " << file_path << std::endl;
return "";
}
SHA256_CTX sha256;
SHA256_Init(&sha256);
const int buffer_size = 1024;
std::vector<char> buffer(buffer_size);
while (file.read(buffer.data(), buffer_size)) {
SHA256_Update(&sha256, buffer.data(), file.gcount());
}
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_Final(hash, &sha256);
std::stringstream ss;
for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(hash[i]);
}
return ss.str();
}
bool verify_file(const std::string &file_path, const std::string &expected_hash) {
std::string actual_hash = calculate_sha256(file_path);
if (actual_hash.empty()) {
return false;
}
return actual_hash == expected_hash;
}
int main() {
std::string file_path = "example.txt";
std::string expected_hash = "1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7a8b9c0d1e2f"; // Replace with the expected SHA256 hash of the file
if (verify_file(file_path, expected_hash)) {
std::cout << "File is valid." << std::endl;
} else {
std::cout << "File is invalid." << std::endl;
}
return 0;
}
这个示例中,我们首先使用OpenSSL库中的SHA256_CTX
结构来计算文件的SHA-256哈希值。calculate_sha256
函数接受一个文件路径作为参数,打开文件并读取其内容,然后使用SHA-256算法计算哈希值。最后,我们将哈希值转换为十六进制字符串并返回。
verify_file
函数接受一个文件路径和一个预期的哈希值作为参数。它首先调用calculate_sha256
函数来计算文件的哈希值,然后将其与预期的哈希值进行比较。如果它们相等,则返回true
,表示文件有效;否则返回false
,表示文件无效。
在main
函数中,我们指定要验证的文件路径和预期的哈希值,然后调用verify_file
函数来检查文件是否有效。根据验证结果,我们输出相应的消息。
请注意,为了使这个示例正常工作,您需要安装OpenSSL库并在编译时链接它。例如,使用g++编译器时,您可以使用以下命令:
g++ -o file_verification file_verification.cpp -lssl -lcrypto
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。