HWBTutorials/dpa-attack/dpa_student.ipynb

417 lines
68 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Break AES using DPA with correlations\n",
"\n",
"You need:\n",
"* `plaintext.txt`: all PT blocks, (one block per line, in hex, bytes separated by spaces)\n",
"* `ciphertext.txt`: all CT blocks, (one block per line, in hex, bytes separated by spaces)\n",
"* `traceLength.txt`: how many samples per trace (one decimal number)\n",
"* `traces.bin`: raw measured traces, one byte per sample (uint8), all traces together continuously\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "GEwwR12Gupsi"
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "8fW8nPQ5uyEO"
},
"outputs": [],
"source": [
"# AES SBOX\n",
"sbox = np.array([\n",
" 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,\n",
" 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,\n",
" 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,\n",
" 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,\n",
" 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,\n",
" 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,\n",
" 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,\n",
" 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,\n",
" 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,\n",
" 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,\n",
" 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,\n",
" 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,\n",
" 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,\n",
" 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,\n",
" 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,\n",
" 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16\n",
" ], dtype='uint8')\n",
"\n",
"# Hamming weight lookup table\n",
"hw_table = []\n",
"for i in range(256):\n",
" s = '{0:08b}'.format(i)\n",
" hw_table.append(s.count('1'))\n",
"hw_table = np.array(hw_table, 'uint8')\n",
"\n",
"# Correlation of two matrices\n",
"def correlate(x, y):\n",
" \"\"\"\n",
" Correlate all columns from matrix x of shape (a,b)\n",
" with all columns from matrix y of shape (a,c),\n",
" creating correlation matrix C of shape (b,c).\n",
" \n",
" Originally matlab script by Jiri Bucek in NI-HWB.\n",
" \"\"\"\n",
" x = x - np.average(x, 0) # remove vertical averages\n",
" y = y - np.average(y, 0) # remove vertical averages\n",
" C = x.T @ y # (n-1) Cov(x,y)\n",
" C = C / (np.sum(x**2, 0)**(1/2))[:,np.newaxis] # divide by (n-1) Var(x)\n",
" C = C / (np.sum(y**2, 0)**(1/2)) # divide by (n-1) Var(y)\n",
" return C\n",
"\n",
"# Load PT of CT from file\n",
"def load_text(file_name):\n",
" \"\"\"\n",
" Load any text PT/CT from file containing hex strings with bytes \n",
" separated by spaces, one block per line\n",
" Output is a matrix of bytes (np.array)\n",
" \"\"\"\n",
" txt_str = open(file_name).readlines()\n",
" del txt_str[-1] #discard last empty line\n",
" #split each line into bytes and convert from hex\n",
" txt_bytes_list = list(\n",
" map(lambda line: \n",
" list(\n",
" map(lambda s: int(s, 16),\n",
" line.rstrip().split(\" \"))\n",
" ),\n",
" txt_str)\n",
" )\n",
" return np.array(txt_bytes_list, 'uint8')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"id": "--PH16eNuz_H"
},
"outputs": [],
"source": [
"# read plaintext inputs\n",
"inputs = load_text(\"plaintext.txt\")\n",
"\n",
"# read length of one complete trace (number of samples per trace)\n",
"with open(\"traceLength.txt\", \"r\") as fin:\n",
" trace_length = int(fin.readline())\n",
"\n",
"# trim each trace - select interesting part\n",
"start = 0\n",
"len = trace_length # CHANGE to the length of the first round; \n",
"\n",
"# read traces from binary file\n",
"traces = np.fromfile(\"traces.bin\", dtype='uint8') # read as linear array\n",
"traces = np.reshape(traces, (traces.size // trace_length, trace_length)) # reshape into matrix\n",
"traces = traces[:, start:len] # select only the interesting part of each trace"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"id": "ZVJ_Tk55u1wu"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(100, 16)\n",
"200000\n",
"(100, 200000)\n"
]
}
],
"source": [
"print(inputs.shape) # dimensions of inputs\n",
"print(trace_length)\n",
"print(traces.shape) # dimensions of matrix of traces"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib widget"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"id": "wDAUVmNOu3BP"
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8a25fae7cccb4c078bb6a094f047f388",
"version_major": 2,
"version_minor": 0
},
"image/png": "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",
"text/html": [
"\n",
" <div style=\"display: inline-block;\">\n",
" <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
" Figure\n",
" </div>\n",
" <img src='data:image/png;base64,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' width=640.0/>\n",
" </div>\n",
" "
],
"text/plain": [
"Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot one trace\n",
"fig = plt.figure()\n",
"plt.plot(traces[0])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "w6boaqAQvF1G"
},
"source": [
"## **Attack the first key byte**\n",
"![Intermediate value](dpa-aes-v.png)\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"id": "WaKiOUmbvbQR"
},
"outputs": [],
"source": [
"# Generate key hypotheses (all possible byte values)\n",
"keys = np.arange(start=0, stop=256, step=1, dtype='uint8')\n",
"# Select the first byte of each input block\n",
"inp = inputs[:, 0]\n",
"# XOR each data byte with each key\n",
"xmat = inp[:, np.newaxis] ^ keys"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 37 235 140 ... 71 237 252]\n",
" [134 25 178 ... 142 50 68]\n",
" [215 215 233 ... 61 22 57]\n",
" ...\n",
" [ 18 188 253 ... 68 197 189]\n",
" [ 87 194 19 ... 160 8 136]\n",
" [148 238 68 ... 23 94 218]]\n",
"(100, 16)\n",
"(100,)\n",
"(100, 1)\n",
"(256,)\n",
"(100, 256)\n",
"[[ 37 36 39 ... 216 219 218]\n",
" [134 135 132 ... 123 120 121]\n",
" [215 214 213 ... 42 41 40]\n",
" ...\n",
" [ 18 19 16 ... 239 236 237]\n",
" [ 87 86 85 ... 170 169 168]\n",
" [148 149 150 ... 105 106 107]]\n"
]
}
],
"source": [
"# Examine the inputs matrix. Does it contain the data from plaintext.txt?\n",
"print(inputs)\n",
"# What is the shape of all the operands from the previous cell?\n",
"print(inputs.shape)\n",
"print(inp.shape)\n",
"print(inp[:, np.newaxis].shape)\n",
"print(keys.shape)\n",
"print(xmat.shape)\n",
"# Do you understand the values after the XOR operation? What AES operation do they represent?\n",
"print(xmat)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "VrBZd18VwBOH"
},
"outputs": [],
"source": [
"# Substitute with SBOX all XORed values -- matrix of intermediate values\n",
"smat = sbox[?]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "4GfR9BU-wT4G"
},
"outputs": [],
"source": [
"# Compute Hamming Weights -- the matrix of hypothetical power consumption\n",
"hmat = ?[?]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "J8TTPk-WwjQH"
},
"outputs": [],
"source": [
"# Compute the correlation matrix -- correlate the hypotheses with measured traces\n",
"print(hmat.shape)\n",
"print(traces.shape)\n",
"corr = correlate(?, ?)\n",
"# What is the shape and contents of the correlation matrix?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "iOqbuNAKxCvP"
},
"outputs": [],
"source": [
"# Find the absolute maximum correlation\n",
"acorr = abs(?)\n",
"max_acorr = ?.max()\n",
"(k, j) = np.where(acorr == ?) # find idices of maximum\n",
"print(\"key: %d time: %d\" % (k[0], j[0]))\n",
"print(\"key: %1c, %02x\" % (k[0], k[0]))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Plot the correlation traces for the right key byte guess and one wrong key byte guess\n",
"# Do you see the correlation peaks?\n",
"fig = plt.figure()\n",
"plt.plot(?)\n",
"plt.plot(?)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Z62RVYJYzncZ"
},
"source": [
"## **Break all key bytes!**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "T7HhwO-ezpoQ"
},
"outputs": [],
"source": [
"keys = np.array(range(0, 256))\n",
"kk = np.zeros(16, dtype='uint8')\n",
"for i in range(0, 16):\n",
" inp = inputs[:, ?]\n",
" ????\n",
" kk[i] = k\n",
" print(\"%1c, %02x @ %d\" % (k[0], k[0], j[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## **Verify the key on a PT, CT pair!**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"key_bytes = bytes(kk)\n",
"outputs = ?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# !pip install pycryptodome\n",
"from Crypto.Cipher import AES\n",
"cipher = AES.new(key_bytes, AES.MODE_ECB)\n",
"??"
]
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
"name": "dpa_student.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}