# Data Encryption Standard (DES) ## DES History <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> DES atau Data Encryption Standard adalah algoritma cipher blok yang populer hampir selama dua dasawarsa karena menjadi standard algoritma enkripsi kunci simetri, DES dikembangkan di IBM dibawah kepemimpinan W. L. Tuchman pada tahun 1972 Algoritma ini didasarkan pada algoritma Lucifer yang dibuat oleh Horst Feistel. Namun saat ini standard ini telah tergantikan oleh algoritma lain karena DES dianggap tidak aman lagi. Hal ini disebabkan karena pada tahun 1998, ditemukan kunci DES dengan menggunakan pencarian brute force selama 22 jam. Padahal awalnya diasumsikan bahwa pencarian brute force minimal membutuhkan waktu 1142 tahun untuk menemukan kunci yang benar. ## DES Introduction DES termasuk ke dalam sistem kriptografi simetri dan tergolong jenis cipher blok yang beroperasi pada ukuran blok 64 bit. DES mengenkripsikan 64 bit plainteks menjadi 64 bit cipherteks dengan menggunakan 48 bit kunci internal (internal key). Kunci internal dibangkitkan dari kunci eksternal (external key) yang panjangnya 64 bit. Skema global dari algoritma DES adalah sebagai berikut : 1. Blok plainteks dan kunci diubah kedalam bentuk biner berdasarkan tabel ASCII kemudian dipermutasi dengan matriks permutasi awal (initial permutation atau <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>I</mi><mi>P</mi></math>). 2. Hasil permutasi awal kemudian di enciphering sebanyak 16 kali (16 putaran). Setiap putaran menggunakan kunci internal yang berbeda. 3. Hasil enciphering kemudian dipermutasi dengan matriks permutasi balikan (invers initial permutation atau <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>I</mi><msup><mi>P</mi><mrow><mo>-</mo><mn>1</mn></mrow></msup></math>) menjadi blok cipherteks. Untuk gambaran lebih jelasnya seperti ini: ![des](https://hackmd.io/_uploads/Sy_4t_3rp.png) ## DES Encryption Pada enkripsi algoritma DES yang pertama perlu dilakukan adalah megubah kunci dan plainteks menjadi bentuk biner sesuai dengan tabel ASCII (char code). Contoh plainteks dan kunci yang digunakan: > Plainteks : TUGUMUDA > Kunci : DINUSIAN ### Key Generation Disini kita akan mengolah kunci terlebih dahulu supaya siap digunakan untuk enciphering, ubah kunci ke bit ASCII ![image](https://hackmd.io/_uploads/rJPzMq3Sa.png) Setelah didapatkan bit ASCII, kita dapat melakukan permutasi pada kunci dengan menggunakan matriks permutasi <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mi>C</mi><mo>-</mo><mn>1</mn></math> ![image](https://hackmd.io/_uploads/SyJVQchrp.png) Lakukan permutasi dari bit kunci pada tiap cell tabel <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mi>C</mi><mo>-</mo><mn>1</mn></math>, contoh pada cell pertama tabel tersebut bernilai 57, berarti ambil bit ke-57 pada bit kunci yaitu 0 kemudian susun pada posisi pertama, lakukan seterusnya sampai seluruh cell. Didapatkanlah value : ![image](https://hackmd.io/_uploads/ByPXrchBp.png) Proses permutasi menggunakan matriks <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mi>C</mi><mo>-</mo><mn>1</mn></math> menghasilkan keluaran 56 bit kunci internal, kemudian pecah value tersebut menjadi dua bagian yaitu <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>C</mi><mrow><mn>0</mn><mo>&#xA0;</mo></mrow></msub><mi>d</mi><mi>a</mi><mi>n</mi><mo>&#xA0;</mo><msub><mi>D</mi><mi>o</mi></msub></math> dimana tiap bagian dialokasikan 28 bit dimulai dari <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>C</mi><mrow><mn>0</mn><mo>&#xA0;</mo></mrow></msub></math>lalu jika sudah terpenuhi lanjut ke <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>D</mi><mi>o</mi></msub></math>. Untuk pengalokasian ambil 7 bit dari tiap 8 bit blok awal dan sisanya alokasikan ke blok belakangnya, maka dihasilkan : ![image](https://hackmd.io/_uploads/HkSKv52HT.png) Setelah itu lakukan bit shift atau pergeseran bit ke kiri sebanyak 16 iterasi dengan jumlah pergeseran bit nya sesuai dengan tabel ini : ![image](https://hackmd.io/_uploads/S1iHuc3rp.png) Jadi maksud dari tabel tersebut adalah, pada indeks ke 1, 2, 9 dan 16 hanya dilakukan pergeseran sebanyak 1 bit, dan selain indeks tersebut lakukan pergeseran sebanyak 2 kali ![image](https://hackmd.io/_uploads/SJysd5hSa.png) Setelah dilakukan iterasi bit shift sebanyak 16 kali didapatkan: ![image](https://hackmd.io/_uploads/HJ2gtchS6.png) Lalu concat dengan axis = 1 (gabung ke kanan), seluruh hasil shift antara <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>C</mi><mrow><mn>1</mn><mo>-</mo><mn>16</mn></mrow></msub><mo>&#xA0;</mo><mi>d</mi><mi>a</mi><mi>n</mi><mo>&#xA0;</mo><msub><mi>D</mi><mrow><mn>1</mn><mo>-</mo><mn>16</mn><mo>&#xA0;</mo></mrow></msub></math>menjadi <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>C</mi><msub><mi>D</mi><mrow><mn>1</mn><mo>-</mo><mn>16</mn><mo>&#xA0;</mo></mrow></msub></math>: ![image](https://hackmd.io/_uploads/S1o1cq3S6.png) Eiittss, belum cukup sampai disini, kita perlu melakukan permutasi akhir dengan menggunakan matriks permutasi <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mi>C</mi><mo>-</mo><mn>2</mn></math>, dan akhirnya didapatkan kunci akhir yaitu <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>K</mi><mrow><mn>1</mn><mo>-</mo><mn>16</mn></mrow></msub></math> ![des2](https://hackmd.io/_uploads/B1TEj52r6.png) Berikut Saya sediakan script python yang telah Saya crafting untuk membuat automasi pembangkitan 48 bit kunci internal berdasarkan 64 bit kunci eksternal ```python # Tabel untuk permutasi kunci PC-1 permuted_choice_1 = [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] # Tabel untuk pergeseran bit pada setiap putaran left_shifts = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1] # Tabel untuk permutasi kompresi PC-2 permuted_choice_2 = [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] def string_to_bit_array(s): return [bin(ord(x))[2:].zfill(8) for x in s] def generate_internal_keys(key): key_bits = ''.join(string_to_bit_array(key)) # Ubah string ke bit ASCII key_permuted = [key_bits[i - 1] for i in permuted_choice_1] # Permutasi dengan PC-1 # Split kunci menjadi dua bagian C0 dan D0 C = key_permuted[:28] D = key_permuted[28:] internal_keys = [] for i in range(16): # Geser bit sesuai dengan tabel left_shifts for shift in range(left_shifts[i]): C = C[1:] + [C[0]] D = D[1:] + [D[0]] # Gabungkan kembali C dan D CD = C + D # Permutasi kompresi dengan PC-2 internal_key = [CD[i - 1] for i in permuted_choice_2] internal_keys.append(internal_key) return internal_keys external_key = "DINUSIAN" internal_keys = generate_internal_keys(external_key) print("Internal Keys:") for i, key in enumerate(internal_keys, 1): print(f"K{i}: {''.join(key)}") ``` Voila, kunci DES dapat di generate dengan cepat :D