XNSim/XNSignature/test_integrity.cpp

179 lines
5.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include "XNSignatureVerify.h"
/**
* @brief 测试文件完整性检测
* 验证签名是否能检测到文件的任何微小变化
*/
int main()
{
std::cout << "=== 文件完整性检测测试 ===" << std::endl;
// 创建测试文件
std::string testFile = "test_integrity.txt";
std::ofstream file(testFile);
if (!file.is_open()) {
std::cerr << "错误:无法创建测试文件" << std::endl;
return -1;
}
file << "这是一个测试文件,用于验证数字签名的完整性检测功能。" << std::endl;
file << "任何微小的修改都应该被检测到。" << std::endl;
file.close();
std::cout << "1. 创建测试文件: " << testFile << std::endl;
// 生成密钥对
std::cout << "2. 生成密钥对..." << std::endl;
system("./XNSignatureKeygen");
// 对文件进行签名
std::cout << "3. 对文件进行签名..." << std::endl;
system(("./XNSignatureSign " + testFile).c_str());
// 验证原始签名
std::cout << "4. 验证原始签名..." << std::endl;
int result1 = verifySignature(testFile.c_str(), "public_key.pem", (testFile + ".sig").c_str());
if (result1 == 0) {
std::cout << "✓ 原始文件签名验证成功" << std::endl;
} else {
std::cout << "✗ 原始文件签名验证失败" << std::endl;
return -1;
}
// 测试1修改文件内容添加一个字符
std::cout << "\n5. 测试1修改文件内容添加字符..." << std::endl;
std::ofstream modFile1(testFile, std::ios::app);
modFile1 << "X"; // 添加一个字符
modFile1.close();
int result2 = verifySignature(testFile.c_str(), "public_key.pem", (testFile + ".sig").c_str());
if (result2 != 0) {
std::cout << "✓ 检测到文件内容修改" << std::endl;
} else {
std::cout << "✗ 未能检测到文件内容修改" << std::endl;
return -1;
}
// 恢复文件内容
std::ofstream restoreFile1(testFile);
restoreFile1 << "这是一个测试文件,用于验证数字签名的完整性检测功能。" << std::endl;
restoreFile1 << "任何微小的修改都应该被检测到。" << std::endl;
restoreFile1.close();
// 重新签名
system(("./XNSignatureSign " + testFile).c_str());
// 测试2修改文件内容删除一个字符
std::cout << "\n6. 测试2修改文件内容删除字符..." << std::endl;
std::string content;
std::ifstream readFile(testFile);
std::getline(readFile, content);
readFile.close();
if (content.length() > 0) {
content = content.substr(0, content.length() - 1); // 删除最后一个字符
std::ofstream modFile2(testFile);
modFile2 << content << std::endl;
modFile2.close();
int result3 =
verifySignature(testFile.c_str(), "public_key.pem", (testFile + ".sig").c_str());
if (result3 != 0) {
std::cout << "✓ 检测到文件内容修改" << std::endl;
} else {
std::cout << "✗ 未能检测到文件内容修改" << std::endl;
return -1;
}
}
// 测试3修改文件内容替换一个字符
std::cout << "\n7. 测试3修改文件内容替换字符..." << std::endl;
std::ifstream readFile2(testFile);
std::getline(readFile2, content);
readFile2.close();
if (content.length() > 5) {
content[5] = 'X'; // 替换第6个字符
std::ofstream modFile3(testFile);
modFile3 << content << std::endl;
modFile3.close();
int result4 =
verifySignature(testFile.c_str(), "public_key.pem", (testFile + ".sig").c_str());
if (result4 != 0) {
std::cout << "✓ 检测到文件内容修改" << std::endl;
} else {
std::cout << "✗ 未能检测到文件内容修改" << std::endl;
return -1;
}
}
// 测试4修改文件内容添加空格
std::cout << "\n8. 测试4修改文件内容添加空格..." << std::endl;
std::ifstream readFile3(testFile);
std::getline(readFile3, content);
readFile3.close();
content.insert(10, " "); // 在第10个位置插入空格
std::ofstream modFile4(testFile);
modFile4 << content << std::endl;
modFile4.close();
int result5 = verifySignature(testFile.c_str(), "public_key.pem", (testFile + ".sig").c_str());
if (result5 != 0) {
std::cout << "✓ 检测到文件内容修改" << std::endl;
} else {
std::cout << "✗ 未能检测到文件内容修改" << std::endl;
return -1;
}
// 测试5修改文件内容改变换行符
std::cout << "\n9. 测试5修改文件内容改变换行符..." << std::endl;
std::ofstream modFile5(testFile);
modFile5 << "这是一个测试文件,用于验证数字签名的完整性检测功能。\r\n"; // 使用Windows换行符
modFile5 << "任何微小的修改都应该被检测到。\r\n";
modFile5.close();
int result6 = verifySignature(testFile.c_str(), "public_key.pem", (testFile + ".sig").c_str());
if (result6 != 0) {
std::cout << "✓ 检测到文件内容修改" << std::endl;
} else {
std::cout << "✗ 未能检测到文件内容修改" << std::endl;
return -1;
}
// 测试6修改文件内容添加不可见字符
std::cout << "\n10. 测试6修改文件内容添加不可见字符..." << std::endl;
std::ofstream modFile6(testFile);
modFile6 << "这是一个测试文件,用于验证数字签名的完整性检测功能。" << std::endl;
modFile6 << "任何微小的修改都应该被检测到。" << (char)0x00 << std::endl; // 添加null字符
modFile6.close();
int result7 = verifySignature(testFile.c_str(), "public_key.pem", (testFile + ".sig").c_str());
if (result7 != 0) {
std::cout << "✓ 检测到文件内容修改" << std::endl;
} else {
std::cout << "✗ 未能检测到文件内容修改" << std::endl;
return -1;
}
std::cout << "\n=== 测试完成 ===" << std::endl;
std::cout << "✓ 所有完整性检测测试通过!" << std::endl;
std::cout << "✓ 数字签名能够检测到文件的任何微小变化" << std::endl;
// 清理测试文件
system(("rm -f " + testFile + " " + testFile + ".sig").c_str());
return 0;
}