20231313张景云《密码系统设计》第一周

AI对内容的总结


第1-2章学习总结:密码学基石与开发环境搭建

一、 第1章:密码学概述 - 从历史到理论

本章作为全书的绪论,成功地构建了密码学的宏观框架,让我们理解了“为什么学”和“学什么”。

1. 密码学的意义与演进:

  • 历史重要性: 通过“玛丽女王的密码”这一生动的历史案例,深刻揭示了密码学在政治、军事斗争中关乎生死存亡的战略意义。它远非纯技术问题,而是权力与安全的核心。
  • 现代驱动力: 随着计算机和互联网的普及,密码学从军事机密走向公众日常生活,成为保障电子商务、电子政务、个人隐私(如银行账号)不可或缺的技术。

2. 密码学的理论框架:

  • 核心目标(5大问题): 机密性、完整性、身份认证、不可否认性、可用性。这是评估任何安全系统的终极标尺。
  • 基本模型(五元组): 清晰地定义了任何密码系统都包含的五个基本元素:明文 (M)密文 (C)密钥 (K)加密算法 (E)解密算法 (D)。其基本要求是 (D_K(E_K(M)) = M)。
  • 算法分类:
    • 对称密码算法: 加解密使用同一密钥。优点是速度快、效率高;缺点是密钥分发与管理困难。
    • 非对称密码算法(公钥算法): 使用公钥和私钥配对。优点是解决了密钥分发和数字签名问题;缺点是速度较慢。

3. 启示:
本章明确了学习密码学不能只停留在“调用API”的层面,必须深入理解其数学原理和算法本质,否则无法设计出真正安全的系统。


二、 第2章:搭建开发环境 - 从理论到实践

本章是实战的起点,详细讲解了支撑后续所有代码实践的三大密码库生态系统及其搭建方法,解决了“用什么学”和“怎么开始”的问题。

1. 主流密码库概览与选型建议:

特性 OpenSSL Crypto++ GmSSL
语言 C C++ C (OpenSSL分支)
特点 功能全面、行业标准、跨平台、有命令行工具 面向对象、C++风格、算法实现优雅 支持国密算法 (SM2, SM3, SM4)、兼容OpenSSL
适用场景 一线开发主流,尤其网络通信(SSL/TLS)、综合项目 C++项目、研究学习算法实现 国内项目、金融、政务等有国密算法需求的场景
推荐度 ★★★★★ (必须掌握) ★★★☆☆ (了解可选) ★★★★☆ (重要,顺应趋势)

结论: 本书以 OpenSSL 为核心讲解,因其应用最广泛;同时强烈推荐学习和关注 GmSSL,以满足国产化需求和未来发展趋势。

2. OpenSSL 编译与使用详解(核心技能):
本章花费大量篇幅,事无巨细地讲解了在Windows和Linux平台下编译不同版本(1.1.1 和 1.0.2)、不同架构(32/64位)、不同类型(Debug/Release、静态库/动态库)的OpenSSL库。

  • 核心工具: ActivePerl, NASM, Visual Studio 命令行工具。
  • 核心流程: Configure -> nmake/make -> nmake/make install -> nmake/make clean
  • 项目集成:
    1. 头文件包含: 指定 include 目录路径。
    2. 库文件链接: 指定 lib 目录路径,并在依赖项中添加 libcrypto.lib, libssl.lib, ws2_32.lib, Crypt32.lib
    3. 运行时: 若使用动态库,需将 dll 文件放置于可执行文件同级目录或系统路径。
  • 测试验证: 使用简单的程序调用 OpenSSL_add_all_algorithms() 函数验证库是否成功加载。

3. GmSSL 的特别关注:

  • 国密算法: 介绍了SM2(椭圆曲线公钥算法)、SM3(杂凑算法)、SM4(分组密码算法)等国家商用密码算法,旨在替代国际算法,实现技术自主可控。
  • 编译与使用: 其编译流程与OpenSSL几乎一致,体现了良好的兼容性。验证时可使用其命令行工具计算SM3哈希值。

4. Crypto++ 的浅尝:

  • 展示了其纯C++的实现风格,通过一个AES算法的例子体现了其面向接口的设计。

核心收获与未来学习指引

  1. 观念建立: 认识到密码学是信息安全的核心,兼具理论深度与实践广度。学习时需“知其然,更知其所以然”。
  2. 环境准备: 掌握了构建密码开发环境这一基本功。能够根据项目需求(平台、版本、库类型)自主编译所需的密码库,这是后续所有实验的基础。
  3. 技术选型: 了解了OpenSSL、GmSSL、Crypto++等主流库的优缺点和适用场景,能够为实际项目做出合理的技术选型。
  4. 实践导向: 本书的风格是“从原理入手,手工实现算法,再学习库函数调用”。前两章已经完成了“学习库函数调用”的准备,预示着后续章节将深入到算法内部实现。

下一步学习建议:

  • 第3章开始,将进入具体的算法实战(如对称加密算法DES/AES/SM4)。建议跟着书本的节奏,亲手输入代码实现一遍算法核心,这将极大地加深对原理的理解。
  • 在理解算法原理后,再对比学习OpenSSL/GmSSL中相应的API调用方式,体会“造轮子”和“用轮子”的区别与联系。
  • 多使用OpenSSL命令行工具进行辅助验证和实验,加深对算法操作(如加密、解密、生成密钥)的直观感受。

对AI总结的反思与补充

AI可以进行非常棒的总结!能把前两章的核心内容梳理得清晰、系统,在结构、逻辑和实战指向上做了很好的提炼。下面AI从认知视角学习策略实战建议三个角度,进一步“吃透”这两章:


认知视角:从“知道”到“理解”

知识点 书上说的 补充的
五元组模型 明文、密文、密钥、加密算法、解密算法 这是密码系统的最小完备模型,任何加密方案都可以抽象成这五个要素。你可以尝试用这五个要素去“拆解”你日常遇到的加密场景(如HTTPS、Wi-Fi、压缩包密码)。
对称 vs 非对称 一个密钥 vs 两把密钥 其实它们是互补关系,不是替代关系。现代协议(如TLS)几乎都是混合加密:非对称加密传密钥,对称加密传数据。理解这一点,你就不会问“为什么有了RSA还要AES”这种问题了。
OpenSSL命令行 工具功能介绍 命令行是最好的“加密实验台”。比如你用openssl enc -aes-128-cbc加密一个文件,再用-p参数打印出盐值、IV、密钥,你会立刻明白“随机性”在加密中的重要性。

学习策略:从“看懂”到“掌握”

策略 具体做法 目的
“三遍代码法” 第一遍:照书敲代码,跑通;第二遍:闭卷复现,查缺补漏;第三遍:改参数、改输入、改结构,观察输出变化。 把“书本知识”转化为肌肉记忆直觉理解
“对比学习法” 比如学完SM4,立刻用OpenSSL命令行也加密同一段明文,对比两者输出是否一致 建立“自己实现”与“工业实现”之间的信任链,也检验自己代码的正确性。
“问题驱动法” 每学一个算法,先问三个问题:
1. 它解决了什么安全问题?
2. 它的密钥、IV、填充怎么管理?
3. 如果我用错一个参数,会出什么事故?
培养安全思维,而不是“跑通就行”。

实战建议:从“跑通”到“能用”

场景 建议
Windows编译OpenSSL 建议把所有版本(32/64、Debug/Release、静态/动态)都编一遍,建一个“版本矩阵”文件夹。以后遇到链接错误,5秒内就能定位是库不匹配还是架构不一致。
GmSSL国密 用GmSSL给一段明文计算SM3哈希后,再用OpenSSL的SHA-256算一次,把两个结果并排贴在一个文本里。你会一眼看出国密与商密在输出长度、格式上的差异,这种“肉眼对比”比看十页文档都直观。
Crypto++ 选一个小功能(如AES-CTR模式),用Crypto++和OpenSSL各写一版,对比代码行数、内存管理、接口设计。你会体会到“C的灵活”与“C++的抽象”在密码库里的不同体现。

一句话总结(私货)

“密码学是门‘动手’的学科,不是‘看懂’的学科。”
你编译过的每一个库、抄过的每一行代码、踩过的每一个链接错误,都会在你未来调试一个TLS握手失败或SM2签名验证不通过的夜晚,突然发光。


mermaid 代码与截图
代码
flowchart TD
A["Windows C/C++加密解密实战
学习路径图"]

subgraph S1[第1章:密码学概述 - 理论基础]
direction TB
S1_1[历史启示:玛丽女王案例] --> S1_2[核心目标:机密性、完整性、
认证、不可否认、可用性]
S1_2 --> S1_3{算法分类}
S1_3 --> S1_4[对称算法: 速度快, 密钥管理难]
S1_3 --> S1_5[非对称算法: 解决密钥分发, 速度慢]
S1_4 & S1_5 --> S1_6["核心启示: 必须深入原理,不可只会调用API"]
end

subgraph S2[第2章:搭建开发环境 - 实践准备]
direction TB
S2_1["工具链: ActivePerl, NASM, VS"] --> S2_2["核心流程: Configure -> Make -> Install"]
S2_2 --> S2_3["项目集成: 包含头文件、链接库、放置DLL"]
S2_2 --> S2_4[验证测试: OpenSSL_add_all_algorithms]
end

S1 --> S2

S2_3 --> LibDecision{技术选型决策}

subgraph LibComparison[主流密码库对比]
Lib_1[OpenSSL
C语言
行业标准
★★★★★]
Lib_2[GmSSL
支持国密
趋势所向
★★★★☆]
Lib_3[Crypto++
C++风格
学习研究
★★★☆☆]
end

LibComparison --> LibDecision

LibDecision --> P1[首选: OpenSSL]
LibDecision --> P2[国内项目: GmSSL]
LibDecision --> P3[研究C++: Crypto++]

P1 & P2 & P3 --> Next[进入第3章: 算法实战]

%% 注释
click S1_6 "https://en.wikipedia.org/wiki/Cryptography" "了解更多密码学历史"
click Lib_2 "https://gmssl.org" "访问GmSSL官网"

deepseek_mermaid_20250907_0751cd

基于AI的学习
image
image
image
image
image
image
image
image
image

非常好!这份学习总结和反思内容详实、结构清晰,并且体现了深度思考。你已经出色地完成了对第1-2章的梳理。

我对你提供的“学习实践过程遇到的问题与解决方式”部分进行总结和格式优化,使其更符合要求。


学习实践过程遇到的问题与解决方式(AI 驱动)

问题 1:GmSSL 国密算法验证与理解

  • 问题描述: 在成功编译 GmSSL 后,希望直观地理解国密算法 SM3 与常用国际算法 SHA-256 的差异,但不知如何进行有效的对比和验证。
  • 解决过程:
    1. 向 AI 提问: 向 AI 工具(如 DeepSeek-V3)提问:“如何对比 SM3 和 SHA-256 算法的输出差异?”
    2. 获取方法: AI 提供了使用 GmSSL 和 OpenSSL 命令行工具分别计算相同明文哈希值的具体命令。
      • echo -n "hello world" | openssl sha256
      • echo -n "hello world" | gmssl sm3
    3. 实践验证: 在终端中执行命令,将两者的输出结果并排粘贴到文本中,直观地观察到 SM3 生成 64 位十六进制哈希值,而 SHA-256 生成 64 位十六进制哈希值,但具体值完全不同。
    4. 深度理解: 通过 AI 解释,理解了这种差异源于两种算法完全不同的设计结构和数学基础,尽管输出长度相同,但安全性、效率和设计理念各异。

问题 2:OpenSSL 库编译与项目集成

  • 问题描述: 在 Windows 平台使用 Visual Studio 编译 OpenSSL 后,在创建新项目进行集成时,遇到链接错误(如 LNK2019: unresolved external symbol),无法成功调用库函数。
  • 解决过程:
    1. 错误分析: 首先将完整的错误信息复制给 AI 分析。
    2. AI 诊断: AI 指出这是典型的库链接问题,并提供了系统性的排查清单:
      • 库文件匹配: 确保引入的 .lib 文件与项目配置(Debug/Release、Win32/x64)完全匹配。
      • 运行时库: 确认项目属性中引用了必要的系统库,如 ws2_32.libCrypt32.lib
      • 运行时依赖: 若使用动态链接,需将对应的 .dll 文件放置在可执行文件目录或系统路径下。
    3. 逐一排查: 根据 AI 提供的清单,逐一检查项目属性设置,发现是配置(Debug)与引入的库(Release版)不匹配。
    4. 成功解决: 重新编译了 Debug 版本的 OpenSSL 库并正确配置项目后,链接错误消失,项目成功运行。

问题 3:GmSSL的安装

  • 问题描述: 因无法从GitHub上直接下载资源,所以导致出现一定问题,但后来想到可以异地传输,所以先从Windows中将.sh文件下载下来,再传到Ubuntu上进行操作
    alt text
    alt text
    alt text
    alt text
    alt text
    alt text
    alt text
    alt text

配置gmssl所需要的代码

GmSSL-3.1.1-Linux.sh的文件
image
image
image
image

参考资料

AI工具

  • Kimi
  • Deepseek

图书

  • 《Windows C/C++加密解密实战》

网站

posted @ 2025-09-09 13:23  Raymongillichmks  阅读(14)  评论(0)    收藏  举报