<commit_before>---
layout: post_latex
title: 漫谈网络通讯加密（5）AES
tags: ['crypto']
published: true
---

<!--more-->


本文主要目的是剖析AES(Rijndael)的来龙去脉，包括源码实现。

# [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)

下面以源码剖析的形式来介绍AES。本来打算剖析openSSL里的AES，结果发现代码是高度优化的，很难阅读理解。索性找了个更适合剖析的实现: [tiny-AES-c](https://github.com/kokke/tiny-AES-c)。1000多stars，想必也很靠谱了。

## 流程

### tiny-AES-C总览

以最简单的加密模式ECB为例，ECB的加密解密接口如下：

```c
void AES_ECB_encrypt(struct AES_ctx *ctx, uint8_t* buf)
{
  // The next function call encrypts the PlainText with the Key using AES algorithm.
  Cipher((state_t*)buf, ctx->RoundKey);
}<commit_msg>no message<commit_after>---
layout: post_latex
title: 漫谈网络通讯加密（5）AES
tags: ['crypto']
published: true
---

<!--more-->


本文主要目的是剖析AES(Rijndael)算法的来龙去脉，包括源码实现。

# [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)


Note:本来打算剖析openSSL里的AES，结果发现代码是高度优化的，很难阅读理解。索性找了个更适合剖析的实现: [tiny-AES-c](https://github.com/kokke/tiny-AES-c)。1000多stars，想必也很靠谱了。

## 流程

### tiny-AES-C总览

以最简单的加密模式ECB为例，ECB的加密解密接口如下：

```c
void AES_ECB_encrypt(struct AES_ctx *ctx, uint8_t* buf)
{
  // The next function call encrypts the PlainText with the Key using AES algorithm.
  Cipher((state_t*)buf, ctx->RoundKey);
}
{'fraction_non_alphanumeric': 0.1557377049180328, 'fraction_numerical': 0.009836065573770493, 'mean_word_length': 5.745856353591161, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 7, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '790111', 'n_tokens_mistral': 691, 'n_tokens_neox': 687, 'n_words': 79}