2025-2026-1 20231301 《信息安全设计》第二周学习总结

news/2025/9/21 13:38:00/文章来源:https://www.cnblogs.com/twilight0966/p/19098830

View Post

2025-2026-1 20231301 《信息安全设计》第二周学习总结

2025-2026-1 20231301 《信息安全设计》第二周学习总结

目录
  • 作业信息
  • 学习内容总结
    • 《Head First C 嗨翻C语⾔》 第八章
      • 静态库与动态库基本概念
      • 创建与使用静态库
      • 创建与使用动态库
      • 静态库与动态库的比较
      • 应用场景与最佳实践
      • 总结
    • 《Windows C/C++ 加密解密实战》第三章
      • 核心概念
      • 国密算法SM4
      • OpenSSL对称加密实践
    • 《Windows C/C++ 加密解密实战》第五章
      • Base64编码
      • PEM文件格式
      • ASN.1与DER/BER编码
      • 编码转换实践

作业信息

作业 链接
作业课程 <班级>(2025-2026-1 信息安全设计)
作业要求 <作业>(2025-2026-1 信息安全设计 预习作业要求)
作业目标 《Head First C 嗨翻C语⾔》 第八章
《Windows C/C++ 加密解密实战》> 预习第三、五章
作业正文 <博客>(第二周学习总结)

学习内容总结

《Head First C 嗨翻C语⾔》 第八章

静态库与动态库基本概念

在C语言开发中,库(Library) 是预编译代码的集合,用于提供可重用的功能模块。库分为静态库和动态库两种类型,它们在代码的链接方式和运行时行为上有着本质区别。
静态库(Static Library) 在编译时会被完整地嵌入到最终的可执行文件中。在Linux/Unix系统中,静态库通常以.a(Archive)为后缀;在Windows系统中,则以.lib为后缀。静态库的特点是:生成的可执行文件独立性强,不依赖外部库文件,但文件体积较大,且库代码更新需要重新编译整个程序。
动态库(Dynamic Library) (也称为共享库)则在程序运行时才被加载到内存中。不同系统下动态库的后缀不同:Linux/Unix系统使用.so(Shared Object),Windows系统使用.dll(Dynamic Link Library),macOS系统使用.dylib(Dynamic Library)。动态库的特点是多个程序可以共享同一库实例,减少内存占用,库更新无需重新编译所有依赖程序,但需要管理库依赖关系。

静态库与动态库的主要区别

特性 静态库 动态库
链接时机 编译时 运行时
文件独立性 独立,不依赖外部库 依赖外部库文件
内存使用 每个程序有自己的库代码副本 多个程序共享同一库实例
更新维护 更新需重新编译程序 更新库文件即可
文件大小 可执行文件较大 可执行文件较小

创建与使用静态库

  1. 创建静态库

创建静态库的过程分为三个步骤:编译源代码、创建归档文件、命名规范。
首先,需要将源代码编译成目标文件(.o文件)。使用-c选项告诉GCC只编译不链接:

gcc -c encrypt.c -o encrypt.o
gcc -c checksum.c -o checksum.o

然后,使用ar(archive)工具将多个目标文件打包成静态库:

ar -rcs libsecurity.a encrypt.o checksum.o

其中,r表示替换归档中的现有文件,c表示创建归档(如果不存在),s表示写入索引。

静态库的命名应遵循lib<库名>.a的规范,这是Unix/Linux系统的标准约定,编译器会根据这个约定查找库文件。

  1. 使用静态库

使用静态库时,需要在编译命令中指定库的路径和名称:

gcc test_code.c -L. -lsecurity -o test_code

-L.选项告诉编译器在当前目录查找库文件
-lsecurity选项告诉编译器链接libsecurity.a库(注意省略了lib前缀和.a后缀)

如果静态库和头文件不在标准目录中,还需要使用-I选项指定头文件路径:

gcc -I/my_headers test_code.c -L/my_libs -lsecurity -o test_code
  1. 头文件共享

头文件(.h)可以通过三种方式共享:

  • 放入标准目录(如 /usr/local/include),用 #include <头文件.h> 引入。
  • 使用完整路径(如 #include "/my_dir/头文件.h")。

截屏2025-09-21 下午12.59

  • 编译时通过 -I 选项指定头文件路径(如 gcc -I/my_dir)。
  1. 静态库的优缺点

静态库的主要优点是生成的可执行文件独立性强,不需要依赖外部库文件,便于分发和部署。缺点是会导致可执行文件体积较大,且如果库有更新,需要重新编译所有使用该库的程序。

创建与使用动态库

  1. 创建动态库

创建动态库也需要先将源代码编译成目标文件,但需要添加-fPIC(Position Independent Code)选项生成位置无关代码:

gcc -I/includes -fPIC -c hfcal.c -o hfcal.o

位置无关代码确保库可以在内存中的任何位置加载,这是动态库工作的必要条件。
然后使用-shared选项将目标文件打包成动态库:

gcc -shared -o libhfcal.so hfcal.o

不同平台下动态库的创建略有差异:

  • 在Linux上:使用-shared选项,生成.so文件
  • 在Windows上:使用-shared选项,生成.dll文件
  • 在macOS上:使用-dynamiclib选项,生成.dylib文件
  1. 使用动态库

使用动态库有两种方式:隐式加载(编译时链接)和显式加载(运行时加载)。

  • 2.1 隐式加载(编译时链接)
    隐式加载方式与使用静态库类似,但在链接阶段不会将库代码嵌入可执行文件中:
gcc -I/includes -c elliptical.c -o elliptical.o
gcc elliptical.o -L/libs -lhfcal -o elliptical

这种方式需要在程序运行前确保系统能够找到动态库。

  • 2.2 显式加载(运行时加载)
    显式加载使用dlopen、dlsym和dlclose等函数在运行时动态加载库并解析符号:
#include <stdio.h>
#include <dlfcn.h>int main() {void *handle;int (*add)(int, int);char *error;// 加载动态库handle = dlopen("./libmath.so", RTLD_LAZY);if (!handle) {fprintf(stderr, "%s\n", dlerror());return 1;}// 获取函数地址add = dlsym(handle, "add");if ((error = dlerror()) != NULL) {fprintf(stderr, "%s\n", error);return 1;}// 调用函数printf("2 + 3 = %d\n", add(2, 3));// 关闭动态库dlclose(handle);return 0;
}

编译时需要链接dl库:

gcc -o main main.c -ldl
  1. 动态库的路径问题
    动态库在运行时需要能被系统找到,不同平台有不同机制:
  • Linux/Unix:使用LD_LIBRARY_PATH环境变量指定库路径:
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
./program
  • Windows:动态库搜索路径包括当前目录和PATH环境变量指定的目录
  • macOS:使用DYLD_LIBRARY_PATH环境变量指定库路径

将动态库安装在标准目录(如/usr/local/lib)可以避免路径问题,但需要管理员权限。

静态库与动态库的比较

  1. 技术对比
    静态库和动态库在多个方面有显著差异:
静态库 动态库
内存使用 每次调用都会在内存中有独立副本 多个程序可共享同一内存副本
磁盘空间 会使可执行文件变大 保持可执行文件较小
更新维护 更新需要重新编译程序 更新只需替换库文件
运行性能 函数调用开销小 有额外的加载和链接开销
兼容性 不存在兼容性问题 可能存在版本兼容问题
  1. 选择建议

根据应用场景选择合适的库类型:

  • 选择静态库的情况:
    需要最大化程序性能时
    不希望依赖外部库文件时
    分发简单小工具时

  • 选择动态库的情况:
    大型项目需要减少内存占用时
    需要频繁更新库代码时
    多个程序共享相同库时

应用场景与最佳实践

  1. 典型应用场景
  • 插件系统:许多应用程序使用动态库实现插件架构,如GIMP、Photoshop等图像处理软件通过插件扩展功能
  • 驱动程序:操作系统通常使用动态库形式提供设备驱动程序,可以在需要时动态加载
  • 跨语言调用:其他语言(如Python、Java)可以通过FFI(Foreign Function Interface)调用C语言编写的动态库,充分利用C语言的性能和生态系统
  • 图形库:OpenGL、DirectX等图形库通常以动态库形式提供,方便多个程序共享和更新
  1. 最佳实践
  • 版本控制:为动态库添加版本信息,避免兼容性问题:
gcc -shared -o libmath.so.1.0 math.o -Wl,-soname,libmath.so.1
ln -sf libmath.so.1.0 libmath.so.1
ln -sf libmath.so.1.0 libmath.so
  • 依赖管理:使用ldd工具查看程序的动态库依赖关系:
ldd program
  • 调试技巧:使用nm工具查看库中的符号:
nm libmath.so
  • 性能优化:缓存动态库中的函数指针,减少重复查找开销

  • 错误处理:在使用dlopen和dlsym时检查错误,确保库和符号正确加载

  1. 跨平台开发建议
    跨平台开发时需要考虑不同系统的差异:
  • 头文件处理:使用条件编译处理平台差异
#ifdef _WIN32#ifdef MYLIB_EXPORTS#define MYLIB_API __declspec(dllexport)#else#define MYLIB_API __declspec(dllimport)#endif
#else#define MYLIB_API
#endifMYLIB_API void my_function();
  • 构建系统:使用CMake、Autotools等跨平台构建工具自动化构建过程

  • 路径分隔符:Windows使用反斜杠\,Unix系统使用正斜杠/

  • 库命名约定:Windows使用.lib(静态库)和.dll(动态库),Unix系统使用.a和.so

总结

静态库和动态库是C语言开发中重要的代码复用和模块化管理工具。静态库在编译时链接到程序中,生成独立的可执行文件,适合小型项目和对性能要求极高的场景。动态库在运行时加载,多个程序可以共享同一库实例,适合大型项目和需要频繁更新的场景。
掌握静态库和动态库的使用是C语言程序员的重要技能。在实际开发中,应根据项目需求、部署环境和维护考虑选择合适的库类型。随着软件规模的增长和模块化需求的提高,动态库的使用越来越广泛,特别是在插件系统和跨语言调用场景中。
未来,随着包管理工具和依赖管理技术的发展,动态库的版本管理和依赖解决将更加自动化,进一步简化开发流程。

《Windows C/C++ 加密解密实战》第三章

核心概念

对称密码算法是指加密和解密使用相同密钥的密码算法,因其运算速度快,常用于大数据量的加密场景。对称算法可分为流加密算法和分组加密算法两大类。

  1. 流加密算法
  • 特点:逐比特/字节加密
  • 典型算法:RC4
  • 优势:实现简单、速度快
  • 劣势:安全性相对较低
  1. 分组加密算法
  • 特点:将明文分成固定长度的组进行加密
  • 工作模式:
    ECB(电子密码本)
    CBC(密码分组链接)
    CFB(密码反馈)
    OFB(输出反馈)
    CTR(计数器)

国密算法SM4

SM4是我国自主设计的商用分组密码算法,采用128位分组长度和128/192/256位密钥长度。
SM4算法特点:
非线性变换层使用S盒
轮函数包含非线性变换和线性变换
32轮迭代结构
加解密算法相同

// SM4加密示例代码
void SM4_Encrypt(unsigned char* plaintext, unsigned char* ciphertext,unsigned char* key) {// 密钥扩展SM4_KeySchedule(key, round_keys);// 32轮加密for(int i=0; i<32; i++) {// 轮函数处理RoundFunction(plaintext, round_keys[i]);}// 最终变换FinalTransformation(plaintext, ciphertext);
}

OpenSSL对称加密实践

OpenSSL提供了统一的EVP接口进行对称加密:

#include <openssl/evp.h>void encrypt_with_openssl() {EVP_CIPHER_CTX *ctx;unsigned char key[16], iv[16];unsigned char plaintext[1024], ciphertext[1024+16];int len, ciphertext_len;// 创建上下文ctx = EVP_CIPHER_CTX_new();// 初始化加密操作EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);// 执行加密EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, strlen(plaintext));ciphertext_len = len;// 结束加密EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);ciphertext_len += len;// 清理EVP_CIPHER_CTX_free(ctx);
}

思维导图:对称密码算法

截屏2025-09-21 下午1.31

《Windows C/C++ 加密解密实战》第五章

Base64编码

  1. 原理
    将每3个字节(24位)转换为4个6位Base64字符
    不足3字节时补0并用"="填充

  2. OpenSSL实现

#include <openssl/bio.h>
#include <openssl/evp.h>void base64_encode(const unsigned char* input, int length) {BIO *bio, *b64;BUF_MEM *bufferPtr;b64 = BIO_new(BIO_f_base64());bio = BIO_new(BIO_s_mem());bio = BIO_push(b64, bio);BIO_write(bio, input, length);BIO_flush(bio);BIO_get_mem_ptr(bio, &bufferPtr);printf("Base64: %.*s", (int)bufferPtr->length, bufferPtr->data);BIO_free_all(bio);
}

PEM文件格式

  1. 特点
    使用ASCII编码存储加密数据
    以"-----BEGIN..."和"-----END..."作为边界
    常用于存储证书和私钥

  2. 生成PEM文件示例

openssl genrsa -out private.key 2048
openssl rsa -in private.key -pubout -out public.key

ASN.1与DER/BER编码

  1. ASN.1基本概念
    抽象语法标记(Abstract Syntax Notation One)
    用于定义数据结构的标准接口描述语言

  2. 编码规则对比
    特性BERDER编码规则基本编码规则可辨别编码规则唯一性不唯一唯一应用场景网络传输数字证书

  3. ASN.1数据结构示例

Certificate ::= SEQUENCE {tbsCertificate TBSCertificate,signatureAlgorithm AlgorithmIdentifier,signature BIT STRING
}TBSCertificate ::= SEQUENCE {version [0] EXPLICIT Version DEFAULT v1,serialNumber CertificateSerialNumber,signature AlgorithmIdentifier,issuer Name,validity Validity,subject Name,subjectPublicKeyInfo SubjectPublicKeyInfo
}

编码转换实践

OpenSSL进行DER/PEM转换

  • PEM转DER
openssl x509 -in cert.pem -outform DER -out cert.der
  • DER转PEM
openssl x509 -inform DER -in cert.der -out cert.pem

思维导图:密码学编码格式

截屏2025-09-21 下午1.32

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存超频最强的千元板!微星B850MPOWER主板评测

内存超频最强的千元板!微星B850MPOWER主板评测Posted on 2025-09-21 13:37 lzhdim 阅读(0) 评论(0) 收藏 举报一、前言:专为内存超频而生的主板 对于新一代AMD锐龙9000处理器而言,超频内存所能带来的游戏帧率提…

window表现驱动开发—视频呈现网络简介

window表现驱动开发—视频呈现网络简介pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

完整教程:第7.9节:awk语言 nextfile 语句

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Docker - Create my own Ubuntu image and run it on Windows

Docker - Create my own Ubuntu image and run it on Windows1. Pull the ubuntu:24.04 image.2. Set shared directory so that I can operate on files in both Windows and the container: 3. Create the Dockerfi…

一类特征方程在数列递推中的应用

以下内容摘自《组合数学》(第五版)P86【例 2-41】。求 \(S_n=1^3+2^3+\cdots+n^3\)。\(\Delta S_n=S_{n+1}-S_n=(n+1)^3\) 是 \(n\) 的 \(3\) 次多项式,因此 \(S_n\) 满足递推关系: \[S_n-5S_{n-1}+10S_{n-2}-10S_…

深入解析:GC 算法的种类及垃圾收集器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

rust跨文件调用代码

cargo new my_testcd my_tescode .目录如下我们假设我们想要开发一个学生管理系统,于是添加模块"student_find" 添加mod.rs student.rs在mod.rs里编写pub mod student; 在student.rs里编写接口体/函数即可…

详细介绍:导师推荐毕设:基于SpringBoot+Vue的中小企业进销存管理系统设计

详细介绍:导师推荐毕设:基于SpringBoot+Vue的中小企业进销存管理系统设计pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

HarmonyOS之UIContext - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

NIO重构UDP收发模块

本文大纲如下:1、写作背景 2、基本的UDP包收发用法 3、采用NIO方式处理UDP一、背景 本篇内容,主要来源是在对公司代码重构。公司一个项目是采用UDP方式通信,在UDP的不可靠基础上,封装成可靠的通信协议。其本质是UD…

深入解析:C语言:猜数字游戏

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:深度学习从入门到精通 - AutoML与神经网络搜索(NAS):自动化模型设计未来

深入解析:深度学习从入门到精通 - AutoML与神经网络搜索(NAS):自动化模型设计未来2025-09-21 12:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; ove…

题解:SP6562 PRUBALL - Esferas

盲猜你们都是从 CSP-S 2025 初赛 来的…… 题目描述 给你 \(n\) 颗蛋和一个 \(m\) 层高的楼,定义蛋的硬度 \(k\) 为:在 \(<k\) 的楼层扔蛋不会碎,在 \(\ge k\) 的楼层扔蛋会碎。求在最坏情况下,最少需要扔多少次…

个人项目-文本查重

软工第二次作业之个人项目——论文查重 项目信息项目信息 详情课程 班级链接作业要求 作业要求项目目标 实现一个论文查重程序,规范软件开发流程,熟悉Github进行源代码管理和学习软件测试GitHub仓库 https://github.…

深入解析:[数据结构] LinkedList

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

US$34 MB ESL Emulator

MB ESL EmulatorTop 4 Reasons To Get MB ESL Emulator1. This device works with Mercedes EIS.2. It emulates both of old (W202, 208, 210) and new (203, 208, 211, 639).3. ESL types functioning.You can use t…

采用python test测试http接口

采用python test测试http接口pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

CF2147 Codeforces Global Round 29 (Div. 1 + Div. 2) 解题报告

A 题挂机半天,B 题挂机半天,D 题脑子犯蠢,3t寄了。省流 A 题挂机半天,B 题挂机半天,D 题脑子犯蠢,3t寄了。9.20 内含剧透,请vp后再来。 赛前 白天刚打完失败的 ccpc 网络赛,不过心态已经调整的非常平和,然后抱…

US$29 Vag R250 VW Audi Dashboard Programmer Free Shipping

R250 VW Audi Dashboard Programmer You can use R250 to program Siemens/VDO new cryptography system Description:This product looks like a small box that needs to be connected to a PC running Win98/Me/XP…

数字图像基础知识

前言 数字图像(Digital Image),又称数码图像或数位图像,以数字形式存储于电子设备中。 有多种方式可以生成数字图像。 一种是物理收集,例如使用数码相机、扫描仪、卫星遥感器、红外/热成像仪、核磁共振 MRI 等设备…