理解AES_S-box盒生成
一开始,我以为S-box这玩意就是随便找的一个map去做substitution,但仔细研究发现原来这里面数学原理深奥去了。光S-box的生成就很有意思,核心就是求多项式的逆元和访射变化,之后有大量时间再做更深层次的分析,本次对AES中的S-box的生成做一个笔记,学习AES是为了了解它的数学设计思想,为之后理解Number theoretic transform热身。
求乘法逆元首先,对于S-box是行从00~ff,列也是从00~ff的一个matrix,也就是有限域GF(2^8)的所有element(0~255)
1234567891011121314151600 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F40 41 42 43 44 45 46 47 48 ...
测信道攻击——用DPA攻击固件中的AES
上篇攻击AES的方法其实属于SPA,本实验用更牛逼的方法,DPA来攻击AES,而且是货真价实的AES。关于DPA,我前面有篇博客有所讲解(初识测信道攻击)。下面开始环境配置,这里需要注意的是,notebook中给出的SS_VER是’SS_VER_1_1’,我运行后总是失败,换成前面实验用的SS_VER_2_1就好了。这里编译、上传固件、安装就不多解释了,与之前实验一致。
1234SCOPETYPE = 'OPENADC'PLATFORM = 'CWLITEARM'CRYPTO_TARGET='TINYAES128C'SS_VER='SS_VER_2_1'
1%run "../../Setup_Scripts/Setup_Generic.ipynb"
123%%bash -s "$PLATFORM" "$CRYPTO_TARGET" "$SS_VER"cd ../../../hardware/victims/firmware/ ...
测信道攻击——利用一个bit恢复AES key
前面对AES原理做了解释,而本实验的AES是一个半AES,因为没有那么复杂,非常简单,方便初学者理解。这次实验不用硬件设备。实验的目的就是通过一个bit位的泄漏,即使不知道key,但知道加密算法也可以恢复完整的AES key,这个方法非常妙!
简单来说,本实验的阉割版AES长这样:
S-box
12345678910111213141516171819sbox = [ # 0 1 2 3 4 5 6 7 8 9 a b c d e f 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76, # 0 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0, # 1 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0 ...
测信道攻击——Hamming Weight Swings
实验:以Hamming Weight为标准,对不同数据进行AES加密能耗的差别
Hamming Weight:二进制数中包含’1’的个数
我们作出一个假设:data line上的比特位会消耗可测量的功耗。
对0x00(包含0个1)和0xff(包含8个1)这两个权重很极端的数据进行测试,设置trace的量为100,当设备运行AES算法时,对这两个文本加密,如果假设正确,那么在高权重和低权重的功耗曲线上能观察到可测量的差异。目前,这些功耗曲线都混在一起了。将它们分成两组:one_list和zero_list。检查第一个字节来检查是否为0x00,并假设如果不是0x00就是0xFF。以下是一个简单的迭代循环来打印它们:
1234567891011121314151617181920212223242526272829303132from tqdm import tnrangeimport numpy as npimport timektp = cw.ktp.Basic()trace_array = []textin_array = []key, text = ktp.next()target. ...
测信道攻击——利用能耗破解密码
环境配置硬件设置:
SCOPETYPE: CWLite/CW1200选OPENADC,CWNano选CWNANO
PLATFROM: CWLITEARM/CW308_STM32F3/CWLITEXMEGA/CW308_XMEGA
SS_VER好像没啥差别,直接设置为’SS_VER_2_1’就好
123SCOPETYPE = 'OPENADC'PLATFORM = 'CWLITEARM'SS_VER = 'SS_VER_2_1'
相比实验一,这里用一个脚本直接代替连接Scope和一些基本的setup。
1%run "../../Setup_Scripts/Setup_Generic.ipynb"33
编译固件
123%%bash -s "$PLATFORM" "$SS_VER"cd ../../../hardware/victims/firmware/basic-passwdcheckmake PLATFORM=$1 CRYPTO_TARGET=NONE SS_VE ...
测信道攻击之能耗分析实验一
Setup首先设置硬件对应的平台:
SCOPETYPE可以是’OPENADC’,适用于CWLite/CW1200,或者是’CWNANO’,适用于CWNano。PLATFORM是目标设备,最佳支持选项是’CWLITEARM’/‘CW308_STM32F3’,其次是’CWLITEXMEGA’/‘CW308_XMEGA’,最后是’CWNANO’。例如我的是Chipwhisperer Lite,设置如下:
12SCOPETYPE = 'OPENADC' PLATFORM = 'CWLITEARM'
创建一个新目录并将simpleserial-base代码复制到其中:
1234%%bashcd ../../../hardware/victims/firmware/mkdir -p simpleserial-base-lab2 && cp -r simpleserial-base/* $_cd simpleserial-base-lab2
编译固件
123%%bash -s "$PLATFORM"cd ../../.. ...
初识测信道攻击(Side Channel Attack)
初识测信道攻击(Side Channel Attack )目前测信道攻击的几个攻击面:热量,声音,时钟,电磁辐射,能耗。为什么从这些面去攻击呢?因为这些面都是非常轻易能测量的!也是开发者很难做防守的点。我将从能耗攻击入手测信道,定期分享一些心得。
能耗攻击AES加密算法,简单来说就是通过监控设备在加密过程中的能耗来推测AES加密的密钥。而其中的推测方式主要有两种,一种是DPA(利用平均数的差分),另一种是CPA(利用统计学推测能耗与数值间的相关性)。其实它两本质上是一样的道理,只不过是在处理能耗数据上采取了不同的策略,殊途同归。在了解主要的两种能耗攻击(DPA和CPA)的具体过程之前,这里简单介绍一下AES-128加密算法
AES-128加密算法Step1: AddRound key明文P和密钥K,我们可以将其分别看成两个4x4的矩阵,每个Value都是一个字节。让两个矩阵进行+操作。
操作如(3),简写成(4)
Step2: SubRound在AddRound后,得到一个4x4的新矩阵,这还不够,AES还想让这些数据做更大的混合,加大破解的难度,于是乎通过一个叫S-box的东西 ...
Dynamic_Practice
70.Climbing StairsDescription:
You are climbing a staircase. It takes n steps to reach the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Example 1:
12345Input: n = 2Output: 2Explanation: There are two ways to climb to the top.1. 1 step + 1 step2. 2 steps
Example 2:
123456Input: n = 3Output: 3Explanation: There are three ways to climb to the top.1. 1 step + 1 step + 1 step2. 1 step + 2 steps3. 2 steps + 1 step
Constraints:
1 <= n <= ...
AFL_FUZZ_Code_Learning
AFL Fuzz Souce Code Learningafl-gcc.cmain函数main的核心就两个函数,find_as和edit_params,从他们的名字可以大致推断find_as应该是用来找as文件或者目录的,edit_params应该是用来修改gcc的参数,加上一些宏定义啥的,在原有的基础上添加一些参数设置。最后通过execvp来执行前面编辑好(加了额外afl所需要的参数)的gcc命令
12345678910111213141516171819202122232425262728293031323334353637int main(int argc, char** argv) { if (isatty(2) && !getenv("AFL_QUIET")) { SAYF(cCYA "afl-cc " cBRI VERSION cRST " by <lcamtuf@google.com>\n"); } else be_quiet = 1; if ...
Fuzz学习入门之Fuzzing-OpenEuler-file5.41
下载AFL
git clone https://github.com/google/AFL.git
Tips:需要将AFL/llvm_mode目录下alf-clang-fast.c中131~134行的代码给去掉,不然编译的时候会报错
在AFL下make生成fuzzer
下载测试的项目:
git clone https://gitee.com/src-openeuler/file.git
把C和C++的编译器改为afl的afl-clang-fast和afl-clang-fast++
12export CC=/home/re1own/github/AFL/afl-clang-fastexport CXX=/home/re1own/github/AFL/afl-clang-fast++
指定下安装目录
1./configure --enable-shared=no --prefix=/home/re1own/Project/install/
编译安装
12makemake install
编译安装完之后可以发现在之前创建和制定的install目录下有了用AFL插桩生成的目标程序了 ...