{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sympy\n", "import random\n", "import time\n", "from scipy.special import lambertw\n", "import numpy as np\n", "\n", "\n", "def egcd(a, b):\n", " x,y, u,v = 0,1, 1,0\n", " while a != 0:\n", " q, r = b//a, b%a\n", " m, n = x-u*q, y-v*q\n", " b,a, x,y, u,v = a,r, u,v, m,n\n", " return b, x, y\n", "\n", "def mod_inverse(a, m):\n", " g, x, _ = egcd(a, m)\n", " if g != 1:\n", " return None \n", " else:\n", " return x % m\n", "\n", "def padding(plain_text,block_size):\n", " plain_text += '0'*(block_size-len(plain_text))\n", " return plain_text\n", "\n", "def chunkstring(string, length):\n", " return list(string[0+i:length+i] for i in range(0, len(string), length))\n", "\n", "def Rotate(lists, num): # Right is default\n", " output_list = [] \n", " for item in range(len(lists) - num, len(lists)): \n", " output_list.append(lists[item]) \n", " for item in range(0, len(lists) - num): \n", " output_list.append(lists[item]) \n", " return output_list \n", "\n", "def evolve_primes_list(sample,shift_factor):\n", " right = sample[len(sample)//2+1:]\n", " left = sample[:len(sample)//2]\n", " rotated_right = Rotate(right,num=shift_factor%len(right))\n", " rotated_left = Rotate(left,num=len(left)-(shift_factor%len(left)))\n", " rotated_left.append(sample[len(sample)//2])\n", " final = rotated_left + rotated_right\n", " return final\n", "\n", "def calculate_blocksize(n):\n", " num = int(np.sqrt(n))\n", " if num**2 num_blocks//2:\n", " temp = temp[:num_blocks//2+shift_factor]\n", " # print(temp)\n", " primes_list_permutations.append(temp)\n", " return primes_list_permutations\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "m_vals = [1,2,4,8,16,32,64]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0002334117889404297\n", "0.00023365020751953125\n", "0.00022602081298828125\n", "0.00026154518127441406\n", "0.00026297569274902344\n", "0.0002903938293457031\n", "0.0003228187561035156\n", "0.002141714096069336\n", "0.002134561538696289\n", "0.0021948814392089844\n", "0.0023703575134277344\n", "0.0026276111602783203\n", "0.0028901100158691406\n", "0.0034270286560058594\n", "0.02405261993408203\n", "0.02383899688720703\n", "0.027677297592163086\n", "0.02807927131652832\n", "0.030705690383911133\n", "0.03352713584899902\n", "0.040740013122558594\n", "0.2686643600463867\n", "0.27228569984436035\n", "0.29938673973083496\n", "0.31720471382141113\n", "0.3414897918701172\n", "0.38620495796203613\n", "0.4794628620147705\n", "2.9847683906555176\n", "3.038648843765259\n", "3.3656866550445557\n", "3.491905450820923\n", "3.809527635574341\n", "4.363171815872192\n", "5.6563355922698975\n" ] } ], "source": [ "epochs = 5\n", "t_lst = []\n", "for i in range(1,epochs+1):\n", " plaintext = 'abcdefghij'*(10**i)\n", " temp_t = []\n", " for m in m_vals:\n", " blocksize = calculate_blocksize(len(plaintext))\n", " if blocksize%2 == 0:\n", " blocksize -= 1\n", " \n", " plain_text_chunks = []\n", " if len(plaintext) < blocksize:\n", " plain_text_chunks.append(padding(plaintext,blocksize))\n", " else:\n", " chunks = chunkstring(plaintext,blocksize)\n", " for i in range(len(chunks)):\n", " plain_text_chunks.append(padding(chunks[i],blocksize))\n", " ascii_chunks = []\n", " for chunk in plain_text_chunks:\n", " t = []\n", " for i in chunk:\n", " t.append(ord(i))\n", " ascii_chunks.append(t)\n", " num_blocks = len(ascii_chunks)\n", "\n", " # Fixing the value of q based on blocksize using prime number theory\n", " n = np.exp(-lambertw(-1/blocksize,k=-1))\n", " n = int(n.real)\n", " q = sympy.ntheory.generate.nextprime(n,ith=1)\n", "# print(blocksize)\n", " prime_list = []\n", " count = 0\n", " while True:\n", " if count == blocksize:\n", " break\n", " p = sympy.prime(random.randint(1,blocksize))\n", " if p not in prime_list and mod_inverse(p,q**m)!=None:\n", " prime_list.append(p)\n", " count += 1\n", "# print(prime_list)\n", " prime_list_permutations = get_prime_list_permutations(prime_list,num_blocks)\n", "\n", " t1 = time.time()\n", "\n", " encrypted_cipher = []\n", " for chunk in range(len(ascii_chunks)):\n", " cipher = []\n", " for c in range(len(ascii_chunks[chunk])):\n", " cipher.append((ascii_chunks[chunk][c]*prime_list_permutations[chunk][c])%(q**m))\n", " encrypted_cipher.append(cipher)\n", "\n", " # print('\\nDecrypted : ')\n", " decrypted_ascii_chunks = []\n", " for chunk in range(len(encrypted_cipher)):\n", " temp_ascii = []\n", " for k in range(len(encrypted_cipher[chunk])):\n", " temp_ascii.append((encrypted_cipher[chunk][k]*mod_inverse(prime_list_permutations[chunk][k],q**m))%q**m)\n", " decrypted_ascii_chunks.append(temp_ascii)\n", " # print(decrypted_ascii_chunks)\n", "\n", " decrypted_text_list = []\n", " for chunk in decrypted_ascii_chunks:\n", " for i in chunk:\n", " if chr(i)!='0':\n", " decrypted_text_list.append(chr(i))\n", "\n", " runtime = time.time()-t1\n", " print(runtime)\n", " temp_t.append(runtime)\n", " t_lst.append(temp_t)\n", " " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Stringlength \t\t 1 \t\t 2 \t\t 4 \t\t 8 \t\t 16 \t\t 32 \t\t 64\n", "10^2\t\t0.0002334117889404297\t\t0.00023365020751953125\t\t0.00022602081298828125\t\t0.00026154518127441406\t\t0.00026297569274902344\t\t0.0002903938293457031\t\t0.0003228187561035156\n", "10^3\t\t0.002141714096069336\t\t0.002134561538696289\t\t0.0021948814392089844\t\t0.0023703575134277344\t\t0.0026276111602783203\t\t0.0028901100158691406\t\t0.0034270286560058594\n", "10^4\t\t0.02405261993408203\t\t0.02383899688720703\t\t0.027677297592163086\t\t0.02807927131652832\t\t0.030705690383911133\t\t0.03352713584899902\t\t0.040740013122558594\n", "10^5\t\t0.2686643600463867\t\t0.27228569984436035\t\t0.29938673973083496\t\t0.31720471382141113\t\t0.3414897918701172\t\t0.38620495796203613\t\t0.4794628620147705\n", "10^6\t\t2.9847683906555176\t\t3.038648843765259\t\t3.3656866550445557\t\t3.491905450820923\t\t3.809527635574341\t\t4.363171815872192\t\t5.6563355922698975\n" ] } ], "source": [ "print('Stringlength \\t\\t 1 \\t\\t 2 \\t\\t 4 \\t\\t 8 \\t\\t 16 \\t\\t 32 \\t\\t 64')\n", "time_m_1 = []\n", "time_m_2 = []\n", "time_m_4 = []\n", "time_m_8 = []\n", "time_m_16 = []\n", "time_m_32 = []\n", "time_m_64 = []\n", "\n", "for t in range(len(t_lst)):\n", " time_m_1.append(t_lst[t][0])\n", " time_m_2.append(t_lst[t][1])\n", " time_m_4.append(t_lst[t][2])\n", " time_m_8.append(t_lst[t][3])\n", " time_m_16.append(t_lst[t][4])\n", " time_m_32.append(t_lst[t][5])\n", " time_m_64.append(t_lst[t][6])\n", " print('10^'+str(t+2)+'\\t\\t'+str(t_lst[t][0])+'\\t\\t'+str(t_lst[t][1])+'\\t\\t'+str(t_lst[t][2])+'\\t\\t'+str(t_lst[t][3])+'\\t\\t'+str(t_lst[t][4])+'\\t\\t'+str(t_lst[t][5])+'\\t\\t'+str(t_lst[t][6]))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot as plt\n", "%matplotlib inline\n", "\n", "x = []\n", "for i in range(1,epochs+1):\n", " x.append(10**i)\n", "\n", "plt.plot(x, time_m_1,'-', label =\"1\") \n", "plt.plot(x, time_m_2, '-', label =\"2\")\n", "plt.plot(x, time_m_4, '-', label =\"4\")\n", "plt.plot(x, time_m_8,'-', label =\"8\") \n", "plt.plot(x, time_m_16, '-', label =\"16\")\n", "plt.plot(x, time_m_32, '-', label =\"32\")\n", "plt.plot(x, time_m_64,'-', label =\"64\") \n", "\n", "#plt.title('Stringlength vs runtime')\n", "plt.xlabel('Stringlength')\n", "plt.ylabel('Runtime')\n", "plt.legend(loc=\"best\",title=\"values of m\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.8.2" } }, "nbformat": 4, "nbformat_minor": 4 }