Skip to content

Instantly share code, notes, and snippets.

@dbrgn
Created April 4, 2014 19:51
Show Gist options
  • Save dbrgn/9981928 to your computer and use it in GitHub Desktop.
Save dbrgn/9981928 to your computer and use it in GitHub Desktop.
{
"metadata": {
"name": "aes"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": "from collections import Counter, OrderedDict\nfrom base64 import b64decode\nimport matplotlib.pyplot as plt",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": "# Decode bytes\naes_bytes = b64decode('''sRoK5vaaqJeIzKRMffh/GmkLbAY6CuydKyIglSRl+WtCwhg9OXtHVk8N\nURXhbhVI1DF6lMxqg2Y0lAHJSkVwoDjclOADJSw/WcyqOICiJt4AgmEmy8t1AKHGE3YNCcGSChHUiwDED\nLgmxHYqT5dHfyTkTLYYqJpdv4T5TSm+JBZD+fT6DPMkXRNbaMjJASxJJopgeOn5KDklAlMhR3AlsndOvN\n35eFmn1B9HqBg54dOsgQBtaH1r213GYByrjqrjEHVGbFZWAST30DL3H/s5Nw7AQ9rGHZSDZza8h6trDog\nJMzC7DCRTssNJ/Ydt/pPE3CJ4LJSjZ85y8/oKmzHoF7JgY8ht6uFve8bXo/JpWm58PerQisYQQhncLlGP\nMW2w8vtr8eyI6myE8ZPWh9chMslw/YHQY+axEf8PRxh4pDE='''.replace('\\n', ''))",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": "# Count bytes\nbyte_counter = Counter(aes_bytes)\nbyte_counter",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 76,
"text": "Counter({36: 6, 71: 5, 148: 5, 198: 5, 249: 5, 0: 4, 10: 4, 24: 4, 38: 4, 49: 4, 57: 4, 107: 4, 109: 4, 120: 4, 1: 3, 12: 3, 37: 3, 44: 3, 86: 3, 93: 3, 96: 3, 108: 3, 112: 3, 135: 3, 136: 3, 168: 3, 178: 3, 196: 3, 201: 3, 204: 3, 208: 3, 212: 3, 220: 3, 225: 3, 234: 3, 9: 2, 13: 2, 14: 2, 16: 2, 17: 2, 19: 2, 21: 2, 26: 2, 31: 2, 33: 2, 34: 2, 50: 2, 56: 2, 61: 2, 66: 2, 67: 2, 73: 2, 76: 2, 79: 2, 81: 2, 83: 2, 89: 2, 99: 2, 103: 2, 104: 2, 105: 2, 110: 2, 117: 2, 118: 2, 123: 2, 125: 2, 127: 2, 129: 2, 131: 2, 132: 2, 138: 2, 147: 2, 151: 2, 154: 2, 163: 2, 164: 2, 170: 2, 171: 2, 177: 2, 188: 2, 200: 2, 203: 2, 215: 2, 230: 2, 236: 2, 241: 2, 242: 2, 243: 2, 247: 2, 250: 2, 251: 2, 253: 2, 2: 1, 3: 1, 6: 1, 11: 1, 15: 1, 22: 1, 23: 1, 25: 1, 28: 1, 29: 1, 32: 1, 40: 1, 41: 1, 42: 1, 43: 1, 46: 1, 48: 1, 51: 1, 52: 1, 54: 1, 55: 1, 58: 1, 63: 1, 69: 1, 70: 1, 72: 1, 74: 1, 77: 1, 78: 1, 90: 1, 91: 1, 97: 1, 101: 1, 102: 1, 106: 1, 111: 1, 114: 1, 119: 1, 122: 1, 124: 1, 128: 1, 130: 1, 139: 1, 142: 1, 143: 1, 146: 1, 149: 1, 155: 1, 157: 1, 160: 1, 161: 1, 162: 1, 167: 1, 172: 1, 176: 1, 182: 1, 184: 1, 187: 1, 190: 1, 191: 1, 192: 1, 193: 1, 194: 1, 195: 1, 206: 1, 211: 1, 214: 1, 218: 1, 219: 1, 221: 1, 222: 1, 224: 1, 227: 1, 228: 1, 232: 1, 233: 1, 244: 1, 246: 1, 248: 1, 254: 1, 255: 1})"
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": "# Sort dictionary\ndata = OrderedDict(sorted(byte_counter.items()))\n\n# Prepare figure & axes\nfig = plt.figure(figsize=(15,4), dpi=120)\nax = fig.add_axes([0.1, 0.1, 0.8, 0.8])\nax.set_xlabel('Byte')\nax.set_ylabel('Count')\nplt.xticks(range(len(data)), list(data.keys()))\n\n# Only show every 4th tick label\nfor label in ax.xaxis.get_ticklabels()[1::4]:\n label.set_visible(False)\nfor label in ax.xaxis.get_ticklabels()[2::4]:\n label.set_visible(False)\nfor label in ax.xaxis.get_ticklabels()[3::4]:\n label.set_visible(False)\n \n# Plot bars\nplt.bar(range(len(data)), data.values(), align='center')",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": "<Container object of 173 artists>"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nE1eg+TUXb8uWLerdu7dSU1Mdx5s7d64WLVp0yY4bTH7+4j3++OO67777dNVVV+n+++/XggULHMfz\neDwaPXq08vPzfX/nNJj8mosX6Przt49VVlaGZEy//vrrmjp1asDvay5ew8GS2/wSExN92/HKK69U\nt27dNHr0aNc5ZWVlacuWLTp16pSqqqq0du1aHTlyRMePH1fv3r0lSb1799bx48ddxfvf//3fSz6c\n3ewfkprNZ+fOncrMzFRmZqaefvrpoOM1CPSXP83xeDwhiTN27FglJCSob9++SklJ0f33369u3boF\nFKPp/upm/dniBZPfgw8+qKuuukovv/yy73LIxlauXKkhQ4b4Chmn8V566SXfbQS5ublas2aN6urq\nVFpaqg8//NDRwePq1auVlJSknJwc62sCHS/PPvuscnNzNXv2bN+lgWfPntUTTzyh+fPnO44jtTyf\nBDr+nMxPbvaP5vb/QLavk8+zQOJlZmb6ThCsWLHCd6nh0aNHL/nTbE6PCW3xAt2+jY+BbHNWIDk6\niXfw4EF5PB7deOONGjJkiBYtWuQoP5tAltnJMaTb5bXFk+qPI7xer0aOHKmtW7c6zi/YOatxvJbm\nGCf7sJN4JSUlAW/fa665RpL/OcvN9mgunuR8e0hRLhpD9cHeoLa2Vrt379ZPfvIT7d69W9/85jf9\n3uPh1qOPPqoOHToEfWBbW1urr776Sjt27NCiRYt02223BRzj7NmzmjRpkhYvXqzOnTsHnWPjeF26\ndAkqx3bt2mnPnj06cuSINm/erKKioqDyay7ea6+9FlCsd999V7169ZLX6/X7W5dA87PFmz17tpYs\nWaJDhw7pmWee8Z2Zc2Lbtm0qLi7WunXr9Otf/1pbtmxxnV9L8QJdf7Z9LNgxXVNTo3feeUc/+tGP\nAnqf03hu8/v000/1q1/9SmVlZTp69KjOnj2r3//+967zSktL0wMPPKAbbrhBN910k/Ly8i470+Tx\neBzPjU3jeb3eS355Eej29adpPsOGDdPHH3+s3bt362c/+1nA9//6W773339fnTp1sp4NiJZXX31V\n1dXVOnbsmEpLS/Xkk0+qtLTU8fv97a/BrL+m8YLJ79FHH9WhQ4d05513au7cuZf87OOPP9bPf/5z\n/e53vwsot0OHDmnmzJm69957JdXff5aUlKT8/HzNnTtX11577WXjvamqqio99thjeuSRR3xtTefq\n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\n",
"text": "<matplotlib.figure.Figure at 0x7f9dc194a048>"
}
],
"prompt_number": 4
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment