179 lines
5.9 KiB
C++
179 lines
5.9 KiB
C++
#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;
|
||
} |