Question

In: Computer Science

Writ a Python Program that illustrate the DES algorithm 1-Not allowed to use any crypto libraries...

Writ a Python Program that illustrate the DES algorithm

1-Not allowed to use any crypto libraries

2- The whole algorithm must be implemented from scratch

2- The code must be properly commented

Please don’t use librae’s or any code on the internet

Solutions

Expert Solution



# Hexadecimal to binary conversion


def hex(s):
    mp = {'0': "0000",

          '1': "0001",

          '2': "0010",

          '3': "0011",

          '4': "0100",

          '5': "0101",

          '6': "0110",

          '7': "0111",

          '8': "1000",

          '9': "1001",

          'A': "1010",

          'B': "1011",

          'C': "1100",

          'D': "1101",

          'E': "1110",

          'F': "1111"}

    bin = ""

    for i in range(len(s)):
        bin = bin + mp[s[i]]

    return bin


# Binary to hexadecimal conversion

def bin(s):
    mp = {"0000": '0',

          "0001": '1',

          "0010": '2',

          "0011": '3',

          "0100": '4',

          "0101": '5',

          "0110": '6',

          "0111": '7',

          "1000": '8',

          "1001": '9',

          "1010": 'A',

          "1011": 'B',

          "1100": 'C',

          "1101": 'D',

          "1110": 'E',

          "1111": 'F'}

    hex = ""

    for i in range(0, len(s), 4):
        ch = ""

        ch = ch + s[i]

        ch = ch + s[i + 1]

        ch = ch + s[i + 2]

        ch = ch + s[i + 3]

        hex = hex + mp[ch]

    return hex


# Binary to decimal conversion

def bin_to_dec(binary):
    binary1 = binary

    decimal, i, n = 0, 0, 0

    while (binary != 0):
        dec = binary % 10

        decimal = decimal + dec * pow(2, i)

        binary = binary // 10

        i += 1

    return decimal


# Decimal to binary conversion

def dec2bin(num):
    res = bin(num).replace("0b", "")

    if (len(res) % 4 != 0):

        div = len(res) / 4

        div = int(div)

        counter = (4 * (div + 1)) - len(res)

        for i in range(0, counter):
            res = '0' + res

    return res


# Permute function to rearrange the bits

def permute(k, arr, n):
    permutation = ""

    for i in range(0, n):
        permutation = permutation + k[arr[i] - 1]

    return permutation


# shifting the bits towards left by nth shifts

def shift_left(k, nth_shifts):
    s = ""

    for i in range(nth_shifts):

        for j in range(1, len(k)):
            s = s + k[j]

        s = s + k[0]

        k = s

        s = ""

    return k


# calculating xow of two strings of binary number a and b

def xor(a, b):
    ans = ""

    for i in range(len(a)):

        if a[i] == b[i]:

            ans = ans + "0"

        else:

            ans = ans + "1"

    return ans


# Table of Position of 64 bits at initail level: Initial Permutation Table

initial_perm = [58, 50, 42, 34, 26, 18, 10, 2,

                60, 52, 44, 36, 28, 20, 12, 4,

                62, 54, 46, 38, 30, 22, 14, 6,

                64, 56, 48, 40, 32, 24, 16, 8,

                57, 49, 41, 33, 25, 17, 9, 1,

                59, 51, 43, 35, 27, 19, 11, 3,

                61, 53, 45, 37, 29, 21, 13, 5,

                63, 55, 47, 39, 31, 23, 15, 7]

# Expansion D-box Table

exp_d = [32, 1, 2, 3, 4, 5, 4, 5,

         6, 7, 8, 9, 8, 9, 10, 11,

         12, 13, 12, 13, 14, 15, 16, 17,

         16, 17, 18, 19, 20, 21, 20, 21,

         22, 23, 24, 25, 24, 25, 26, 27,

         28, 29, 28, 29, 30, 31, 32, 1]

# Straight Permutaion Table

per = [16, 7, 20, 21,

       29, 12, 28, 17,

       1, 15, 23, 26,

       5, 18, 31, 10,

       2, 8, 24, 14,

       32, 27, 3, 9,

       19, 13, 30, 6,

       22, 11, 4, 25]

# S-box Table

sbox = [[[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],

         [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],

         [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],

         [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]],

        [[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],

         [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],

         [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],

         [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]],

        [[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],

         [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],

         [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],

         [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]],

        [[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],

         [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],

         [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],

         [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]],

        [[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],

         [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],

         [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],

         [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]],

        [[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],

         [10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],

         [9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],

         [4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]],

        [[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],

         [13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],

         [1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],

         [6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]],

        [[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],

         [1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],

         [7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],

         [2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]]]

# Final Permutaion Table

final_perm = [40, 8, 48, 16, 56, 24, 64, 32,

              39, 7, 47, 15, 55, 23, 63, 31,

              38, 6, 46, 14, 54, 22, 62, 30,

              37, 5, 45, 13, 53, 21, 61, 29,

              36, 4, 44, 12, 52, 20, 60, 28,

              35, 3, 43, 11, 51, 19, 59, 27,

              34, 2, 42, 10, 50, 18, 58, 26,

              33, 1, 41, 9, 49, 17, 57, 25]


def encrypt(pt, rkb, rk):
    pt = hex(pt)

    # Initial Permutation

    pt = permute(pt, initial_perm, 64)

    print("After inital permutation", bin(pt))

    # Splitting

    left = pt[0:32]

    right = pt[32:64]

    for i in range(0, 16):

        # Expansion D-box: Expanding the 32 bits data into 48 bits

        right_expanded = permute(right, exp_d, 48)

        # XOR RoundKey[i] and right_expanded

        xor_x = xor(right_expanded, rkb[i])

        # S-boxex: substituting the value from s-box table by calculating row and column

        sbox_str = ""

        for j in range(0, 8):
            row = bin_to_dec(int(xor_x[j * 6] + xor_x[j * 6 + 5]))

            col = bin_to_dec(int(xor_x[j * 6 + 1] + xor_x[j * 6 + 2] + xor_x[j * 6 + 3] + xor_x[j * 6 + 4]))

            val = sbox[j][row][col]

            sbox_str = sbox_str + dec2bin(val)

        # Straight D-box: After substituting rearranging the bits

        sbox_str = permute(sbox_str, per, 32)

        # XOR left and sbox_str

        result = xor(left, sbox_str)

        left = result

        # Swapper

        if (i != 15):
            left, right = right, left

        print("Round ", i + 1, " ", bin(left), " ", bin(right), " ", rk[i])

    # Combination

    combine = left + right

    # Final permutaion: final rearranging of bits to get cipher text

    cipher_text = permute(combine, final_perm, 64)

    return cipher_text


pt = "123456ABCD132536"

key = "AABB09182736CCDD"

# Key generation

# --hex to binary

key = hex(key)

# --parity bit drop table

keyp = [57, 49, 41, 33, 25, 17, 9,

        1, 58, 50, 42, 34, 26, 18,

        10, 2, 59, 51, 43, 35, 27,

        19, 11, 3, 60, 52, 44, 36,

        63, 55, 47, 39, 31, 23, 15,

        7, 62, 54, 46, 38, 30, 22,

        14, 6, 61, 53, 45, 37, 29,

        21, 13, 5, 28, 20, 12, 4]

# getting 56 bit key from 64 bit using the parity bits

key = permute(key, keyp, 56)

# Number of bit shifts

shift_table = [1, 1, 2, 2,

               2, 2, 2, 2,

               1, 2, 2, 2,

               2, 2, 2, 1]

# Key- Compression Table : Compression of key from 56 bits to 48 bits

key_comp = [14, 17, 11, 24, 1, 5,

            3, 28, 15, 6, 21, 10,

            23, 19, 12, 4, 26, 8,

            16, 7, 27, 20, 13, 2,

            41, 52, 31, 37, 47, 55,

            30, 40, 51, 45, 33, 48,

            44, 49, 39, 56, 34, 53,

            46, 42, 50, 36, 29, 32]

# Splitting

left = key[0:28]  # rkb for RoundKeys in binary

right = key[28:56]  # rk for RoundKeys in hexadecimal

rkb = []

rk = []

for i in range(0, 16):
    # Shifting the bits by nth shifts by checking from shift table

    left = shift_left(left, shift_table[i])

    right = shift_left(right, shift_table[i])

    # Combination of left and right string

    combine_str = left + right

    # Compression of key from 56 to 48 bits

    round_key = permute(combine_str, key_comp, 48)

    rkb.append(round_key)

    rk.append(bin(round_key))

print("Encryption")

cipher_text = bin(encrypt(pt, rkb, rk))

print("Cipher Text : ", cipher_text)

print("Decryption")

rkb_rev = rkb[::-1]

rk_rev = rk[::-1]

text = bin(encrypt(cipher_text, rkb_rev, rk_rev))

print("Plain Text : ", text)

Note : Please like the answer if its satisfying if its not then please leave a comment i will reply to it asap


Related Solutions

Writ a Python Program that illustrate the DES algorithm 1-Not allowed to use any crypto libraries...
Writ a Python Program that illustrate the DES algorithm 1-Not allowed to use any crypto libraries 2- The whole algorithm must be implemented from scratch 2- The code must be properly commented Please don’t use librae’s or any code on the internet please do the code for me i have posted this many times
Python - No libraries - No count() function allowed You need to travel 100 miles via...
Python - No libraries - No count() function allowed You need to travel 100 miles via rental car. There are several cars on the lot to choose from, each with their own MPG (miles per gallon) rating. Some cars have a manual transmission, while others do not (they're automatic). The price for gas in the area is $3 per gallon. Cars that have a manual transmission get a 10% discount at the pump. To streamline your selection, the car rental...
how can we use cryptography libraries in Python
how can we use cryptography libraries in Python
#1    Write  a simple array program that:    Des not use an “external class & demo      program"    [If you wish, you...
#1    Write  a simple array program that:    Des not use an “external class & demo      program"    [If you wish, you may break it down into methods, but that is NOT         required.]    a.     Set up 4 arrays which each hold 6 employee’s data:              int[ ] empid              int[ ] hours              double[ ] rate              double[ ] wages          b.     Set up loops to load the empid, hours and rate arrays    c.     Set up a loop to calculate values for the wages array. TAKE OVERTIME [hours > 40],  INTO CONSIDERATION, thru the use  of...
Discuss any API / libraries of your favorite programming language (e.g. python, c#, java etc.) that...
Discuss any API / libraries of your favorite programming language (e.g. python, c#, java etc.) that you have used/reused in any of your previous projects and how it contributes to the overall project.
Write a Python program that: Create the algorithm in both flowchart and pseudocode forms for the...
Write a Python program that: Create the algorithm in both flowchart and pseudocode forms for the following requirements: Reads in a series of positive integers,  one number at a time;  and Calculate the product (multiplication) of all the integers less than 25,  and Calculate the sum (addition) of all the integers greater than or equal to 25. Use 0 as a sentinel value, which stops the input loop. [ If the input is 0 that means the end of the input list. ]...
Write a design algorithm and a python program which asks the user for the length of...
Write a design algorithm and a python program which asks the user for the length of the three sides of two triangles. It should compute the perimeter of the two triangles and display it. It should also display which triangle has the greater perimeter. If both have the same perimeter it should display that the perimeters are the same. Formula: Perimeter of triangleA = (side1A + side2A +side3A) See the 2 sample outputs. Enter side1 of TriangleA: 2 Enter side2...
Python English algorithm explanation Write a program that asks the user for the name of a...
Python English algorithm explanation Write a program that asks the user for the name of a file in the current directory. Then, open the file and process the content of the file. 1)If the file contains words that appear more than once, print “We found duplicates.” 2)If the file does not contain duplicate words, print “There are no duplicates.”
Python English algorithm explanation Write a program that asks the user for the name of a...
Python English algorithm explanation Write a program that asks the user for the name of a file in the current directory. Then, open the file and process the content of the file. 1)If the file contains words that appear more than once, print “We found duplicates.” 2)If the file does not contain duplicate words, print “There are no duplicates.”
1. Bob wants to use DES to make a secured communication with Alice using DES key...
1. Bob wants to use DES to make a secured communication with Alice using DES key ‘Kb’ to encrypt and decrypt data. Bob uses PKI method to distribute the DES key to Alice. If Alice private key is ‘Kpa’, and her public key is ‘Kpb’. Please describe the process that Bob can send his DES key ‘Kb’ to Alice securely. 2. You receive a message that was encoded using a block encoding scheme with the encoding matrix M=3275 Verify by...
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT