Scroll indicator done
728x90

[DES]

# 암호화

######## DES 암호화 데이터
ip_table = [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 ]

inv_ip_table =[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 ]

parity_drop_table =[ 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 ]

compression_key =[ 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 ]

s1=[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 ]

s2=[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 ]

s3=[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 ]

s4=[ 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 ]

s5=[ 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 ]

s6=[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 ]

s7=[ 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]

s8=[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 ]

s=[s1,s2,s3,s4,s5,s6,s7,s8]

straight_p =[ 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 ]

plainText = "123456ABCD132536" # 16자리
key = "AABB09182736CCDD"
cipherText = "C0B7A8D05F3A829C"
######## 확장 p-box (32 -> 48 bit)
def extend_p(block):
    extend = ['0' for i in range(48)]
    extend[0], extend[47] = block[31], block[0]
    
    idx = 0
    for i in range(1, 47):
        if (i%6) == 5:
            extend[i] = block[idx]
        elif (i%6) == 0:
            extend[i] = block[idx-1]
        else: 
            extend[i] = block[idx]
            idx += 1
    return extend


######## XOR 
def xor(b1, b2):
    result = [0 for i in range(len(b1))]
    for i in range(len(b1)):
         result[i] = str(int(b1[i]) ^ int(b2[i]))
    return result
######## Round Key Generation

key = "AABB09182736CCDD"
roundsKey = ["0" for _ in range(16)]
shiftKey = ["0" for _ in range(16)]

key = "{0:b}".format(int(key, 16)).zfill(64)

pd = ['0'] * 56
for i in range(64):
    if key[i] == '1':
        if (i+1) not in parity_drop_table:
            continue
        pd[parity_drop_table.index(i+1)] = '1'
        
left, right = pd[:28], pd[28:]
rounds = [1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]
for i in range(16):
    r = rounds[i]
    left = left[rounds[i]:]+left[:rounds[i]]
    right = right[rounds[i]:]+right[:rounds[i]]
    
    shift_left = left + right
    shiftKey[i] = '{0:X}'.format(int(''.join(shift_left), 2)).zfill(12)  
    
    sl = ['0'] * 48
    for j in range(56):
        if shift_left[j] == '1':
            if (j+1) not in compression_key:
                continue
            sl[compression_key.index(j+1)] = '1'
            
    roundsKey[i] = '{0:X}'.format(int(''.join(sl), 2)).zfill(12)    
    
print('shiftKey:', shiftKey)
print()
print('roundsKey:', roundsKey)

shiftKey: ['878067567E19F4', 'F00CEBCFC33E8', '3C033AC3F0CFA3', 'F00CEB0FC33E8C', 'C033AC3F0CFA33', 'CEB0FC33E8CF', '33AC3C0CFA33F', 'CEB0F033E8CFC', '19D61E067D19F8', '67587809F467E1', '9D61E017D19F86', '7587806F467E19', 'D61E019D19F867', '5878067467E19F', '61E019D19F867D', 'C3C033A33F0CFA']

roundsKey: ['194CD072DE8C', '4568581ABCCE', '06EDA4ACF5B5', 'DA2D032B6EE3', '69A629FEC913', 'C1948E87475E', '708AD2DDB3C0', '34F822F0C66D', '84BB4473DCCC', '02765708B5BF', '6D5560AF7CA5', 'C2C1E96A4BF3', '99C31397C91F', '251B8BC717D0', '3330C5D9A36D', '181C5D75C66D']

print("plain Text >> ")
print(plainText, "\n")

bin_plainText = "{0:b}".format(int(plainText, 16)).zfill(64)

######## 1. Initial Permutaion
ip = ['0'] * 64 
for i in range(64):
    if bin_plainText[i] == '1':
        ip[ip_table.index(i+1)] = '1' 
        
ip = '{0:X}'.format(int(''.join(ip), 2))
print("After initial Permutaion >>")
print(ip, "\n")


######## 1-1. splitting
leftBlock = "{0:b}".format(int(ip[:8], 16)).zfill(32) 
rightBlock = "{0:b}".format(int(ip[8:], 16)).zfill(32) 


######## 2. Round
lb = ['0' for _ in range(17)]
rb = ['0' for _ in range(17)]

lb[0] = [leftBlock[i] for i in range(len(leftBlock))]
rb[0] = [rightBlock[i] for i in range(len(rightBlock))]

for r in range(1,17):
    rightBlock = extend_p(rb[r-1])
    k = "{0:b}".format(int(roundsKey[r-1], 16)).zfill(48)
    result = xor(k, rightBlock)
    
    s_boxes_result = ['0' for _ in range(32)]
    for i in range(8):
        row = "{0:d}".format(int(result[i*6]+result[i*6+5], 2))
        column = "{0:d}".format(int(result[i*6+1]+result[i*6+2]+result[i*6+3]+result[i*6+4], 2))
        entry = str(format(s[i][int(row)*16 + int(column)], "b").zfill(4))

        for j in range(4):
            s_boxes_result[4*i+j] = entry[j]      

    sp = ['0' for _ in range(32)]
    for i in range(32):
        if s_boxes_result[i] == '1':
            sp[straight_p.index(i+1)] = '1'
    
    if r == 16: # Round 16 은 Swap 과정 제외
        rb[r] = rb[r-1]
        lb[r] = xor(sp, lb[r-1])
    else:
        rb[r] = xor(sp, lb[r-1])
        lb[r] = rb[r-1]
        
print("Round >> ")    
print("Round      Left     Right    Round Key")
for i in range(1, len(rb)):
    print("Round", str(i).zfill(2), " ",
          '{0:X}'.format(int(''.join(lb[i]), 2)).zfill(8), 
          '{0:X}'.format(int(''.join(rb[i]), 2)).zfill(8), 
          roundsKey[i-1])
print()    


######## 3. Combination
combineBlock = lb[-1] + rb[-1]
print("After combination >>")
print('{0:X}'.format(int(''.join(combineBlock), 2)).zfill(16), "\n")


######## Final Permutation
fp = ['0'] * 64 
for i in range(64):
    if combineBlock[i] == '1':
        fp[inv_ip_table.index(i+1)] = '1' 
print("Ciphertext >>")
print('{0:X}'.format(int(''.join(fp), 2)).zfill(16))

plain Text >> 
123456ABCD132536 

After initial Permutaion >>
14A7D67818CA18AD 

Round >> 
Round        Left             Right          Round Key
Round 01   18CA18AD 5A78E394 194CD072DE8C
Round 02   5A78E394 4A1210F6 4568581ABCCE
Round 03   4A1210F6 B8089591 06EDA4ACF5B5
Round 04   B8089591 236779C2 DA2D032B6EE3
Round 05   236779C2 A15A4B87 69A629FEC913
Round 06   A15A4B87 2E8F9C65 C1948E87475E
Round 07   2E8F9C65 A9FC20A3 708AD2DDB3C0
Round 08   A9FC20A3 308BEE97 34F822F0C66D
Round 09   308BEE97 10AF9D37 84BB4473DCCC
Round 10   10AF9D37 6CA6CB20 02765708B5BF
Round 11   6CA6CB20 FF3C485F 6D5560AF7CA5
Round 12   FF3C485F 22A5963B C2C1E96A4BF3
Round 13   22A5963B 387CCDAA 99C31397C91F
Round 14   387CCDAA BD2DD2AB 251B8BC717D0
Round 15   BD2DD2AB CF26B472 3330C5D9A36D
Round 16   19BA9212 CF26B472 181C5D75C66D

After combination >>
19BA9212CF26B472 

Ciphertext >>
C0B7A8D05F3A829C

# DES 복호화

cipherText = "C0B7A8D05F3A829C"
bin_cipherText = "{0:b}".format(int(cipherText, 16)).zfill(64)

######## 1. Initial Permutation
ip = ['0'] * 64 
for i in range(64):
    if bin_cipherText[i] == '1':
        ip[ip_table.index(i+1)] = '1' 

ip = '{0:X}'.format(int(''.join(ip), 2))
print("=========== DES Reverse Cipher ===========", "\n\n")
print("Cipher Text >>")
print(cipherText, "\n")

print("After initial Permutaion >>")
print(ip, "\n")


######## 1-1. splitting
leftBlock = "{0:b}".format(int(ip[:8], 16)).zfill(32) 
rightBlock = "{0:b}".format(int(ip[8:], 16)).zfill(32) 
print("After Splitting >>")
print(ip[:8], ip[8:], "\n")


######## 2. Round
lb = ['0' for _ in range(17)]
rb = ['0' for _ in range(17)]
lb[0] = [leftBlock[i] for i in range(len(leftBlock))]
rb[0] = [rightBlock[i] for i in range(len(rightBlock))]

reverse_roundKey = list(reversed(roundsKey))

for r in range(1,17):
    rightBlock = extend_p(rb[r-1])
    k = "{0:b}".format(int(reverse_roundKey[r-1], 16)).zfill(48)
    result = xor(k, rightBlock)
    
    s_boxes_result = ['0' for _ in range(32)]
    for i in range(8):
        row = "{0:d}".format(int(result[i*6]+result[i*6+5], 2))
        column = "{0:d}".format(int(result[i*6+1]+result[i*6+2]+
                                    result[i*6+3]+result[i*6+4], 2))
        entry = str(format(s[i][int(row)*16 + int(column)], "b").zfill(4))

        for j in range(4):
            s_boxes_result[4*i+j] = entry[j]      

    sp = ['0' for _ in range(32)]
    for i in range(32):
        if s_boxes_result[i] == '1':
            sp[straight_p.index(i+1)] = '1'
    
    if r == 16: # Round 16 은 Swap 과정 제외
        rb[r] = rb[r-1]
        lb[r] = xor(sp, lb[r-1])
    else:
        rb[r] = xor(sp, lb[r-1])
        lb[r] = rb[r-1]
        
print("Round >> ")    
print("Round      Left     Right    Round Key")
for i in range(1, len(rb)):
    print("Round", str(i).zfill(2), " ",
          '{0:X}'.format(int(''.join(lb[i]), 2)).zfill(8), 
          '{0:X}'.format(int(''.join(rb[i]), 2)).zfill(8), 
          reverse_roundKey[i-1])
print()    


######## 3. Combination
combineBlock = lb[-1] + rb[-1]
print("After combination >>")
print('{0:X}'.format(int(''.join(combineBlock), 2)).zfill(16), "\n")


######## Final Permutation
fp = ['0'] * 64 
for i in range(64):
    if combineBlock[i] == '1':
        fp[inv_ip_table.index(i+1)] = '1' 
print("Plain Text >>")
print('{0:X}'.format(int(''.join(fp), 2)).zfill(16))

=========== DES Reverse Cipher =========== 


Cipher Text >>
C0B7A8D05F3A829C 

After initial Permutaion >>
19BA9212CF26B472 

After Splitting >>
19BA9212 CF26B472 

Round >> 
Round        Left            Right            Round Key
Round 01   CF26B472 BD2DD2AB 181C5D75C66D
Round 02   BD2DD2AB 387CCDAA 3330C5D9A36D
Round 03   387CCDAA 22A5963B 251B8BC717D0
Round 04   22A5963B FF3C485F 99C31397C91F
Round 05   FF3C485F 6CA6CB20 C2C1E96A4BF3
Round 06   6CA6CB20 10AF9D37 6D5560AF7CA5
Round 07   10AF9D37 308BEE97 02765708B5BF
Round 08   308BEE97 A9FC20A3 84BB4473DCCC
Round 09   A9FC20A3 2E8F9C65 34F822F0C66D
Round 10   2E8F9C65 A15A4B87 708AD2DDB3C0
Round 11   A15A4B87 236779C2 C1948E87475E
Round 12   236779C2 B8089591 69A629FEC913
Round 13   B8089591 4A1210F6 DA2D032B6EE3
Round 14   4A1210F6 5A78E394 06EDA4ACF5B5
Round 15   5A78E394 18CA18AD 4568581ABCCE
Round 16   14A7D678 18CA18AD 194CD072DE8C

After combination >>
14A7D67818CA18AD 

Plain Text >>
123456ABCD132536

728x90