第一周预习作业(AI)

AI对学习内容的总结

使用AI工具: 腾讯元宝 (https://yuanbao.tencent.com/)

总结内容:

教材前两章主要围绕密码学概述和开发环境搭建展开。

第一章:密码学概述

  • 历史与重要性: 以玛丽女王因密码被破译而被处死的历史事件开篇,强调了密码学在历史进程(尤其是军事、政治)中的关键作用,指出其关乎生死存亡。
  • 发展简史: 简述了密码学从艺术到科学的发展阶段,重点提到了Shannon的理论奠基作用以及Diffie和Hellman提出的公钥密码学这一革命性概念。
  • 基本概念:
    • 目标: 解决机密性、可用性、完整性、认证性、不可否认性五大安全问题。
    • 五元组: 定义了明文、密文、密钥、加密算法、解密算法等核心概念。
    • 算法分类: 分为对称加密算法(加解密密钥相同,速度快,密钥分发难)和非对称加密算法(公钥/私钥对,解决密钥分发和不可否认问题,速度慢)。

第二章:搭建C和C++密码开发环境

  • 核心开发库: 重点介绍了OpenSSL和Crypto++两个重要的国际密码库,以及国产密码库GmSSL。
  • OpenSSL详解:
    • 功能: 提供丰富的对称/非对称加密、信息摘要、密钥证书管理功能,以及SSL/TLS协议实现。
    • 设计特点: 采用面向对象思想设计(如BIO抽象I/O接口,EVP统一算法接口),使用C语言实现。
    • 编译实践: 详细说明了在Windows和Linux平台下编译OpenSSL不同版本(1.1.1b, 1.0.2m)、不同架构(32/64位)、不同类型(Debug/Release, 静态库/动态库)的方法与步骤,并提供了验证例程。
  • Crypto++简介: 纯C++编写的密码库,功能全面,代码风格统一。
  • GmSSL简介: 支持国密算法(SM2, SM3, SM4, SM9等)的OpenSSL分支,符合国密规范,适用于国内密码应用开发。文档提供了其在Windows和Linux下的编译安装方法及验证示例。

总结: 第一周内容奠定了密码学的历史和技术基础,并重点指导如何搭建起实际的密码开发环境,为后续的编程实践做好准备。

对AI总结的反思与补充

AI总结的问题

  1. 细节深度不足: AI的总结偏向于大纲和核心概念罗列,对于某些重要细节的强调不够。例如,在第一章中,玛丽女王的故事不仅说明了密码的重要性,更生动地展示了密码分析(破译)的巨大威力(频率分析法)及其现实后果,这是密码学两大分支(编码学和分析学)的直观体现,AI总结对此点的挖掘稍显平淡。
  2. 实践关联性弱化: AI总结将第二章大量关于编译步骤的内容浓缩为“详细说明了……方法与步骤”,未能突出这些繁琐步骤的目的——即为了后续课程中能够实际调用库函数进行密码编程。不同库类型(静态/动态)、不同版本的选择对于实际项目开发有重要影响,AI未能深入关联这种选择背后的考量。
  3. 逻辑结构略显松散: 总结中“第一章……第二章……”的并列结构虽然清晰,但未能更强地体现两章之间的逻辑联系:第一章的理论概念(如算法分类、五元组)正是第二章中那些库(OpenSSL, Crypto++)所具体实现的内容。理论与实践的结合点是第二章的EVP接口等设计。

自己的补充

  1. 第一章补充理解:

    • 密码学角色的演变: 从第一章历史可以看出,密码学从服务于军事、政府等特定领域的“神秘武器”,逐渐演变为保障所有社会成员数字生活安全(如电子商务、个人信息保护)的“公共基础设施”,其重要性和普及性日益增强。
    • 五元组的核心地位: 密码算法(E和D)可以公开,而密钥(K)的保密至关重要(Kerckhoffs原则)。密码系统的安全性应依赖于密钥而非算法的保密。这是理解现代密码学设计的基石。
    • 算法选择: 对称与非对称加密并非互斥,常结合使用。例如,用非对称加密安全分发对称加密的会话密钥,再用该会话密钥高效加密大量数据(即“数字信封”概念)。
  2. 第二章补充理解:

    • OpenSSL与Crypto++的定位: OpenSSL更全面,包含工具和协议,C语言编写,生态广泛;Crypto++是纯粹的C++算法库,面向对象设计。选择取决于项目语言、功能需求和对性能的控制粒度。
    • GmSSL的战略意义: 学习GmSSL不仅是为了掌握另一个库,更是为了适应我国网络安全和密码法律法规的要求,了解并能够应用国家商用密码算法标准,这在未来的项目开发中可能成为必要条件。
    • 编译过程的本质: 编译OpenSSL等库的过程,实际上是将其源代码根据特定平台(Windows/Linux)、编译器(VC/gcc)和配置(如是否启用ASM优化)生成对应的二进制库文件(.lib, .a, .dll, .so)和头文件(.h)的过程。开发应用程序时,需要链接(Linking)这些库文件并包含(Include)这些头文件才能成功调用其中的函数。

学习思维导图

mindmap root((密码系统设计第一周)) 第一章:密码学概述 历史与重要性 玛丽女王案例(密码分析) 战争与情报应用 从艺术到科学 发展简史 阶段划分 标志性事件与人物 基本概念 五大安全目标 核心五元组 对称 vs. 非对称加密 第二章:搭建开发环境 开源密码库 OpenSSL 功能特性 设计思想(BIO, EVP) 平台编译(Win/Linux) Crypto++ 特性简介 GmSSL(国密) 国密算法支持 编译与验证 实践意义 为编程实践奠基 理解库的选择与使用

基于AI的学习

使用AI工具: 腾讯元宝

学习内容: 针对“密码学五元组”和“对称加密与非对称加密的区别与联系”两个知识点进行苏格拉底式提问。

对话过程:

1. 针对“密码学五元组”

我: 我正在学习密码学五元组的概念,请你以苏格拉底的方式对我进行提问,一次一个问题。
AI: 很好。让我们开始。你认为在密码系统中,哪一个是需要被保护的真实信息?
我: 是明文。
AI: 正确。那么,当明文经过一种特殊的变换后,会变成什么形式?
我: 会变成密文。
AI: 很好。现在,请思考,是什么关键信息控制着从明文到密文,以及从密文回到明文的变换过程?
我: 是密钥。
AI: 正是。那么,执行这种变换所遵循的规则或步骤,我们称之为什么?
我: 加密算法和解密算法。
AI: 非常好。最后一个问题:如果解密算法应用后得到的结果,并非原始的明文,这意味着什么?
我: 这意味着要么密钥错了,要么算法用错了,整个加解密过程失败了。
AI: 完全正确。你已经清晰地理解了五元组的各个组成部分及其基本关系。

2. 针对“对称与非对称加密”

我: 我接下来想理解对称加密和非对称加密的区别,请继续用苏格拉底方式提问。
AI: 好的。想象一下,你和朋友约定用一个共同的秘密钥匙来锁上和打开一个盒子。这种加密方式让你想到了哪种类型的加密?
我: 对称加密,因为加解密用的是同一把钥匙(密钥)。
AI: 很好。那么,如果你们俩距离很远,如何安全地把这把共同的钥匙交给对方呢?
我: 这...确实是个问题。当面交肯定不现实。通过邮寄或网络又怕被窃听。这就是对称加密的密钥分发难题。
AI: 正是!那么,能否设想一种方法,让你可以公开地分发一种“锁具”,任何人都可以用这个“锁具”锁上盒子,但只有你本人有唯一的“钥匙”能打开它?
我: 听起来很神奇。像是公开一把锁(公钥),别人用来加密,而我私有的钥匙(私钥)用来解密。这就是非对称加密!
AI: 非常棒!那么,基于这种特性,非对称加密除了解决密钥分发问题,还能用来做什么对称加密不太擅长的事?
我: 嗯...因为只有我才有私钥,所以如果一段密文能用我的公钥解开,说明它一定是用我的私钥加密的,也就证明是我发出的信息!这可以用于数字签名,解决认证和不可否认性。
AI: 完美!你已经抓住了它们最核心的区别和联系。是否可以说,它们常常结合使用,取长补短?
我: 是的!比如用非对称加密来安全传递对称加密的会话密钥。

我: 针对我学的这两个知识点,我理解了吗?
AI: 从你的回答来看,你对密码学五元组的构成非常清晰。对于对称与非对称加密,你不仅准确指出了它们在最核心的密钥使用上的区别,还深入理解了它们各自面临的挑战(如密钥分发)和独特的应用场景(如数字签名),并且理解了它们在实际应用中协同工作的模式。我认为你已经很好地掌握了这两个知识点。
我: 我的回答结束了,请对我的回答进行评价总结。
AI: 你的表现非常出色。在关于五元组的对话中,你能准确无误地识别出每个元素及其角色。在关于加密类型的讨论中,你的思考展现了很好的深度:不仅停留在定义层面,更能联想到实际应用中的问题(密钥分发)和解决方案(非对称加密的应用),并最终上升到对两者互补关系的理解。这表明你不仅记住了概念,更进行了有效的思考和消化。继续保持这种探索精神!

学习实践过程遇到的问题与解决方式

问题1:在Windows上编译OpenSSL 1.1.1b时,执行nmake命令报错,提示找不到ml64.exe或类似汇编器错误。

  • 解决过程:
    1. 询问AI: 向AI描述错误信息,询问可能的原因。
    2. AI分析: AI指出这通常是因为在配置(Configure)时使用了no-asm选项,但系统其实没有安装或正确配置汇编器(如Microsoft的ml.exeml64.exe),或者配置脚本未能正确识别。AI建议确保安装了VC++的MASM组件,或者直接使用no-asm选项避免汇编代码以简化编译。
    3. 验证与实施: 检查本机VC++安装,确认包含了MASM组件。但为了优先完成编译,决定采纳AI最简单的建议:重新运行配置命令,明确加上no-asm参数。例如:perl Configure VC-WIN64A no-asm no-shared ...
    4. 结果: 重新配置后,再次执行nmake,编译顺利通过。虽然可能损失一些汇编优化带来的性能,但作为学习和开发环境完全可接受。

问题2:在Linux(CentOS)上测试GmSSL的SM3命令时,对同一文件my.txt(内容为abc)计算出的哈希值与教材示例或Windows下结果不同。

  • 解决过程:
    1. 自主分析: 首先怀疑是文件内容或编码问题。使用cat -A my.txthexdump -C my.txt检查文件实际内容。
    2. 发现差异: 发现Linux下用vi创建的文件末尾自动带有一个换行符(0x0A),而Windows下用记事本创建的可能没有(或换行符为0x0D 0x0A)。echo "abc" > my.txt命令也会自动追加换行。
    3. 询问AI: 向AI确认SM3的标准测试向量中对字符串"abc"的计算是否包含换行符。
    4. AI确认: AI明确说明,标准测试向量"abc"不包含任何换行符。计算的是三个字节0x61, 0x62, 0x63的哈希值。Linux下文件多出的换行符导致了哈希值不同。
    5. 正确操作: 使用echo -n "abc" > my.txt-n选项抑制换行符)创建文件,或者使用printf "abc" > my.txt。再次运行gmssl sm3 my.txt,得到与标准值一致的结果66c7f0f4...
    6. 总结: 认识到密码运算是极其精确的,输入数据的任何微小差异(甚至一个字节)都会导致结果截然不同。在测试和比较时,必须严格保证输入数据的一致性。

参考资料

AI工具

图书

  • 《Windows C/C++加密解密实战》第1、2章
posted @ 2025-09-14 21:56  20231420  阅读(8)  评论(0)    收藏  举报