blog icon indicating copy to clipboard operation
blog copied to clipboard

My blog

Results 115 blog issues
Sort by recently updated
recently updated
newest added

# 3.1_Security_对称密钥算法之AES 进阶加密标准(英语:Advanced Encryption Standard,缩写:AES),又称Rijndael加密法(荷兰语发音: [ˈrɛindaːl],音似英文的“Rhine doll”),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,进阶加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。现在,进阶加密标准已然成为对称金钥加密中最流行的演算法之一。 本节继承[3.0_Security_对称密钥算法加解密](https://github.com/carloscn/blog/issues/137)通用实现,来介绍AES主算法。本文包括: * AES需要用到的数学知识(素域、欧几里得扩展算法、小费马定理); * AES主算法过程(add_round_key, sub_bytes, shift_rows, mix_columns); * AES如何套用对称加密的模式(ecb, cbc, ctr, cfb, ofb); # 1. 相关数学知识 本节介绍AES中所用到的数学知识,这些算法的C语言实现在https://github.com/carloscn/cryptography/blob/master/lib/carlos/math_utils.c 定义。 ## 1.0...

Security

# 2.0_Security_随机数(伪随机数) **密码学安全伪随机数生成器**(亦作**密码学伪随机数生成器**,英文:**Cryptographically secure pseudo-random number generator**,通称**CSPRNG**),是一种能够通过运算得出[密码学安全伪随机数](https://zh.wikipedia.org/wiki/%E9%9A%8F%E6%9C%BA%E6%95%B0#%E5%AF%86%E7%A2%BC%E5%AD%B8%E7%AF%84%E7%96%87%E7%9A%84%E9%9A%A8%E6%A9%9F%E6%95%B8 "随机数")的[伪随机数生成器](https://zh.wikipedia.org/wiki/%E4%BC%AA%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90%E5%99%A8 "伪随机数生成器")。相较于统计学伪随机数生成器和更弱的伪随机数生成器,CSPRNG所生成的密码学安全伪随机数具有额外的伪随机属性。 在对称加密的流密码算法和块密码算法中,都需要生成随机的密钥流,明文通过密钥加密得到密文,所以随机数生成算法显得十分重要,它决定加密密钥,密钥决定了加密算法的安全性。 随机数的类型分有三种,伪随机数生成器,密码学伪随机数生成器和真正的随机数生成器,前两者生成随机数通过软件实现,真正的随机数生成器通过硬件实现。 1、伪随机数生成器:**软件实现,随机性。** 2、密码学伪随机数生成器:**软件实现,随机性,不可预测性。** 3、真正的随机数生成器:**硬件实现,随机性,不可预测性,不可重现性。** #### 伪随机数生成器(PRNG) PRNG是从某个初始熵(种子)开始,并通过某种计算来计算下一个随机数的函数,而这些计算在不知道种子的情况下是无法预测的。这种计算称为伪随机函数。 伪随机函数内部会维护一个状态(internal state)。首先,通过初始种子初始化状态。当生成下一个随机数时,它是从内部状态(使用某种计算或公式)计算出来的,然后更改伪随机函数的内部状态(使用某种计算或公式)。当生成下一个随机数时,将再次根据函数的内部状态进行计算,并再次更改此状态,依此类推。以最简单的形式可以执行以下过程: ![](https://raw.githubusercontent.com/carloscn/images/main/typora202210231710451.png) #### 伪随机数生成 如果每次熵(或种子)是一样的,生成的随机数也是相同的,所以熵(或种子)对于随机数生成器非常重要。 好的随机数生成器应该是快速的,并且应该具有统计随机性(请参阅Diehard测试),即在一段时间内所有数字的生成机会均应相同。而CSPRNG有更高的要求,还要求不可预测性和不可重现性。所谓不可重现性(unrepeat)就是不管经过多长时间,不会产生完全相同的随机数。当然,在软件层面不可能生成完全不一样的随机数,在一定周期内,密码学随机数算法最终会生成两个完全相同的随机数,只是周期长短的问题,在密码学中应该尽量使用周期相对长的随机数。 #### 初始熵(种子) 为了安全起见,PRNG应该从真正随机的初始种子开始,这绝对是不可预测的。如果种子是可预测的,它将生成可预测的随机数序列,并且整个随机生成过程将是不安全的。这就是为什么在开始时拥有不可预测的随机性(安全种子)非常重要的原因。 如何以安全的方式初始化伪随机生成器?答案很简单:收集随机性(熵)。 #### 熵...

Security