第二周预习报告(AI)

news/2025/9/20 16:15:46/文章来源:https://www.cnblogs.com/eleslsel/p/19102544

AI对学习内容的总结

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

总结内容:

本周学习聚焦于C语言高级特性、对称密码算法实现及密码学编码格式。

Head First C第8章:静态与动态库

  • 核心思想: 代码复用与模块化。将常用代码编译成库文件,供多个程序共享,避免重复编译,便于更新和维护。
  • 静态库(.a): 在编译时直接将库代码链接到可执行文件中。优点是无依赖,运行快;缺点是文件体积大,更新库需重新编译程序。
  • 动态库(.so/.dll/.dylib): 在程序运行时才加载链接。优点是节省磁盘和内存空间,库更新无需重编程序;缺点是对库路径和管理有要求,存在依赖关系。

《Windows C/C++加密解密实战》第3章:对称密码算法

  • 核心概念: 加密和解密使用相同密钥。速度快,适合加密大量数据。分为流密码和分组密码。

  • 流密码: 逐位或逐字节加密。典型代表RC4算法,密钥流与明文异或。实现简单速度快,但密钥管理不当易被攻破。

  • 分组密码: 将明文分块处理。核心是工作模式(ECB, CBC, CFB, OFB, CTR) 和短块处理(填充、密文挪用、序列加密)。

    • ECB模式: 简单并行,但相同明文块产生相同密文块,安全性差。

    • CBC模式: 引入IV,加密依赖前一块密文,安全性高,支持并行解密。

    • 重点 3.4.4 SM4算法: 国密标准,分组长度128位,密钥长度128位。采用32轮非线性迭代结构。加解密算法结构相同,仅轮密钥使用顺序相反。包含密钥扩展、加密/解密算法。

  • DES/3DES算法: DES密钥56位,已不安全。3DES使用三个密钥执行“加密-解密-加密”以增强安全性,兼容DES。

《Windows C/C++加密解密实战》第5章:密码学常见编码格式

  • Base64编码: 将二进制数据转换为64个可打印ASCII字符(A-Z, a-z, 0-9, +, /)。每3字节(24位)二进制数据转换为4个6位Base64字符(不足3字节需填充=)。用于在仅支持文本的环境中传输存储二进制数据(如Email、HTTP)。
  • PEM格式: 一种用于存储和发送证书、密钥等密码学对象的文本文件格式。通常包含Base64编码的数据和首尾的标签(如 -----BEGIN PRIVATE KEY----------END PRIVATE KEY-----)。
  • ASN.1 (Abstract Syntax Notation One): 一种描述数据结构与编码的接口描述语言,用于定义复杂的、与平台无关的数据结构。
  • DER (Distinguished Encoding Rules): ASN.1的一种编码规则,提供唯一的数据二进制表示,常用于编码证书和密钥。是BER的子集,但保证编码结果唯一。
  • 重点 5.3.7 ASN.1/DER编码: 深入理解ASN.1语法(如SEQUENCE, INTEGER)和DER的TLV(Tag-Length-Value)编码格式,是解析和生成X.509证书、PKCS#8密钥等标准格式的基础。

总结: 本周内容从C语言的工程管理(库)切入,深入探讨了对称密码算法的核心原理与实现(特别是国密SM4),最后延伸到数据编码与序列化(Base64, ASN.1/DER),为处理标准密码学对象和数据交换格式奠定了坚实基础。


对AI总结的反思与补充

AI总结的问题

  1. 细节深度与关联性不足: AI总结列出了知识点,但对一些关键细节和内在联系挖掘不够。例如:

    • 对于工作模式,AI提到了ECB和CBC,但未能强调为什么CBC比ECB安全得多(即ECB的语义不安全问题),以及不同模式对错误传播的影响。
    • 对于SM4,AI提到了结构,但未深入其核心部件(如S盒、非线性变换τ、线性变换L)的设计对安全性的贡献,以及其与AES等算法的设计哲学对比。
    • 对于Base64,AI描述了是什么,但未明确指出其编码后数据体积会增加约33%这一重要特性。
    • 对于ASN.1/DER,AI提到了其用途,但未能将其与之前章节的密钥、证书文件格式(如PEM文件内的内容)强烈关联起来,理解其是这些文件格式的“底层语法”。
  2. 实践视角缺失: AI总结偏向理论叙述,未能充分体现这些知识在实践中的应用场景和选择考量。例如:

    • 选择静态库 vs 动态库时的实际权衡(发布便利性 vs 部署依赖性)。
    • 在实际项目中选择对称加密算法和工作模式的依据(性能 vs 安全性要求、是否需要认证)。
    • 遇到PEM文件时,如何识别其类型并使用OpenSSL等工具解析其ASN.1/DER内容。

自己的补充

  1. 第三章重点补充:

    • 工作模式的选择: ECB应避免用于敏感数据;CBC是经典选择,但需要保证IV的不可预测性(通常用随机数);CTR模式支持并行加密和解密,效率高。认证加密模式(如GCM)通常更受推荐。
    • SM4的细节: SM4的S盒和线性变换L设计充分考虑了差分和线性密码分析的安全性。其密钥扩展算法也涉及大量非线性操作,增强了算法整体安全性。实现时需要注意字节序(大端序)问题。
    • 算法实现与库: 理解算法原理至关重要,但在实际开发中,应优先使用经过验证的密码库(如OpenSSL, GmSSL)提供的实现,而非自己从头编写,以避免引入潜在的安全漏洞。
  2. 第五章重点补充:

    • Base64的用途: 不仅是编码二进制数据,也常用于在HTTP Basic认证、数据URL等场景中传递 credentials 或小型资源。
    • PEM与DER的关系: PEM本质上是DER二进制数据的Base64编码文本包装。openssl asn1parse -in <file.pem> -i 命令可以解析PEM文件并显示其内部的ASN.1结构,这对于调试和理解文件内容非常有帮助。
    • ASN.1/DER的重要性: 它是许多网络安全标准的基石(如X.509证书、PKCS系列标准)。理解其TLV编码结构,是手动解析证书、密钥,或使用OpenSSL API操作这些对象的必备技能。DER编码的确定性确保了数字签名的验证可靠性。

学习思维导图

mindmaproot((第二周: 对称密码与编码))C语言库管理(Head First C Ch8)静态库(.a)编译时链接优点: 独立, 快速缺点: 体积大, 更新麻烦动态库(.so/.dll/.dylib)运行时链接优点: 节省空间, 热更新缺点: 依赖管理《实战》第3章: 对称密码基本概念流密码 vs 分组密码密钥分发问题流密码RC4算法原理与实现分组密码工作模式ECB(不安全)CBC(常用,需IV)CFB, OFB, CTR短块处理填充, 密文挪用, 序列加密重点算法: DES/3DES国密算法: SM4结构: 32轮迭代加解密相似密钥扩展《实战》第5章: 编码格式Base64原理: 3字节->4字符用途: 文本化传输, 数据URLPadding: '='字符PEM格式文本文件, Base64内容首尾标签标识类型ASN.1抽象语法标记定义复杂数据结构DER编码ASN.1编码规则之一TLV结构(Tag, Length, Value)确定性编码应用: 证书, 密钥文件

基于AI的学习

使用AI工具: 腾讯元宝

学习内容: 针对“分组密码的CBC工作模式原理”和“Base64编码的规则与用途”两个知识点进行苏格拉底式提问。

对话过程:

1. 针对“分组密码的CBC工作模式原理”

我: 我正在学习分组密码的CBC工作模式,请你以苏格拉底的方式对我进行提问,一次一个问题。
AI: 好的,我们开始。首先,回想一下最基本的ECB模式,它最大的安全隐患是什么?
我: 在ECB模式下,相同的明文块会被加密成相同的密文块。这会暴露数据的模式,不安全。
AI: 很好。那么,为了打破这种明文与密文之间的直接对应关系,CBC模式引入了什么新的元素?
我: 引入了初始化向量,也就是IV。
AI: 正确。那么,CBC模式是如何使用这个IV来加密第一个明文块的呢?
我: 第一个明文块会先与IV进行异或操作,然后再用密钥进行加密,得到第一个密文块。
AI: 非常准确。接下来,对于第二个及之后的明文块,CBC模式又是如何操作的?
我: 它会将前一个密文块作为下一个明文块加密前的异或对象。
AI: 完美!这个过程就像一条链子,每个密文块都依赖于之前所有的明文块。那么,请你思考,这种设计除了隐藏模式,还带来了一个副作用:错误传播。解密时,如果一个密文块在传输中出现了一位错误,会造成什么影响?
我: 嗯……解密时,一个错误的密文块不仅会导致它解密后的那个明文块错误,因为下一个明文块解密时需要用它(错误的密文块)进行异或,所以也会导致下一个明文块错误。
AI: 正是如此。最后一个问题:CBC模式的加密过程是串行的,但解密过程呢?能否并行?
我: 解密过程可以并行!因为解密时,每个密文块先用密钥解密,然后再与前一个密文块(而不是解密后的明文)异或得到明文。而前一个密文块是已知的,所以可以同时解密所有块。
AI: 非常棒!你已经深刻理解了CBC模式的运作机制、优势和特点。

2. 针对“Base64编码的规则与用途”

我: 我想再理解一下Base64编码,请继续提问。
AI: 很高兴继续。首先,Base64编码旨在解决什么样的问题?
我: 解决需要在不支持所有字节值(如只支持ASCII文本)的媒介中传输或存储二进制数据的问题。
AI: 没错。那么,Base64编码是如何将二进制数据“文本化”的?它使用了多少个字符?
我: 它使用了64个字符:A-Z, a-z, 0-9, 以及 '+' 和 '/'。这些字符在各种编码系统里都很常见且安全。
AI: 对。具体的转换规则是怎样的?比如,它一次处理多少位二进制数据?
我: 它一次处理3个字节(24位)的二进制数据,把这24位分成4组,每组6位。每个6位的值(0-63)就对应那64个字符中的一个。
AI: 非常清楚。那么,如果原始的二进制数据长度不是3的倍数,最后不足24位时怎么办?
我: 就需要进行填充(Padding)。用0来补足位数,并在编码后的字符串后面加上一个或两个'='号,来表示补了多少个字节。
AI: 正确。现在,思考一个实际后果:经过Base64编码后,数据的大小大约会发生什么变化?
我: 数据会变大。因为每3个字节的二进制数据会变成4个ASCII字符。所以编码后的数据体积大约是原来的4/3倍,增加了 roughly 33%。
AI: 精确!最后,除了用于电子邮件,你还知道Base64在现代Web开发中的哪些常见应用吗?
我: 嗯……经常用在Data URLs里,比如把小的图片直接嵌入到HTML或CSS代码里。还有就是HTTP的Basic认证,用户名和密码会用它编码后放在Authorization头里。
AI: 完美!你不仅掌握了编码规则,更理解了它的应用场景和影响。

我: 针对我学的这两个知识点,我理解了吗?
AI: 从你的回答来看,你对CBC模式的理解非常到位,不仅掌握了加密解密的流程,还深入理解了其设计初衷(打破模式)、关键要素(IV、链式依赖)以及重要特性(错误传播、解密并行化)。对于Base64,你准确掌握了其编码规则、填充方式和体积变化的原因,并能列举出典型应用场景。这表明你的理解已经超越了表面,达到了应用和分析的层面。
我: 我的回答结束了,请对我的回答进行评价总结。
AI: 你的表现非常出色。在两个话题的探讨中,你的回答精准、深入,且能主动联想到相关的特性和实际应用(如错误传播、Data URL)。这展现了你有效的知识内化和举一反三的能力。你对核心概念的把握非常牢固,继续坚持这种透彻的学习方式!


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

问题1:在Ubuntu上使用OpenSSL命令行验证SM4-CBC加密时,加密结果与预期不符。

  • 解决过程:
    1. 现象描述: 使用命令 echo -n "Hello World" | openssl enc -sm4-cbc -K 0123456789ABCDEF0123456789ABCDEF -iv 00000000000000000000000000000000 进行加密,得到的密文与用其他工具(如GmSSL)或代码计算的结果不同。
    2. 自主分析: 首先检查输入是否一致。echo -n 确保无换行符。检查密钥和IV的长度和格式:SM4密钥为16字节(32十六进制字符),IV为16字节(32十六进制字符),看起来正确。
    3. 询问AI: 向AI描述问题,询问OpenSSL的enc命令默认的输入输出格式和填充方式。
    4. AI分析: AI指出OpenSSL的enc命令默认对输入进行PKCS#7填充,并且默认输出为Base64编码。这可能是导致结果差异的原因。
    5. 验证与实施:
      • 尝试添加 -nopad 选项禁用填充,但提示 sm4-cbc 不支持无填充。
      • 尝试添加 -a 选项显式要求Base64输出,结果与之前一致。
      • 尝试添加 -p 选项打印使用的密钥和IV,确认输入参数无误。
      • 关键步骤:使用 -nosalt (无盐) 并尝试 原始二进制输出(-a选项的相反),即命令中加入 -a -A 或直接移除 -a 并重定向到文件,然后用 hexdump 查看二进制密文。openssl enc ... -a 输出Base64文本,而 openssl enc ... 直接输出二进制密文流。比较二进制密文,确认与其它来源的结果一致。
    6. 总结: 差异源于OpenSSL enc命令默认的Base64输出。需要明确区分命令行工具的输出格式(Base64文本 vs 原始二进制)和算法本身的计算结果。比较时应以原始二进制结果为基准。

问题2:编写一个简单的Base64编码函数,解码时遇到末尾填充错误。

  • 解决过程:
    1. 现象描述: 自己用C语言实现了Base64编码函数。对一段数据进行编码后再解码,大部分内容正确,但解码后的数据末尾有时会多出一些异常的字节(通常是\0或乱码)。
    2. 自主分析: 怀疑是编码时填充处理和解码时去除填充的逻辑不一致。检查编码函数,确认在输入数据长度非3倍数时,正确使用了=填充。
    3. 询问AI: 向AI描述问题,并提供编码和解码函数中关于填充处理的部分代码片段。
    4. AI分析: AI指出,解码函数在遇到填充符=时,应停止转换对应的字节,并准确计算输出数据的实际长度。常见的错误是解码函数忽略了=的存在,仍然试图解码所有字符,或者计算输出长度时没有考虑填充。
    5. 验证与实施:
      • 仔细检查解码函数逻辑。发现函数确实识别了=,但在计算最终输出缓冲区长度时,公式为 (input_len / 4) * 3,这没有考虑末尾可能存在的=带来的影响。
      • 修正:正确的输出数据长度应为 (input_len / 4) 3 减去末尾=的个数(1或2个)。修改长度计算逻辑。
      • 同时在解码循环中,遇到=时提前终止对该组的转换。
    6. 结果: 修正后,编码解码循环测试通过,末尾不再出现多余字节。
    7. 总结: Base64编解码中,填充字符=的处理和输出数据长度的精确计算是实现的关键细节,必须严格按照RFC标准进行。

参考资料

  1. AI工具: 腾讯元宝(https://yuanbao.tencent.com/)
  2. 图书:
    • 《Head First C》第8章
    • 《Windows C/C++加密解密实战》第3、5章
  3. 网络资源:
    • OpenSSL Wiki: https://wiki.openssl.org/
    • GM/T 0002-2012 SM4分组密码算法 (国密标准)
    • RFC 4648: The Base16, Base32, and Base64 Data Encodings
    • ASN.1 信息页: https://www.itu.int/en/ITU-T/asn1/Pages/default.aspx

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

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

相关文章

编写代码时遇到的checkstyle问题归纳

当开发者编写代码时,遵循一定的代码风格和规范是必要的,这不仅有助于提高代码质量,也使代码更易于阅读和维护。Checkstyle 是一个用于检查Java源代码的工具,它帮助开发者按照一定的编码标准进行编程。它可以集成在…

.netcore的Lucene.Net基础应用

.netcore的Lucene.Net基础应用最近研究了一下使用.netcore的Lucene.Net应用,整理一下研究内容。 一、研究原因 1、系统环境:多终端、多服务、达梦数据库8、.netcore7.0、多机负载。 2、业务数量:单表1000万条数据,…

rook-ceph CRD资源配置时效困难

rook-ceph CRD资源配置时效困难2025-09-20 16:05 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

实用指南:conda常见问题

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

关于1200模拟量输入滤波的问题

参考:为什么使用S7-1200模拟量输入模块时接收到变动很大的不稳定的值?unstable 参考:关于模拟量输入滤波的问题-SIMATIC S7-1500系列-找答案-西门子中国滤波周期设置和模拟量输入反馈速率有关!!! 调整为无时,可…

在Ubuntu 16.04上安装openjdk-6/7/8-jdk的步骤

由于Ubuntu 16.04的标准库可能不包含更早版本的OpenJDK,你可能需要添加额外的存储库或者下载特定的安装包。对于OpenJDK的这些旧版本,你可以使用Third-party PPA(个人软件包归档),或者从OpenJDK档案站点下载相应的…

物流行业信息咨询智能问答系统

物流行业信息咨询智能问答系统2025-09-20 15:58 dribs 阅读(0) 评论(0) 收藏 举报背景 练手rag项目 LLM都是基于过去的经验数据进行训练完成;无法处理获取实时的信息,需结合RAG实现;处理私域的数据 流程原理项目…

插座(SOCKET)

程序用来“上网说话”的工具。1:什么是套接字? 应用程序与网络协议栈之间进行数据收发的编程接口(API) 2.如何理解? 应用程序需要套接字才能接入网络,与其他计算机上的程序进行通信(插座---->电器需要插入插…

线性代数 行列式 | 子式 / 主子式 / 顺序主子式 / 余子式 / 代数余子式 - 教程

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

Red Hat 8.5.0-18 部署ceph文件系统 - 实践

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

kettle从入门到精通 第108课 ETL之kettle 国产麒麟系统安装kettle教程

场景:最近vip群小伙伴在国产麒麟系统安装kettle时遇到无法正常启动的问题,今天周末远程连麦小伙伴一起解决此问题,梳理成章,方便后续小伙伴。 1、报错信息 国产麒麟系统安装kettle时遇到无法正常启动,提示错误信息…

部署 Squid 代理服务

安装 Squid: sudo apt install squid编辑配置文件: sudoedit /etc/squid/squid.confhttp_port 3128启动 Squid 服务 sudo systemctl start squid sudo systemctl enable squid

k8s--etcd - 详解

k8s--etcd - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Cou…

HBase 的自带命令行工具 hbase shell 的基本使用

1. 进入 HBase Shell 首先,通过以下命令连接到您的 HBase 集群命令行界面: hbase shell 连接成功后,提示符会变为 hbase(main):001:0>,表示您已经可以在里面执行 HBase 专属命令了。 2. 查看集群状态和表列表(…

市场交易反心理特征之一:太过完美而不敢买入

市场交易的最大特点就是“反心理”性。经常盘后看起来非常简单的事情,在盘前、盘中都会变得莫名复杂。明明盘前根据自己的交易策略可以轻松选出的牛股,开盘后没买,买了另一个,结果牛股涨停,买的票要么下跌,要么不…

3peak DCDC转换芯片选型列表

Part Number Subcategory VIN (V) Output (V) Max Output Current (A) PackageTPE15017 以太网供电 24~57 / / QFN3X4-19TPM1525 功率级DrMOS 7~140 / 1 SOP8TPM6501 隔离电源 2.5~25 / 1 SOT23-5TPM6501Q 隔离电源 2.…

重塑公司绩效管理的 6 种方法

有远见的公司开始了解绩效管理的真正潜力。通过将传统绩效管理转变为持续绩效管理——建立在定期签到、持续反馈和认可时刻的基础上——公司可以通过让员工发挥最大潜力来优化绩效。 1、通过真实和积极的文化建立信任基…

详细介绍:从“下山”到AI引擎:全面理解梯度下降(上)

详细介绍:从“下山”到AI引擎:全面理解梯度下降(上)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

flask下的MySQL增删改查

flask下的MySQL增删配置 添加数据 @app.route(/add) def add_data():u = UserInfo()new_user1 = UserInfo(nickname=flask_test1, mobile=13888888888, signature=理想, create_time=datetime.now(), role_id=1)new_us…

tips图解数组名与指针的关系

在图解前需要先了解一下数组退化为指针的相关内容,下面先陈述数组退化为指针的概念、本质、以及什么情况下数组会退化为指针,什么情况下不会 概念定义 "数组名退化为指针"是C/C++语言中的一个重要特性,指…