第三周预习报告

密码系统设计

第三周预习报告

学习内容

AI 对学习内容的总结

Head First C 嗨翻 C 语言 - 第4章
章节概述
  • 第四章深入介绍了C语言中的数组和指针。这一章通过一系列有趣且富有创意的例子,帮助读者理解数组和指针的概念及其在实际编程中的应用。书中不仅详细解释了数组和指针的基本操作,还探讨了它们之间的关系,以及如何利用指针来操作数组元素。此外,还涉及了一些高级话题,如多维数组、指针算术、字符串处理等。
重点内容
  • 数组和指针的关系:解释了数组名实际上是一个指向数组第一个元素的指针,以及如何通过指针来访问数组元素。
  • 指针算术:介绍了如何通过指针进行加减运算,以遍历数组或指向不同的数组元素。
  • 多维数组:讨论了二维数组和其他多维数组的声明、初始化和访问方法。
  • 字符串处理:讲解了C语言中字符串的表示方式,以及如何使用指针进行字符串操作,例如字符串复制、拼接等。
  • 动态内存分配:介绍了如何使用malloc、calloc、realloc和free函数动态分配和释放内存。
Windows C/C++加密解密实战 - 第4章
章节概述
  • 第四章主要介绍了杂凑函数(Hash Function)和HMAC(Hash-based Message Authentication Code)。这一章首先概述了杂凑函数的基本概念、发展历史和常见类型,接着详细讲解了SM3杂凑算法的具体实现步骤。此外,还介绍了HMAC的工作原理及其在实际应用中的重要性。最后,讨论了SHA系列杂凑算法的特点和实现方法。
重点内容
  • 4.2 SM3杂凑算法:
    • 常量和函数:定义了SM3算法中使用的常量和函数。
    • 填充:描述了如何对输入数据进行填充,使其长度符合算法要求。
    • 迭代压缩:解释了如何通过迭代压缩过程生成最终的杂凑值。
    • 杂凑值:展示了如何计算最终的32字节杂凑值。
    • 实现:提供了SM3算法的一段式和三段式的实现方法。
  • 4.3 HMAC:
    • 基本概念:介绍了HMAC的基本原理,包括其产生背景、设计目标和算法描述。
    • 实现:演示了如何独立实现HMAC-SM3算法。
  • 4.5 更通用的基于OpenSSL的哈希运算:
    • 获取摘要算法函数:介绍了如何使用EVP_get_digestbyname函数获取指定的摘要算法。
    • 创建和销毁摘要上下文:讲解了如何使用EVP_MD_CTX_create和EVP_MD_CTX_destroy函数创建和销毁摘要上下文。
    • 初始化、更新和结束摘要:详细描述了如何使用EVP_DigestInit_ex、EVP_DigestUpdate和EVP_Digest_Final_ex函数完成哈希运算的各个阶段。
课程 Mindmap
章节概述
  • 课程Mindmap提供了一个可视化的方式来整理和理解本周学习的主要内容。通过Mindmap,可以清晰地看到各个知识点之间的关系和层次结构,有助于巩固记忆和加深理解。
重点内容:
  • 数组和指针:通过节点展示数组和指针的基本概念、操作方法及其相互关系。
    杂凑函数和HMAC:详细列出了杂凑函数和HMAC的关键概念、算法步骤和实现方法。
  • OpenSSL哈希运算:展示了OpenSSL库中与哈希运算相关的函数及其使用方法。
总结
  • 本周的学习内容涵盖了C语言中数组和指针的高级应用,以及密码学中的杂凑函数和HMAC。通过《Head First C 嗨翻 C 语言》的趣味讲解,我深入了解了数组和指针的使用技巧;而在《Windows C/C++加密解密实战》中,我掌握了杂凑函数和HMAC的原理及其在OpenSSL中的实现方法。课程Mindmap则帮助我更好地组织和回顾这些知识点。

对 AI 总结的反思与补充

  • 这次对AI提出了新的要求,以往的对话中AI总是只完成对重点的概述,现在对章节总体也可以进行总结。

学习思维导图

思维导图
((本周学习内容))
  ((Head First C 嗨翻 C 语言 - 第4章))
    ((章节概述))
      深入介绍数组和指针
      有趣且富有创意的例子
      实际编程应用
    ((重点内容))
      ((数组和指针的关系))
        数组名是常量指针
        通过指针访问数组元素
      ((指针算术))
        指针加减运算
        遍历数组
      ((多维数组))
        二维数组
        多维数组的声明和初始化
      ((字符串处理))
        字符串的表示
        字符串操作函数
      ((动态内存分配))
        malloc
        calloc
        realloc
        free

  ((Windows C/C++加密解密实战 - 第4章))
    ((章节概述))
      介绍杂凑函数和HMAC
      基本概念、发展历史和常见类型
      SM3杂凑算法的实现
      HMAC的工作原理
      SHA系列杂凑算法
    ((重点内容))
      ((4.2 SM3杂凑算法))
        ((常量和函数))
          定义常量和函数
        ((填充))
          输入数据的填充
        ((迭代压缩))
          生成最终的杂凑值
        ((杂凑值))
          计算32字节杂凑值
        ((实现))
          一段式实现
          三段式实现
      ((4.3 HMAC))
        ((基本概念))
          产生背景
          设计目标
          算法描述
        ((实现))
          HMAC-SM3算法
      ((4.5 更通用的基于OpenSSL的哈希运算))
        ((获取摘要算法函数))
          EVP_get_digestbyname
        ((创建和销毁摘要上下文))
          EVP_MD_CTX_create
          EVP_MD_CTX_destroy
        ((初始化、更新和结束摘要))
          EVP_DigestInit_ex
          EVP_DigestUpdate
          EVP_Digest_Final_ex

  ((课程 Mindmap))
    ((章节概述))
      可视化整理和理解主要内容
      清晰展示知识点之间的关系和层次结构
      巩固记忆和加深理解
    ((重点内容))
      ((数组和指针))
        基本概念
        操作方法
        相互关系
      ((杂凑函数和HMAC))
        关键概念
        算法步骤
        实现方法
      ((OpenSSL哈希运算))
        函数及其使用方法

在这里插入图片描述

基于 AI 的学习

要求
  • 至少找到自己理解不是太好 2 个概念,让 AI 对自己进行苏格拉底提问

  • 参考下面提示语或者使用 AI Agent

提示词:“我在学习XXX知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”

  1. 核心是要求AI工具:“请你以苏格拉底的方式对我进行提问”

  2. 然后AI工具就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”

  3. 如果你觉得差不多了,可以先问问AI工具:“针对我XXX知识点,我理解了吗?”

  4. AI工具会给出它的判断,如果你也觉得自己想清楚了,可以最后问AI工具:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。

学习内容
知识点1:C语言中的指针和数组的关系
问答

AI:你能告诉我,在C语言中,数组和指针之间有什么关系吗?

: 数组名可以被视为一个指向数组第一个元素的指针。

AI: 非常好!那么,当你声明一个数组时,比如 int arr[5];arr 是什么类型的?

: arr 是一个指向 int 类型的指针,但它是一个常量指针,不能改变它的值。

AI: 很好!那么,你如何通过指针访问数组中的元素呢?

: 可以使用指针算术,例如 *(arr + i) 来访问第 i 个元素。

AI: 完全正确!那么,指针和数组在内存布局上有什么不同吗?

: 数组在内存中是一块连续的空间,而指针只是一个变量,存储的是某个地址。

AI: 很好!那么,你能否举一个例子,说明如何通过指针遍历一个数组?

: 当然可以。假设有一个数组 int arr[5] = {1, 2, 3, 4, 5};,可以通过以下代码遍历它:

int *ptr = arr;
for (int i = 0; i < 5; i++) {
    printf("%d\n", *ptr);
    ptr++;
}

AI: 非常好!那么,你认为在使用指针遍历数组时需要注意哪些问题?

: 需要注意不要超出数组的边界,避免访问无效的内存地址,这可能导致程序崩溃或未定义行为。

AI: 很好!你对这个知识点的理解非常清楚。那么,针对“C语言中的指针和数组的关系”,你理解了吗?

: 是的,我已经理解了。

AI: 非常好!你的回答很全面。总结一下:

  • 数组名可以被视为一个指向数组第一个元素的常量指针。
  • 通过指针算术可以访问数组中的元素。
  • 数组在内存中是一块连续的空间,而指针只是一个存储地址的变量。
  • 通过指针遍历数组时需要注意不要超出数组的边界。
知识点2:SM3杂凑算法的实现
问答

AI: 你能简单介绍一下SM3杂凑算法吗?

: SM3是中国国家密码管理局发布的杂凑算法,用于生成固定长度的杂凑值,通常为32字节。

AI: 很好!那么,SM3算法的实现过程中有哪些关键步骤?

: SM3算法的实现包括以下几个关键步骤:

  1. 填充:将输入数据填充到合适长度。
  2. 迭代压缩:通过多轮迭代压缩生成中间值。
  3. 生成杂凑值:最终生成32字节的杂凑值。

AI: 非常好!那么,你能具体解释一下填充步骤是如何进行的吗?

: 填充步骤是将输入数据扩展到512位的倍数。首先在输入数据末尾添加一个1,然后添加0直到数据长度达到512位的倍数减去64位,最后添加一个64位的长度值。

AI: 很好!那么,迭代压缩过程中,每一轮的压缩是如何进行的?

: 每一轮的压缩涉及多个步骤,包括初始向量的设置、消息扩展、非线性变换等。具体来说,每一轮都会更新中间状态值,直到所有块都处理完毕。

AI: 非常好!那么,你能否举一个简单的例子,说明如何使用OpenSSL实现SM3算法?

: 当然可以。以下是一个使用OpenSSL实现SM3算法的简单示例:

#include <openssl/evp.h>
#include <stdio.h>

void sm3_hash(const unsigned char *data, size_t data_len, unsigned char *hash) {
    EVP_MD_CTX *mdctx;
    const EVP_MD *md;
    unsigned int hash_len;

    md = EVP_sm3();
    mdctx = EVP_MD_CTX_new();
    EVP_DigestInit_ex(mdctx, md, NULL);
    EVP_DigestUpdate(mdctx, data, data_len);
    EVP_DigestFinal_ex(mdctx, hash, &hash_len);
    EVP_MD_CTX_free(mdctx);
}

int main() {
    const char *input = "Hello, World!";
    unsigned char hash[EVP_MAX_MD_SIZE];
    unsigned int hash_len;

    sm3_hash((const unsigned char *)input, strlen(input), hash);

    for (int i = 0; i < 32; i++) {
        printf("%02x", hash[i]);
    }
    printf("\n");

    return 0;
}

AI: 非常好!那么,你认为在实现SM3算法时需要注意哪些问题?

: 需要注意输入数据的填充和长度处理,确保每一轮的压缩正确进行,以及最终生成的杂凑值的正确性和安全性。

AI: 很好!你对这个知识点的理解也非常清楚。那么,针对“SM3杂凑算法的实现”,你理解了吗?

: 是的,我已经理解了。

AI: 非常好!你的回答很全面。总结一下:

  • SM3是中国国家密码管理局发布的杂凑算法,生成32字节的杂凑值。
  • 实现过程包括填充、迭代压缩和生成杂凑值。
  • 填充步骤将输入数据扩展到512位的倍数。
  • 迭代压缩通过多轮非线性变换更新中间状态值。
  • 可以使用OpenSSL库实现SM3算法,确保输入数据的正确处理和杂凑值的生成。

学习实践过程遇到的问题与解决方式(AI 驱动,优先使用AI工具解决问题)

  • 问题1:在使用指针遍历数组时,容易超出数组的边界,导致未定义行为或程序崩溃。
  • 解决方式:检查边界,确保循环中的指针不会超过数组的最后一个元素。
  • 问题2:在实现迭代压缩时,容易忽略某些步骤或错误地实现非线性变换。
  • 解决方式:每一轮的压缩涉及初始向量的设置、消息扩展、非线性变换等;查阅SM3算法的官方文档或标准,确保每一步都正确实现。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值