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