In [ ]:
# This script features a comparison between the different tested ciphers
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import math
import numpy as np
figsize=(4.5, 3)
In [ ]:
# Import all CSV data files
dhe_aes128_256 = pd.read_csv("DHE-RSA-AES128-GCM-SHA256.csv")
ecdhe_aes128_256 = pd.read_csv("ECDHE-RSA-AES128-GCM-SHA256.csv")
dhe_aes256_384 = pd.read_csv("DHE-RSA-AES256-GCM-SHA384.csv")
ecdhe_aes256_384 = pd.read_csv("ECDHE-RSA-AES256-GCM-SHA384.csv")
dhe_chacha = pd.read_csv("DHE-RSA-CHACHA20-POLY1305.csv")
ecdhe_chacha = pd.read_csv("ECDHE-RSA-CHACHA20-POLY1305.csv")
ecdhe_chacha
In [ ]:
# Extract the data for only one connection
dhe_aes128_256_1C = dhe_aes128_256[dhe_aes128_256['numConns'] == 1]
ecdhe_aes128_256_1C = ecdhe_aes128_256[ecdhe_aes128_256['numConns'] == 1]
dhe_aes256_384_1C = dhe_aes256_384[dhe_aes256_384['numConns'] == 1]
ecdhe_aes256_384_1C = ecdhe_aes256_384[ecdhe_aes256_384['numConns'] == 1]
dhe_chacha_1C = dhe_chacha[dhe_chacha['numConns'] == 1]
ecdhe_chacha_1C = ecdhe_chacha[ecdhe_chacha['numConns'] == 1]
In [ ]:
# Normalize the needed data
for i,r in dhe_aes128_256_1C.iterrows():
r['openssl'] /= r['numBytes']
r['numBytes'] = math.log10(r['dataLen'])
for i,r in ecdhe_aes128_256_1C.iterrows():
r['openssl'] /= r['numBytes']
r['numBytes'] = math.log10(r['dataLen'])
for i,r in dhe_aes256_384_1C.iterrows():
r['openssl'] /= r['numBytes']
r['numBytes'] = math.log10(r['dataLen'])
for i,r in ecdhe_aes256_384_1C.iterrows():
r['openssl'] /= r['numBytes']
r['numBytes'] = math.log10(r['dataLen'])
for i,r in dhe_chacha_1C.iterrows():
r['openssl'] /= r['numBytes']
r['numBytes'] = math.log10(r['dataLen'])
for i,r in ecdhe_chacha_1C.iterrows():
r['openssl'] /= r['numBytes']
r['numBytes'] = math.log10(r['dataLen'])
In [ ]:
# Plot the cost of the denseMap in relationship to the cipher and the size of the data transfer
fig = plt.figure(figsize=(7, 4), dpi=300)
ax = fig.gca(projection='3d')
ax.plot(dhe_aes128_256_1C['numBytes'], dhe_aes128_256_1C['openssl'], zs=0, zdir='y', label='dhe128')
ax.plot(ecdhe_aes128_256_1C['numBytes'], ecdhe_aes128_256_1C['openssl'], zs=1, zdir='y', label='ecdhe128')
ax.plot(dhe_aes256_384_1C['numBytes'], dhe_aes256_384_1C['openssl'], zs=2, zdir='y', label='dhe256')
ax.plot(ecdhe_aes256_384_1C['numBytes'], ecdhe_aes256_384_1C['openssl'], zs=3, zdir='y', label='ecdhe256')
ax.plot(dhe_chacha_1C['numBytes'], dhe_chacha_1C['openssl'], zs=4, zdir='y', label='dheChaCha')
ax.plot(ecdhe_chacha_1C['numBytes'], ecdhe_chacha_1C['openssl'], zs=5, zdir='y', label='ecdheChaCha')
ax.set_xlim(2, 7)
ax.set_xlabel('Bytes 10^x')
ax.set_zlim(0, 60000)
ax.set_zlabel('Cycles')
ax.set_ylim(0, 5)
ax.set_ylabel('Sample')
ax.legend()
plt.savefig('output/openssl_cipher_3d.pdf',bbox_inches='tight')
plt.show()
In [ ]:
# Same as above in 2D
fig = plt.figure(figsize=(4.5, 3), dpi=300)
plt.plot(dhe_aes128_256_1C['numBytes'], dhe_aes128_256_1C['openssl'], label='dhe128')
plt.plot(ecdhe_aes128_256_1C['numBytes'], ecdhe_aes128_256_1C['openssl'], label='ecdhe128')
plt.plot(dhe_aes256_384_1C['numBytes'], dhe_aes256_384_1C['openssl'], label='dhe256')
plt.plot(ecdhe_aes256_384_1C['numBytes'], ecdhe_aes256_384_1C['openssl'], label='ecdhe256')
plt.plot(dhe_chacha_1C['numBytes'], dhe_chacha_1C['openssl'], label='dheChaCha')
plt.plot(dhe_chacha_1C['numBytes'], dhe_chacha_1C['openssl'], label='ecdheChaCha')
plt.semilogy()
plt.ylim([1,100000])
plt.xlabel('Bytes 10^x')
plt.ylabel('Cycles per Byte')
plt.title("Cost of OpenSSL by data length")
plt.legend()
plt.grid(b=True)
plt.savefig('output/openssl_cipher_2d.pdf',bbox_inches='tight')
plt.show()
In [ ]:
# Plot the cost of the SipHash-2-4
fig = plt.figure(figsize=figsize, dpi=300)
# Plot the normalized data
plt.plot(dhe_aes128_256_1C['numPkts'],
dhe_aes128_256_1C['siphash'] / dhe_aes128_256_1C['numPkts'],
label="dhe128")
plt.plot(ecdhe_aes128_256_1C['numPkts'],
ecdhe_aes128_256_1C['siphash'] / ecdhe_aes128_256_1C['numPkts'],
label="ecdhe128")
plt.plot(dhe_aes256_384_1C['numPkts'],
dhe_aes256_384_1C['siphash'] / dhe_aes256_384_1C['numPkts'],
label="dhe128")
plt.plot(ecdhe_aes256_384_1C['numPkts'],
ecdhe_aes256_384_1C['siphash'] / ecdhe_aes256_384_1C['numPkts'],
label="ecdhe128")
plt.plot(dhe_chacha_1C['numPkts'],
dhe_chacha_1C['siphash'] / dhe_chacha_1C['numPkts'],
label="dhe128")
plt.plot(ecdhe_chacha_1C['numPkts'],
ecdhe_chacha_1C['siphash'] / ecdhe_chacha_1C['numPkts'],
label="ecdhe128")
plt.loglog(basex=2, basey=2)
#plt.ylim([1,100000])
plt.ylim([1,2**13])
plt.xlabel('#Packets')
plt.ylabel('Cycles per Packet')
plt.title("Cost of SipHash by #Pkts")
plt.grid(b=True)
plt.legend()
plt.savefig('output/siphash_cipher.pdf',bbox_inches='tight')
plt.show()
In [ ]:
# Produce a stacked bar chart for cost points
# 10000000 bytes transfered
# Always use mean of all ciphers
dataSetsRaw = [dhe_aes128_256, ecdhe_aes128_256, dhe_aes256_384, ecdhe_aes256_384, dhe_chacha, ecdhe_chacha]
dataSetsFiltered = []
categories = ['memory', 'siphash', 'tbb', 'denseMap', 'openssl']
N = len(categories)
for dat in dataSetsRaw:
dataSetsFiltered += [dat[dat['dataLen'] == 10000000]]
#for dat in dataSetsFiltered:
# print(dat)
for dat in dataSetsFiltered:
for _,r in dat.iterrows():
r['openssl'] /= r['numPkts']
r['denseMap'] /= r['numPkts']
r['tbb'] /= r['numPkts']
r['siphash'] /= r['numPkts']
r['memory'] /= r['numPkts']
#for dat in dataSetsFiltered:
# print(dat)
dataSetsFiltered
means = []
for cat in categories:
cur = []
for dat in dataSetsFiltered:
cur += [int(dat[cat].mean())]
means += [cur]
#print(means)
stacks = []
fig = plt.figure(figsize=figsize, dpi=300)
ind = np.arange(len(dataSetsRaw))
width = 0.35
cutLower = [0] * (len(dataSetsRaw))
for cat in means:
print(cat)
stacks += [plt.bar(ind, cat, width, bottom=cutLower)]
for x in range(0,len(dataSetsRaw)):
cutLower[x] += cat[x]
plt.ylabel('Cycles')
plt.title('Cycles per category - 10000000 Bytes')
plt.xticks(ind, ('dhe128', 'ec128', 'dhe256', 'ec256', 'dheCha', 'ecCha'))
#plt.yticks(np.arange(0, 81, 10))
plt.legend((stacks[0][0], stacks[1][0], stacks[2][0], stacks[3][0], stacks[4][0]),
(categories[0],categories[1],categories[2],categories[3],categories[4]),
bbox_to_anchor=(1, 1))
fig.savefig('output/stack_bar_all_10000000.pdf',bbox_inches='tight')
plt.show()
In [ ]:
# Produce a stacked bar chart for cost points
# 1000 bytes transfered
# Always use mean of all ciphers
dataSetsRaw = [dhe_aes128_256, ecdhe_aes128_256, dhe_aes256_384, ecdhe_aes256_384, dhe_chacha, ecdhe_chacha]
dataSetsFiltered = []
categories = ['memory', 'siphash', 'tbb', 'denseMap', 'openssl']
N = len(categories)
for dat in dataSetsRaw:
dataSetsFiltered += [dat[dat['dataLen'] == 1000]]
#for dat in dataSetsFiltered:
# print(dat)
[print("{" + str(r['numConns']) + "," + str(r['openssl'] / r['numConns']) + "},", end='') for _,r in dataSetsFiltered[1].iterrows()]
for dat in dataSetsFiltered:
for _,r in dat.iterrows():
r['openssl'] /= r['numPkts']
r['denseMap'] /= r['numPkts']
r['tbb'] /= r['numPkts']
r['siphash'] /= r['numPkts']
r['memory'] /= r['numPkts']
#for dat in dataSetsFiltered:
# print(dat)
dataSetsFiltered
means = []
for cat in categories:
cur = []
for dat in dataSetsFiltered:
cur += [int(dat[cat].mean())]
means += [cur]
#print(means)
stacks = []
fig = plt.figure(figsize=figsize, dpi=300)
ind = np.arange(len(dataSetsRaw))
width = 0.35
cutLower = [0] * (len(dataSetsRaw))
for cat in means:
stacks += [plt.bar(ind, cat, width, bottom=cutLower)]
for x in range(0,len(dataSetsRaw)):
cutLower[x] += cat[x]
plt.ylabel('Cycles')
plt.title('Cycles per category - 1000 Bytes')
plt.xticks(ind, ('dhe128', 'ec128', 'dhe256', 'ec256', 'dheCha', 'ecCha'))
#plt.yticks(np.arange(0, 81, 10))
plt.legend((stacks[0][0], stacks[1][0], stacks[2][0], stacks[3][0], stacks[4][0]),
(categories[0],categories[1],categories[2],categories[3],categories[4]),
bbox_to_anchor=(1, 1))
fig.savefig('output/stack_bar_all_1000.pdf',bbox_inches='tight')
plt.show()
In [ ]:
# Produce a stacked bar chart for cost points, except openssl
# 10000000 bytes transfered
# Always use mean of all ciphers
dataSetsRaw = [dhe_aes128_256, ecdhe_aes128_256, dhe_aes256_384, ecdhe_aes256_384, dhe_chacha, ecdhe_chacha]
dataSetsFiltered = []
categories = ['memory', 'siphash', 'tbb', 'denseMap']
N = len(categories)
for dat in dataSetsRaw:
dataSetsFiltered += [dat[dat['dataLen'] == 10000000]]
#for dat in dataSetsFiltered:
# print(dat)
for dat in dataSetsFiltered:
for _,r in dat.iterrows():
r['openssl'] /= r['numPkts']
r['denseMap'] /= r['numPkts']
r['tbb'] /= r['numPkts']
r['siphash'] /= r['numPkts']
r['memory'] /= r['numPkts']
#for dat in dataSetsFiltered:
# print(dat)
means = []
for cat in categories:
cur = []
for dat in dataSetsFiltered:
cur += [int(dat[cat].mean())]
means += [cur]
#print(means)
stacks = []
fig = plt.figure(figsize=figsize, dpi=300)
ind = np.arange(len(dataSetsRaw))
width = 0.35
cutLower = [0] * (len(dataSetsRaw))
for cat in means:
stacks += [plt.bar(ind, cat, width, bottom=cutLower)]
for x in range(0,len(dataSetsRaw)):
cutLower[x] += cat[x]
plt.ylabel('Cycles')
plt.title('Cycles per category - 10000000 Bytes')
plt.xticks(ind, ('dhe128', 'ec128', 'dhe256', 'ec256', 'dheCha', 'ecCha'))
#plt.yticks(np.arange(0, 81, 10))
plt.legend((stacks[3][0], stacks[2][0], stacks[1][0], stacks[0][0]),
(categories[3],categories[2],categories[1],categories[0]),
bbox_to_anchor=(1, 1))
fig.savefig('output/stack_bar_noSSL_10000000.pdf',bbox_inches='tight')
plt.show()
In [ ]:
# Produce a stacked bar chart for cost points, except openssl
# 1000 bytes transfered
# Always use mean of all ciphers
dataSetsRaw = [dhe_aes128_256, ecdhe_aes128_256, dhe_aes256_384, ecdhe_aes256_384, dhe_chacha, ecdhe_chacha]
dataSetsFiltered = []
categories = ['memory', 'siphash', 'tbb', 'denseMap']
N = len(categories)
for dat in dataSetsRaw:
dataSetsFiltered += [dat[dat['dataLen'] == 1000]]
#for dat in dataSetsFiltered:
# print(dat)
for dat in dataSetsFiltered:
for _,r in dat.iterrows():
r['openssl'] /= r['numPkts']
r['denseMap'] /= r['numPkts']
r['tbb'] /= r['numPkts']
r['siphash'] /= r['numPkts']
r['memory'] /= r['numPkts']
#for dat in dataSetsFiltered:
# print(dat)
means = []
for cat in categories:
cur = []
for dat in dataSetsFiltered:
cur += [int(dat[cat].mean())]
means += [cur]
stacks = []
fig = plt.figure(figsize=figsize, dpi=300)
ind = np.arange(len(dataSetsRaw))
width = 0.35
cutLower = [0] * (len(dataSetsRaw))
for cat in means:
stacks += [plt.bar(ind, cat, width, bottom=cutLower)]
for x in range(0,len(dataSetsRaw)):
cutLower[x] += cat[x]
plt.ylabel('Cycles')
plt.title('Cycles per category - 1000 Bytes')
plt.xticks(ind, ('dhe128', 'ec128', 'dhe256', 'ec256', 'dheCha', 'ecCha'))
#plt.yticks(np.arange(0, 81, 10))
plt.legend((stacks[3][0], stacks[2][0], stacks[1][0], stacks[0][0]),
(categories[3],categories[2],categories[1],categories[0]),
bbox_to_anchor=(1, 1))
fig.savefig('output/stack_bar_noSSL_1000.pdf',bbox_inches='tight')
plt.show()
In [ ]: