Skip to content

Instantly share code, notes, and snippets.

@scopatz
Last active June 13, 2019 17:41
Show Gist options
  • Save scopatz/ee78896ec5b8c221525fad14ff0be862 to your computer and use it in GitHub Desktop.
Save scopatz/ee78896ec5b8c221525fad14ff0be862 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import zlib\n",
"from base64 import urlsafe_b64encode, urlsafe_b64decode\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from cryptography.fernet import Fernet"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"key = Fernet.generate_key()\n",
"f = Fernet(key)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"datalengths = np.asarray(np.logspace(0, 7, 8), dtype=np.uint64)\n",
"compress_encrypt_zeros = np.empty(len(datalengths), dtype=np.uint64)\n",
"encrypt_compress_zeros = np.empty(len(datalengths), dtype=np.uint64)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4 µs, sys: 0 ns, total: 4 µs\n",
"Wall time: 9.54 µs\n",
"length: 1\n",
"length: 10\n",
"length: 100\n",
"length: 1000\n",
"length: 10000\n",
"length: 100000\n",
"length: 1000000\n",
"length: 10000000\n"
]
}
],
"source": [
"%time\n",
"for i, length in enumerate(datalengths):\n",
" print(f\"length: {length}\\r\")\n",
" z = np.zeros(length, dtype=np.uint64).tobytes()\n",
" # compress, then encrypt\n",
" compress_encrypt_zeros[i] = len(urlsafe_b64decode(f.encrypt(zlib.compress(z))))\n",
" # encrypt, then compress\n",
" encrypt_compress_zeros[i] = len(zlib.compress(urlsafe_b64decode(f.encrypt(z))))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f8f5d2711d0>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.loglog(datalengths, datalengths, label=\"uncompressed, unencrypted\")\n",
"plt.loglog(datalengths, compress_encrypt_zeros, label=\"compress, then encrypt\")\n",
"plt.loglog(datalengths, encrypt_compress_zeros, label=\"encrypt, then compress\")\n",
"plt.title(\"Homogenous Data\")\n",
"plt.xlabel(\"Original size [bytes]\")\n",
"plt.ylabel(\"Resultant size [bytes]\")\n",
"plt.legend(loc=0)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"compress_encrypt_rands = np.empty(len(datalengths), dtype=np.uint64)\n",
"encrypt_compress_rands = np.empty(len(datalengths), dtype=np.uint64)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 3 µs, sys: 1e+03 ns, total: 4 µs\n",
"Wall time: 6.68 µs\n",
"length: 1\n",
"length: 10\n",
"length: 100\n",
"length: 1000\n",
"length: 10000\n",
"length: 100000\n",
"length: 1000000\n",
"length: 10000000\n"
]
}
],
"source": [
"%time\n",
"for i, length in enumerate(datalengths):\n",
" print(f\"length: {length}\\r\")\n",
" z = np.random.randn(length).tobytes()\n",
" # compress, then encrypt\n",
" compress_encrypt_zeros[i] = len(urlsafe_b64decode(f.encrypt(zlib.compress(z))))\n",
" # encrypt, then compress\n",
" encrypt_compress_zeros[i] = len(zlib.compress(urlsafe_b64decode(f.encrypt(z))))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f8f5d008a20>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.loglog(datalengths, datalengths, label=\"uncompressed, unencrypted\")\n",
"plt.loglog(datalengths, compress_encrypt_zeros, label=\"compress, then encrypt\")\n",
"plt.loglog(datalengths, encrypt_compress_zeros, label=\"encrypt, then compress\")\n",
"plt.title(\"Random Data\")\n",
"plt.xlabel(\"Original size [bytes]\")\n",
"plt.ylabel(\"Resultant size [bytes]\")\n",
"plt.legend(loc=0)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"compress_rands = np.empty(len(datalengths), dtype=np.uint64)\n",
"encrypt_rands = np.empty(len(datalengths), dtype=np.uint64)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 2 µs, sys: 0 ns, total: 2 µs\n",
"Wall time: 4.53 µs\n",
"length: 1\n",
"length: 10\n",
"length: 100\n",
"length: 1000\n",
"length: 10000\n",
"length: 100000\n",
"length: 1000000\n",
"length: 10000000\n"
]
}
],
"source": [
"%time\n",
"for i, length in enumerate(datalengths):\n",
" print(f\"length: {length}\\r\")\n",
" z = np.random.randn(length).tobytes()\n",
" # compress, then encrypt\n",
" compress_rands[i] = len(zlib.compress(z))\n",
" # encrypt, then compress\n",
" encrypt_rands[i] = len(urlsafe_b64decode(f.encrypt(z)))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f8f5cee10f0>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.loglog(datalengths, datalengths, label=\"uncompressed, unencrypted\")\n",
"plt.loglog(datalengths, compress_rands, label=\"compressed\")\n",
"plt.loglog(datalengths, encrypt_rands, label=\"encrypted\")\n",
"plt.title(\"Random Data\")\n",
"plt.xlabel(\"Original size [bytes]\")\n",
"plt.ylabel(\"Resultant size [bytes]\")\n",
"plt.legend(loc=0)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"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.7.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment