XNSim/XNSignature/test_integrity.cpp

179 lines
5.9 KiB
C++
Raw Permalink Normal View History

#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;
}