20221403郑骁恒第二周预习报告

20221403郑骁恒第二周预习报告

学习内容

  • 嗨翻C语言第8章

  • 《WindowsC/C++加密解密实战》第3,5章

  • 第三章重点3.4,3.5,特别3.4.4

  • 第五章重点5.3.7

AI对学习内容的总结

总结:

1. 《WindowsC/C++加密解密实战》第三章

第三章主要介绍了对称密码算法,这是一种加密和解密过程使用相同密钥的加密方法。对称算法因其高效性和速度优势,适用于大量数据的加密处理。然而,它也存在密钥分发和管理困难的问题。

3.1 对称算法的基本概念

  • 优点:算法公开、计算量小、加密速度快、效率高。
  • 缺点:随着用户增加,密钥数量呈指数增长,导致密钥分发和保管困难。
  • 常用算法:DES、3DES、AES、SM1、SM4等。

3.4 对称加解密算法的分类

对称算法主要分为流加密算法和分组加密算法。

3.4.1 流加密算法
  • 使用伪随机密钥流与明文进行异或操作实现加密。
  • 优点:硬件实现简单,处理实时,速度快,错误传播有限。
  • 缺点:错误会影响其他比特,软件实现复杂。
3.4.2 分组加密算法
  • 将明文分成固定长度的块,每块独立加密。
  • 优点:可重复使用密钥,软件实现容易,有多种工作模式。
  • 缺点:错误传播,处理速度慢,易受密码分析影响。
3.4.4 RC4算法

RC4算法是一种著名的流加密算法,由Ron Rivest在1987年设计。RC4算法的特点是算法简单、执行速度快,密钥长度可变(1~256字节)。RC4算法的密钥流生成机制保证了每次加密的密钥流都不同,从而提高了安全性。RC4算法在SSL/TLS、WEP协议以及多种应用软件中得到广泛应用。

3.5 OpenSSL中的对称加解密

OpenSSL提供了一套丰富的对称加密函数,支持多种加密算法和工作模式。使用OpenSSL进行对称加密的基本步骤包括:

  1. 初始化加密上下文。
  2. 设置加密算法和密钥。
  3. 执行加密或解密操作。
  4. 清理加密上下文。
    OpenSSL的对称加密功能通过EVP(加密和解密操作的抽象层)接口提供,支持多种加密算法,包括DES、3DES、AES等,以及不同的工作模式,如CBC、ECB等。通过OpenSSL,开发者可以在应用程序中轻松实现加密和解密功能,而无需从头开始实现复杂的加密算法。

实战例子

  • 例3.8:使用OpenSSL进行DES和3DES算法的CBC模式加密和解密,展示了如何使用OpenSSL库进行对称加密的实际操作。

总结来说,第三章为我们提供了对称密码算法的全面概述,包括其定义、分类、特点、应用实例以及如何使用OpenSSL库进行实际的加密解密操作。这些内容对于理解对称加密的理论和实践都是非常有帮助的。
第五章主要讨论了密码学中常见的编码格式,特别是Base64编码和ASN.1(Abstract Syntax Notation One)及其相关编码规则。

2. 《WindowsC/C++加密解密实战》第五章

5.1 Base64编码

Base64编码是一种用64个可打印字符表示二进制数据的编码方法。它将二进制数据每三个字节转换为四个Base64字符,用于在不支持二进制数据的系统(如电子邮件)中传输数据。Base64编码包括一个索引表,由A-Z、a-z、0-9、+、/这64个字符组成。编码过程涉及将输入数据转换为ASCII码,然后将ASCII码转换为二进制,再将二进制数据分组,并根据Base64索引表转换为对应的字符。

5.2 PEM文件

PEM(Privacy Enhanced Mail)文件是一种常见的证书和密钥的存储格式,它是一个文本文件,内容通常经过Base64编码,并在文件的开始和结束添加特定的标记信息。PEM文件的结构包括头部和尾部的标记信息,如“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”,以及中间的实际编码内容。

5.3 ASN.1和编码规则

ASN.1是一种数据描述语言,用于独立于计算机硬件和网络环境的情况下描述数据结构。它与特定的编码规则(如BER、DER、PER等)结合使用,将ASN.1描述的数据类型转换为二进制形式,以便在网络上传输。

5.3.7 ASN.1的文法描述

ASN.1文法描述是ASN.1的核心,它定义了近20种数据类型,包括基本类型(如INTEGER、BOOLEAN、STRING等)和结构类型(如SEQUENCE、SET等)。ASN.1的文法描述具有通用性,可以描述复杂的数据对象,并可以转换为多种编程语言的数据结构。

ASN.1的编码规则包括:

  1. 数据类型标识:每个数据类型都有一个唯一的类型标识(Tag),用于在编码中标识数据类型。
  2. 派生数据类型标识:可以通过显式或隐式派生法创建新的数据类型。
  3. BER(Basic Encoding Rules):ASN.1中最早定义的编码规则,允许编码的八位组流能够被解析。
  4. DER(Distinguished Encoding Rules):BER的子集,用于确保编码结果的唯一性,适用于安全技术的应用系统。

ASN.1和其编码规则在网络通信、电子商务、加密技术等领域有着广泛的应用,因为它们提供了一种独立于平台和语言的方法来描述和编码数据。通过使用ASN.1,可以确保不同系统和网络之间数据的一致性和互操作性。

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

  1. 指针基础

    • 指针的概念:指针是存储变量地址的变量。
    • 指针的声明:如何声明一个指针变量。
    • 指针的初始化:将指针指向一个有效的内存地址。
    • 指针的解引用:通过指针访问它所指向的内存地址中的数据。
  2. 指针和数组

    • 数组的指针表示:数组名本身可以作为指向数组首元素的指针。
    • 指针运算:如何通过指针进行数组元素的访问和遍历。
    • 指针和数组的关系:指针可以用于数组的动态访问。
  3. 指针的指针

    • 多重指针的概念:一个指针指向另一个指针。
    • 应用场景:例如,用于动态分配的二维数组。
  4. 指针和函数

    • 传递指针给函数:通过指针传递数组和数据结构给函数。
    • 函数返回指针:函数可以返回指向动态分配内存的指针。
  5. 指针数组

    • 存储指针的数组:数组中的每个元素都是一个指针。
    • 应用实例:用于存储字符串数组或动态分配的内存块。
  6. 动态内存分配

    • mallocfree函数的使用:如何在C语言中动态地分配和释放内存。
    • 内存泄漏和错误处理:如何避免内存泄漏和其他内存管理错误。
  7. 字符串和指针

    • C语言中的字符串实际上是以null字符(\0)结尾的字符数组。
    • 字符串和字符指针:如何使用指针处理字符串。
  8. 指针的安全性

    • 指针的错误使用:如野指针、内存泄漏和缓冲区溢出。
    • 安全指针编程的实践:如何编写安全的指针代码。
  9. 高级指针操作

    • 指针和结构体:如何使用指针操作复杂的数据结构。
    • 指针的指针:如何处理指向指针的指针,这在处理多维数组时非常有用。

对AI总结的反思与补充

反思:

  1. AI提供的总结是基于假设的,因为它没有直接参考《嗨翻C语言》第八章的实际内容。
  2. AI没有考虑到《嗨翻C语言》可能采用不同的结构或者包含特定的例子和实践。
  3. AI的总结可能没有涵盖到书中特有的教学风格或者特别强调的某些概念。

补充:

  1. 如果《嗨翻C语言》第八章中有特定的示例或者案例研究,那么应该强调这些内容,因为它们对于理解指针的概念至关重要。
  2. 如果书中包含了关于指针的高级主题,如指针与文件操作的结合,或者指针在网络编程中的应用,这些也应当在总结中提及。
  3. 应当补充关于指针在实际编程中常见的错误和最佳实践的讨论,以及如何避免这些错误。
  4. 如果书中提供了关于指针的内存管理和性能优化的讨论,这也是一个重要的补充点。
  5. 还应该考虑书中可能包含的关于指针的练习题和挑战,这些对于读者巩固知识点非常有帮助。

学习思维导图

1. 《WindowsC/C++加密解密实战》第三章

代码:

graph TD
A[对称密码算法]
B[基本概念]
C[算法分类]
D[具体算法]
E[OpenSSL 加解密]

A --> B
A --> C
A --> D
A --> E

B --> B1[同密钥加解密]
B --> B2[速度快]
B --> B3[密钥分发难]

C --> C1[流算法]
C --> C2[分组算法]

D --> D1[DES]
D --> D2[3DES]
D --> D3[AES]
D --> D4[SM4]
D --> D5[RC4]

E --> E1[EVP框架]
E --> E2[初始化]
E --> E3[算法设置]
E --> E4[数据处理]

思维导图
在这里插入图片描述

2. 《WindowsC/C++加密解密实战》第五章

代码:

graph TD
A[密码学编码格式]
A --> B[Base64编码]
A --> C[PEM文件]
A --> D[ASN.1]
A --> E[BER/DER]

B --> B1[解决Email非ASCII字符传输]
B --> B2[64个可打印字符索引表]
B --> B3[每3字节转4Base64字符]
B --> B4[OpenSSL base64命令]
B --> B5[编程实现编解码]

C --> C1[文本文件存储密钥和证书]
C --> C2[包含加密内容和标记]
C --> C3[RSA私钥和证书请求例子]

D --> D1[独立于机器和语言的数据描述]
D --> D2[基本和结构数据类型]
D --> D3[ASN.1编码规则]
D --> D4[解决数据类型和存储差异]
D --> D5[ASN.1文法描述]
D --> D6[ASNIC编译器生成C代码]

E --> E1[BER灵活性和DER唯一性]
E --> E2[CER大数据编码]
E --> E3[PER高速数据传输]

思维导图在这里插入图片描述

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

代码:

graph TD
A[第八章: 指针]
A --> B[指针的重要性]
A --> C[指针的概念]
A --> D[指针的操作]
A --> E[指针的实际应用]

B --> B1[为什么学习指针]
B --> B2[指针在C语言中的地位]

C --> C1[指针的定义]
C --> C2[指针的类型]
C --> C3[指针与数组的关系]

D --> D1[指针的声明]
D --> D2[指针的赋值]
D --> D3[指针的运算]

E --> E1[指针在函数中的应用]
E --> E2[指针与动态内存分配]
E --> E3[指针的注意事项]

思维导图
在这里插入图片描述

基于AI的学习

  • 我在学习C语言指针知识点,请你以苏格拉底的方式对我进行提问,一次一个问题

  • 当然,让我们开始第一个问题:

  • 你能告诉我什么是指针吗?

  • 不知道

  • 没关系,我来解释一下。在C语言中,指针是一个变量,其存储的是另一个变量的内存地址,而不是数据值。通过指针,我们可以直接访问和操作内存中的数据。

  • 现在,我问你第二个问题:

  • 在C语言中,指针变量和普通变量有什么不同?

  • 指针变量涉及内存地址

  • 正确,指针变量存储的是内存地址,而普通变量存储的是具体的数据值。那么,我的下一个问题:

  • 你如何声明一个指针变量?

  • 在定义一个变量时可以使用*符号定义指针变量

  • 没错,使用星号 (*) 来定义指针变量是正确的做法。例如,如果你想要声明一个指向整数的指针,你可以写作 int *ptr;。这里 ptr 就是一个指针变量,它可以用来存储一个整数变量的地址。

  • 接下来,请考虑这个问题:

  • 你能描述一下指针如何存储地址的吗?

  • 不知道

  • 好的,让我来解释一下。当你在C语言中声明一个指针变量时,你实际上为它分配了一块内存,这块内存用来存储另一个变量的地址。例如,如果你有一个整数变量 int num = 10;,并且你声明了一个指向它的指针 int *ptr = #,那么 ptr 存储的不是 num 的值,而是 num 在内存中的地址。这样,通过 ptr,你就可以间接访问和修改 num 的值。

  • 现在,让我们继续:

  • 解释一下“解引用”指针是什么意思?

  • 就是在使用指针变量时通过它的地址引用

  • 是的,你的理解是正确的。解引用指针意味着使用指针变量中存储的地址来访问或修改它所指向的内存位置上的数据。在C语言中,我们使用星号 (*) 操作符来解引用指针。例如,如果 ptr 是一个指向整数的指针,并且它指向 num,那么通过 *ptr 就可以访问 num 的值。

  • 接下来的问题:

  • 指针和数组之间有什么联系?

  • 数组可以使用指针

  • 完全正确。在C语言中,数组名本身可以被用作指向数组第一个元素的指针。这意味着你可以通过数组名来访问数组的元素,也可以使用指针运算来遍历数组。例如,如果有一个数组 int arr[5] = {1, 2, 3, 4, 5};,那么 arr 和 arr[0] 是等价的,因为它们指向数组中的同一个位置。

  • 好的,谢谢你!

  • 不用谢!

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

  • 问题:在学习思维导图时不太会写mermind类型的代码
    解决过程:在kimi的帮助下,我学习了一个Mermind模板并成功绘出流程图。
  • 问题:我在学习的过程中对指针的概念还不是很了解
    解决过程:在kimi的帮助下,我大致学习了指针的相关内容,对指针有了大致的了解。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值