20231326王荣盛《密码系统设计》第二周预习报告

20231326王荣盛《密码系统设计》第二周预习报告

目录

  • 20231326王荣盛《密码系统设计》第二周预习报告
    • 学习内容
      • [《Windows C/C++ 加密解密实战》第3章](#《Windows C/C++ 加密解密实战》第3章)
      • [《Windows C/C++ 加密解密实战》第5章](#《Windows C/C++ 加密解密实战》第5章)
      • 《嗨翻C语言》第8章
    • [AI 对学习内容的总结](#AI 对学习内容的总结)
      • [1. 理论绝对安全的密码](#1. 理论绝对安全的密码)
      • [2. 对称加密算法](#2. 对称加密算法)
      • [3. 分类](#3. 分类)
      • [4. RC4](#4. RC4)
      • [5. 分组密码工作模式](#5. 分组密码工作模式)
      • [6. DES / 3DES](#6. DES / 3DES)
      • [7. SM4](#7. SM4)
      • [8. OpenSSL对称加解密](#8. OpenSSL对称加解密)
      • [1. Base64](#1. Base64)
      • [2. PEM文件](#2. PEM文件)
      • [3. ASN.1(抽象语法记法)](#3. ASN.1(抽象语法记法))
      • [1. include](#1. include)
      • [2. 静态库(.a / .lib)](#2. 静态库(.a / .lib))
      • [3. 动态库(.so / .dll / .dylib)](#3. 动态库(.so / .dll / .dylib))
    • [对 AI 总结的反思与补充](#对 AI 总结的反思与补充)
    • 学习思维导图
    • [基于 AI 的学习](#基于 AI 的学习)
    • 学习实践过程遇到的问题与解决方式
    • 参考资料

学习内容

《Windows C/C++ 加密解密实战》第3章

  • 理论绝对安全的密码:一次一密
  • 对称算法:加密和解密使用相同密钥的密码算法
    • 优点:
      • 算法公开
      • 计算量小
      • 加密速度快
      • 加密效率高
    • 缺点:
      • 产生密钥过多
      • 密钥分发困难
    • 常用算法:
      • DES 3DES TDEA Blowfish RC2 RC4 RC5 IDEA SKIPJACK AES SM1 SM4
  • 对称算法的分类
    • 序列加解密算法(流)
      • 使用伪随机数据流作为密钥
      • 明文与密钥按位计算(通常为XOR)
      • 密钥长度等于明文长度
      • 关键技术:密钥流生成器
      • 优点:
        • 以bit或Byte为单位,符合硬件实现
        • 密钥产生独立于信息流
        • 很难受到密码分析影响
        • 数据处理实时
        • 低错误传播
      • 缺点:
        • 不太适用于软件
        • 低扩散、插入、删除敏感性
        • 某比特发生错误会影响其他比特
    • 分组加解密算法(块)
      • 优点:
        • 可重复使用密钥
        • 某些工作模式下出错不会影响剩余的块
        • 易移植,成本低,用于软件
        • 更广泛使用
        • 多工作模式
        • 易于标准化
        • 扩散性好,插入敏感
      • 缺点:
        • 相同明文产生相同密文
        • 处理速度较慢
        • 易受密码分析影响
        • 存在错误传播
  • RC4算法
    • Ron Rivest 设计于1987
    • 特点
      • 算法简洁
      • 面向字节
      • 加密速度快
      • 安全性比较高
      • 密钥长度可变,一般256字节
    • 原理
      1. 初始化S盒
      2. 使用密钥调度算法KSA打乱S盒
      3. 伪随机生成算法PRGA
      4. 加密/解密
    • 用途
      • SSL/TLS
      • IEEE 802.11
      • Oracle secure SQL
      • ......
    • 实现
      • ......
  • 分组加密算法
    • 工作模式
      • ECB 电子密码本
      • CBC 密码分组链接
      • CFB 加密反馈
      • OFB 输出反馈
      • CTR 计算器
    • 短块加密
      • 填充技术
      • 密文挪用技术
      • 序列加密
  • DES算法和3DES算法
    • DES
      • 分组大小:64b
      • 工作密钥长度:56b
      • 用户密钥长度:64b
      • 密钥校验位:8 16 24 32 40 48 56 64
      • 56b密钥不再安全
    • 3DES
      • 使用3条56b密钥进行加解密
      • 加密过程使用"加密-解密-加密"
      • 当三条密钥相同时,结果与DES一次加密相同
  • SM4分组密码算法
    • 分组长度:128b
    • 密钥长度:128b
    • 32轮非线性迭代结构
    • 以字(32b)为单位加密
    • 原理
      • 密钥扩展
      • 轮函数
      • 加密算法
      • 解密算法
  • 使用OpenSSL进行对称加解密
    • 对称加密相关函数
      • 上下文初始化函数
      • 加密初始化函数
      • 加密update函数
      • 加密结束函数
      • 解密初始化函数
      • 解密update函数
      • 解密结束函数
    • 对称加密示例

《Windows C/C++ 加密解密实战》第5章

  • Base64编码
    • 基于64个可打印字符来表示二进制数据的表示方法
    • 转化原理:
      • ASCII字符串 --> 二进制拼接
      • 二进制串以6位为单位划分,每组前补两位0
      • 8位二进制数据 --> Base64对应字符
    • 使用OpenSSL命令行进行Base64编码
    • 编程实现
  • PEM文件
    • Privacy Enhanced Mail
    • 常见密钥、证书存储信息文件。
    • PEM标准基本流程
      • 将信息转换为ASCII或Base64等其他编码
      • 使用对称算法加密邮件
      • 使用Base64对加密后的信息编码
      • 使用信息头对信息封装
      • 加入标注信息
    • OpenSSL生成PEM私钥
  • ASN.1
    • ISO/ITU-T标准
    • 描述对数据进行表示编码传输和解码的数据格式
    • 优点
      • 独立于机器
      • 独立于程序语言
      • 独立于应用程序内部表示,统一方式表达数据结构
    • 文法描述
      • 基本类型(原子类型)
        Boolean, Integer, Bit String, Octet String, NULL, Object Identifier, Printable String, Astring, Numeric String, BMP String, Enumerated, UTC Time, Generalized Time, Any.
      • 结构类型(复合类型)
        SEQUENCE, SET, SEQUENCE OF, SET OF, CHOICE.
    • 编码规则
      • 数据类型标识
        • 通用类
        • 应用类
        • 私有类
        • 上下文说明类
      • 派生数据类型标识
        • 显式派生法

          \[Class\]Number\]Explicit

          \[Class\]Number\]Implicit

        • 语法格式:<Tag, Length, value>
        • 大端编码
      • 规范编码规则CER
      • 唯一编码规则DER
        • BER的子集
      • 压缩编码规则PER
      • XML编码规则XER
    • 示例

《嗨翻C语言》第8章

  • 值得信赖的代码
    • encrypt
    • checksum
  • include
    • <> 引用标准头文件
    • "" 引用本地头文件
    • 标准头文件目录
      • /usr/include/usr/local/include
      • ${MinGW PATH}\include
    • 共享头文件
      1. 将头文件复制到标准头文件目录
      2. 引用完整路径
      3. GCC编译器参数-I传入
  • 静态库/存档
    • ar存档命令
      ar -rcs libhfsecurity.a encrypt.o checksum.o
    • 标准库目录
      • /usr/local/lib
    • 引用库
      gcc test_code.c -lhfsecurity -o test_code
      gcc test_code.c -L/my_lib -lhfsecurity -o test_code
  • 动态库
    • 创建目标文件
      gcc -I/includes -fPIC -c hfcal.c -o hfcal.o
      -fPIC表示创建位置无关代码
      • 无论被加载到存储器哪个位置都可以运行的代码
    • 动态库文件
      • *.so 共享目标文件
      • *.dll 动态链接库
      • *.dylib 动态库

AI 对学习内容的总结

1. 理论绝对安全的密码

  • 一次一密(OTP):明文长度 = 密钥长度,且密钥完全随机,仅使用一次 → 理论上无法破解。
  • 问题:密钥分发困难,实际不可大规模应用。

2. 对称加密算法

  • 定义:加密和解密使用相同的密钥。
  • 优缺点
    • 优点:算法成熟、运算高效、速度快。
    • 缺点:密钥分发困难、数量庞大(n用户需要 n(n-1)/2 个密钥)。
  • 典型算法:DES、3DES、Blowfish、RC 系列、AES、SM1/SM4。

3. 分类

  • 流密码
    • 以 bit/byte 为单位逐位加密(XOR)。
    • 优点:实时性强,错误传播小,硬件实现友好。
    • 缺点:扩散性差,插入/删除敏感,不适合软件。
    • 典型算法:RC4。
  • 分组密码
    • 按块(通常 64/128 位)加密。
    • 优点:易于标准化、广泛应用、可多种模式。
    • 缺点:相同输入产生相同输出,存在错误传播,速度比流密码慢。

4. RC4

  • 由 Ron Rivest 设计(1987)。
  • 过程
    1. 初始化 S 盒。
    2. KSA(Key Scheduling Algorithm)打乱 S 盒。
    3. PRGA(Pseudo-Random Generation Algorithm)生成密钥流。
    4. XOR 明文/密文。
  • 应用:早期 SSL/TLS、WEP/WPA、Oracle Secure SQL。
  • 问题:已被破解,现代安全通信已不推荐使用。

5. 分组密码工作模式

  • ECB:同块 → 同密文,易泄露模式。
  • CBC:前一密文作为下一块输入,安全性好,但串行。
  • CFB/OFB:将分组转为流加密,适合实时。
  • CTR:计数器模式,高并行度。
  • 短块问题:填充(PKCS#7 等)、密文挪用、流加密方式。

6. DES / 3DES

  • DES:64b 分组,56b 有效密钥。如今已不安全。
  • 3DES:EDE(加密-解密-加密),增加安全性,但性能差。已被逐渐淘汰。

7. SM4

  • 中国标准对称分组密码。
  • 分组长度 128b,密钥长度 128b,32 轮迭代。
  • 用于 商用密码标准、金融 IC 卡、无线局域网

8. OpenSSL对称加解密

  • 主要函数族EVP_CIPHER_CTX_new/init/update/final/free
  • 支持多种对称算法(AES、DES、SM4 等)。
  • 流程:初始化上下文 → 设置算法与密钥 → update(分块处理)→ final(收尾)。

1. Base64

  • 用 64 个字符 [A-Z][a-z][0-9]+/ 表示二进制。
  • 原理:3 字节(24 位) → 4 个 6 位 → Base64 字符。
  • 用途:在文本环境传输二进制(邮件、证书、URL)。
  • 补充 :有 URL Safe Base64(把 + / 换成 - _)。

2. PEM文件

  • Privacy Enhanced Mail,常用作密钥/证书的容器。
  • 特点
    • Base64 编码(二进制转文本)。
    • 头尾有 -----BEGIN ...----------END ...-----
    • 可包含密钥、公钥、证书、CSR。
  • 应用:SSL/TLS 证书存储。
  • OpenSSL:生成私钥、公钥、证书时都会输出 PEM 文件。

3. ASN.1(抽象语法记法)

  • 作用:跨平台、跨语言的数据表示标准。
  • 类型
    • 基本类型:整数、字符串、时间等。
    • 结构类型:SEQUENCE、SET、CHOICE。
  • 编码规则
    • BER:基本规则,不唯一。
    • DER:BER 的严格子集,唯一,常用于 X.509 证书。
    • CER/PER/XER:针对特定场景(压缩/XML 等)。
  • 格式<Tag, Length, Value>,大端表示。
  • 补充:X.509 证书内部就是 ASN.1 + DER 编码。

1. include

  • 尖括号 < >:从系统标准目录查找。
  • 双引号 " ":先从当前目录查找,再到系统目录。
  • 常见目录/usr/include, /usr/local/include, MinGW/include
  • 自定义路径-I/path/to/include

2. 静态库(.a / .lib)

  • 制作
    • ar -rcs libxxx.a file1.o file2.o
  • 链接
    • gcc main.c -L/my_lib -lxxx -o main
  • 特点:编译时链接,运行时无需库文件,但生成程序体积大。

3. 动态库(.so / .dll / .dylib)

  • 制作
    • gcc -fPIC -c file.c -o file.o
    • gcc -shared -o libxxx.so file.o
  • 特点
    • 编译时不打包,运行时加载。
    • 体积小,可升级维护。
  • 跨平台扩展名 :Linux .so,Windows .dll,macOS .dylib

对 AI 总结的反思与补充

AI总结对我的补充

  1. AI总结在 应用背景局限性安全现状 上做了扩展。
    • RC4 已被淘汰3DES 逐步废弃AES/SM4 是现代主流
  2. 分组模式 ,可以再联系实际场景:
    • ECB:适合加密小块数据(密钥/随机数),但不安全。
    • CBC:常用于文件加密。
    • CTR:常用于网络传输(高并行)。
  3. ASN.1/DER/PEM ,建议你画个层级图:
    • ASN.1(语法) → DER(编码规则) → PEM(Base64 封装 + 头尾标记)。
  4. C语言库管理 部分,可以结合 Linux 系统路径 /etc/ld.so.conf, LD_LIBRARY_PATH,这样跟你前面问的动态库问题能衔接起来。

总体反思

  1. 我的总结更贴近 教材原话 ,AI 的总结更偏向 应用与扩展 。 我以后做学习笔记时,要在"教材知识点"后,加一栏"应用背景/现实安全性/优缺点"。
  2. AI 的补充有助于 联系实际场景 (比如算法现状、证书结构、库的跨平台特性),而我之前的总结偏"死记硬背"。 在复习时要多问自己"这个知识点现在还有什么用?在工程里怎么应用?"。
  3. AI 的总结让我意识到,我的笔记在 图示/层级关系 上不够直观。 改进方法:后面复盘时多画"架构图/流程图",比如对称加密分类图、ASN.1 编码体系图。

学习思维导图

mindmap root((学习内容)) ("《Windows C/C++ 加密解密实战》第3章") 一次一密 对称算法 优缺点 常用算法 分类:流 & 块 RC4算法 特点与原理 应用 分组加密工作模式 ECB CBC CFB OFB CTR DES / 3DES SM4算法 OpenSSL对称加密API ("《Windows C/C++ 加密解密实战》第5章") Base64编码 PEM文件 ASN.1 类型 编码规则 ("《嗨翻C语言》第8章") 值得信赖的代码 include头文件 静态库 动态库

基于 AI 的学习


Dialog_week2.md

本文件记录Gisli在学习对称算法、非对称算法和GCC编译、静态库创建的苏格拉底式问答对话。ChatGPT原始链接


对话

13:50:00 Gisli: 我在学习对称算法、非对称算法和gcc编译、ar创建存档(库)的知识点,请你设置不同场景,以苏格拉底的方式对我进行提问,一次一个问题

13:50:10 ChatGPT: 好的,Gisli,咱们就用苏格拉底式问答来锻炼你的思维。我会先提出一个问题,然后根据你的回答继续深入。

场景一------对称与非对称加密

假设你想发送一条非常重要的消息给你的朋友,你们约定使用加密方式保证消息安全。你有两种选择:一种是用同一把密钥加密和解密消息(对称算法),另一种是用一对密钥:公钥加密、私钥解密(非对称算法)。

问题1:

如果你们双方都能安全地传递这把密钥,你会选择哪种方式?为什么?

13:51:00 Gisli: 我会选择对称算法。对称算法的密钥要在安全信道传输。在保证密钥安全的前提之下,我优先选择对称算法。因为对称算法相对于非对称算法,其加密速度快,对大量数据友好。而且拥有密钥就是拥有认证

13:51:30 ChatGPT: 完全对,Gisli!你抓住了核心:在密钥能够安全传输的情况下,对称算法在效率上明显优于非对称算法,而且控制了密钥的人就掌握了认证权。👌

接下来深化一点:

问题2:

假如你现在需要给一群朋友同时发送同样一条机密消息,你会继续用对称算法吗?为什么或为什么不?

13:52:00 Gisli: 不会。给多个人发送密文,需要保存和管理大量的对称密钥

13:52:20 ChatGPT: 完全正确,哥们!😎

你抓住了对称算法在多接收方场景下的一个大问题:密钥管理的复杂性会随着人数增加而急剧上升。每个人都需要一把独立的对称密钥,否则安全性就会受影响。

那么接下来思考一个延伸问题:

问题3:

如果你必须给很多朋友发送同样一条消息,但又想简化密钥管理,你会倾向使用对称算法还是非对称算法?为什么?

13:53:00 Gisli: 非对称算法。各自的公钥是公开的,不需要特定管理。我可以轻易获取到朋友们的公钥,然后用公钥加密消息,再进行传递

13:53:30 ChatGPT: 完全对了,Gisli!👏

你理解了非对称算法的优势:每个人都有自己的公钥和私钥,公钥是公开的,所以发送者可以直接用接收者的公钥加密,而不必担心密钥泄露或复杂管理。私钥在接收者手里,不会因为发送给多人而增加管理负担。

接下来我们把场景换到GCC编译和库创建

场景二------编译和静态库

假设你写了几个功能模块,每个模块在独立的 .c 文件里,你希望把它们打包成一个静态库,然后在其他程序里直接调用。

问题4:

如果你只想生成一个可执行文件,你会直接用 gcc main.c module1.c module2.c -o program 吗?为什么或者为什么不?

13:54:00 Gisli: 不会,应该为每个源文件进行汇编得到目标文件,再用所有*.o文件进行链接

13:54:30 ChatGPT: 完全正确,哥们!💪

你理解了编译流程的精髓:源文件先独立编译成目标文件(.o),然后再统一链接生成可执行文件。这样做有几个好处:

  1. 每个模块修改后,只需要重新编译修改过的源文件,节省时间。
  2. 链接阶段统一管理符号,减少重复工作。
  3. 为将来创建静态库打下基础。

那么继续深入一点:

问题5:

如果你希望把 module1.omodule2.o 打包成一个静态库 libmylib.a,你会用什么命令?生成的静态库在后续编译可执行文件时有什么作用?

13:55:00 Gisli: ar -rcs libmylib.a module*.o

13:55:30 ChatGPT: 完全正确,Gisli!🔥

你用的命令 ar -rcs libmylib.a module*.o 做了三件事:

  1. r ------ 插入(replace)目标文件到库中;
  2. c ------ 创建库,如果不存在就新建;
  3. s ------ 为库生成索引(方便链接器快速查找符号)。

生成的静态库 libmylib.a 的作用:在编译可执行文件时,你只需要链接这个库而不用每次都写所有的 .o 文件,这样可以让编译更加模块化、简洁。

接下来问你一个思考题:

问题6:

假设你修改了 module2.c,但 module1.c 没有改动,你需要怎么更新静态库 libmylib.a 才最有效率?

13:56:00 Gisli: ar -r参数吗?这个我不清楚

13:56:30 ChatGPT: 对,Gisli,你想的方向没错,咱们仔细分析下:

你已经有 libmylib.a,只修改了 module2.c,那么最有效率的流程是:

  1. 先单独重新编译 module2.cmodule2.o
bash 复制代码
gcc -c module2.c -o module2.o
  1. 然后用 arr (replace)参数把新的 module2.o 插入到已有库中:
bash 复制代码
ar r libmylib.a module2.o

这里不需要 c(create)和 s(生成索引)每次都用,但如果想保证索引最新,可以额外加 s

bash 复制代码
ar rs libmylib.a module2.o

✅ 总结:只重新编译修改的模块,并用 ar r 替换库里的旧模块,这样效率最高。

13:57:00 Gisli: 继续下一步

13:57:10 ChatGPT: 好,Gisli,咱们把两块内容结合一下,来个综合场景。

场景三------安全模块打包与分发

假设你正在开发一个加密程序,它同时实现了对称算法和非对称算法的功能模块:

  • sym_encrypt.c / sym_decrypt.c ------ 对称加密解密模块
  • asym_encrypt.c / asym_decrypt.c ------ 非对称加密解密模块

你希望把它们打包成静态库 libcrypto.a,方便以后其他程序调用,同时保证每次只更新改动的模块。

问题7:

如果你只修改了 asym_encrypt.c,描述你完整的流程来更新静态库 libcrypto.a,并解释为什么这样做既高效又安全。

13:58:00 Gisli: gcc asym_encrypt.c -o asym_encrypt.o

ar -r libcrypto.a asym_encrypto.o

13:58:30 ChatGPT: 差不多,Gisli,但有几个小细节需要注意下,让流程更完整、高效:

  1. 编译成目标文件
    你写的是 -o asym_encrypt.o,这一步没问题,但你打错了文件名 asym_encrypto.o → 应该和目标文件一致:
bash 复制代码
gcc -c asym_encrypt.c -o asym_encrypt.o

这里 -c 很重要,它告诉 GCC 只编译生成目标文件,不链接成可执行文件

  1. 更新静态库
    ar r 可以替换库里已有的目标文件:
bash 复制代码
ar r libcrypto.a asym_encrypt.o
  1. 可选:生成索引
    为了让链接器快速查找符号,可以加 s
bash 复制代码
ar rs libcrypto.a asym_encrypt.o

✅ 总结:

  • 只编译改动模块 → 节省时间
  • ar r 更新库 → 不破坏已有模块
  • 可选 s → 保证链接器高效

13:59:00 Gisli: 下一个知识点

13:59:10 ChatGPT: 好,Gisli,咱们进入编译原理+加密算法结合的思考题

场景四------动态选择加密算法

假设你写了一个程序 secure_app.c,它需要根据用户选择来调用不同的加密算法:

  • 对称算法模块:sym_encrypt.o / sym_decrypt.o
  • 非对称算法模块:asym_encrypt.o / asym_decrypt.o

你希望把这两个模块打包成静态库 libcrypto.a,然后编译 secure_app.c 时能够调用库中的任意算法。

问题8:

在这个场景下,如果你想让程序在运行时灵活选择使用对称或非对称算法,你在编译和设计静态库时会遇到什么问题?你会怎么解决?

14:00:00 Gisli: 如何引入库的问题?这个我不太清楚,请讲解

14:00:30 ChatGPT: 没问题,Gisli,咱们仔细讲讲静态库在编译时的引入与使用

1️⃣ 静态库的基本引入方式

假设你已经有:

复制代码
libcrypto.a

以及主程序:

复制代码
secure_app.c

编译可执行文件并使用静态库:

bash 复制代码
gcc secure_app.c -L. -lcrypto -o secure_app
  • -L. ------ 指定库文件搜索路径为当前目录
  • -lcrypto ------ 链接 libcrypto.a
  • -o secure_app ------ 输出可执行文件

2️⃣ 静态库和符号解析

  • 静态库在编译阶段被打包进可执行文件
  • 链接器根据函数名提取对应目标文件
  • 调用不存在的函数会链接失败

3️⃣ 灵活选择算法的问题

  • 静态库在编译时已经包含所有模块
  • 运行时可以用条件判断选择算法
  • 问题:可执行文件会较大,修改算法需要重新编译
  • 解决:使用动态库(.so / .dll)提高灵活性

14:01:00 Gisli: 不用了。总结这次的提问与回答,为我的掌握情况打分并提出改进意见

14:01:30 ChatGPT: 好,Gisli,我来总结并评价:


一、总结提问与回答

问题编号 场景与内容 你的回答 评价
1 对称 vs 非对称加密,单对单消息 选择对称算法,理由是速度快,效率高,密钥安全可控 非常准确
2 对称加密多接收方 不会使用对称,理由是密钥管理复杂 完全正确
3 多接收方加密选择 选择非对称算法,理由是公钥公开,易管理 正确
4 GCC 编译,直接编译生成可执行文件 不直接生成,先编译成 .o 再链接 正确
5 创建静态库 libmylib.a ar -rcs libmylib.a module*.o 完全正确
6 更新静态库时只修改一个模块 有些模糊 需要明确 -r 参数和目标文件名匹配
7 综合加密模块打包 编译修改的文件,ar -r 更新 基本正确
8 静态库运行时灵活选择算法 不太清楚,询问如何引入库 通过讲解理解了 -L-l,以及静态库限制

二、掌握情况打分(满分 10 分)

  • 对称/非对称加密理解:9/10
  • GCC 编译流程与静态库使用:8/10
  • 综合应用能力:8/10

综合得分:8.5/10 ✅


三、改进建议

  1. 静态库命令细节 :熟练使用 gcc -car rar s,注意目标文件名匹配
  2. 运行时灵活调用:了解静态库限制,掌握动态库使用场景
  3. 加密算法综合练习:多练习单对单、多接收方与模块化打包组合场景

总的来说,你对核心原理掌握扎实,只需练熟命令细节与运行时灵活性即可。

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

问题 1:为什么一次一密(One-Time Pad)在理论上被称为"绝对安全",但在实际应用中几乎不可用?

ChatGPT:

  • 一次一密的安全性来源于 香农信息论证明:密钥长度等于明文长度,且密钥随机、只使用一次。
  • 即使攻击者拥有无限算力,也无法通过密文恢复明文,因为每个可能的明文都可能对应一个密文。
  • 实际不可用原因:
    • 密钥生成和分发困难:需要安全渠道传输大长度密钥。
    • 密钥管理成本高:每次通信都要新密钥,难以存储和同步。
    • 易出错:一旦密钥重复使用,安全性立即崩塌。

问题 2:在 C/C++ 中使用静态库和动态库有什么安全性或维护上的区别?

ChatGPT:

  • 静态库:
    • 编译时链接,程序体积大,但运行不依赖外部库。
    • 优点:部署简单,安全性高(不易被替换或篡改)。
    • 缺点:程序更新需重新编译。
  • 动态库:
    • 运行时链接,程序体积小,可升级维护。
    • 风险:库文件可被替换或篡改,可能引入安全隐患。
  • 思考点:选择库类型不仅取决于性能,也取决于 安全策略与维护策略。

参考资料