Program Decrypt dan Encrypt Password Sederhana Linked List C++



wellcome back

 

Oke langsung aja kalo kalian lagi nyari referensi buat tugas yang sejenis, mungkin ini bisa jadi solusi.

1.      Buat program untuk enkripsi dan dekripsi password yang memanfaatkan Linked List, dengan spesifikasi :

·         Panjang password minimal 6 digit.

·         Isi password terserah dari user dan password diinputkan terlebih dahulu sebelumnya (penambahan data di belakang).

·         Enkripsi dilakukan dengan memindahkan 3 node terakhir, menjadi node terdepan. Kemudian sisipkan 1 karakter baru sebagai kunci setelah node ketiga dari yang dipindahkan tersebut.

·         Ilustrasi

                  



·         Lakukan juga proses dekripsi-nya.

        Berikan juga fitur untuk menampilkan password


#include <conio.h>
#include <iostream>
#include <string.h>
#include <time.h>
#include <ctime>
using namespace std;

//Deklarasi
struct dLinkedList {
    dLinkedList* prev;
    char data;
    dLinkedList* next;
};

    dLinkedList* head;
    dLinkedList* tail;

//mengecek kosong atau tidak pada list
bool kosong () {
    return  (head==NULL && tail==NULL ? true : false);
}

// fungsi mengecek banyaknya data dalam list
int outOf () {
    int i;
    dLinkedList* bantu;
    bantu = head;
    while (bantu != tail->next) {
        bantu = bantu->next;
        i++;
    }
    return i;
}


//menambah data di tengah
void tambahTengah(char wordint value) {

    dLinkedList *baru*bantu*bantu2;
    baru = new dLinkedList; //membuat node baru
    baru->data = word; //menambah data ke node baru
    baru->next = NULL;
    baru->prev = NULL;
    bantu = head;
    for(int i = 1i < value-1i++) {
        if(bantu != NULL) {
        bantu = bantu->next; //menggeser data sesuai value
        }
    }
    if(bantu != NULL) {
        bantu2 = bantu->next; // menghubungkan ke node setelah yang dicari
        baru->next = bantu2; // menghubungkan node baru
        bantu2->prev = baru;
        bantu->next = baru; // menghubungkan ke node sebelum yang dicari
        baru->prev = bantu;
    } 
    
}

//menambah data di belakang
void tambahBelakang (char datamasuk) {
    if(kosong()) { //jika data kosong
        dLinkedList* simpul;
        simpul = new dLinkedList; //membuat node baru
        simpul->data = datamasuk; //menambah data ke node simpul
        simpul->prev=NULL;
        simpul->next=NULL;
        head = simpul;
        tail = simpul;
         
        
    }
    else {
        dLinkedList* simpul;
        simpul = new dLinkedList; //membuat node baru
        simpul->data =datamasuk;
        simpul->prev = tail;
        tail->next = simpul;
        tail = simpul;
        
  
    }
}

void rotateList(int n) {  
    //Initially,  bantu will point to head  
    dLinkedList*  bantu = head;  
      
    //n should not be 0 or greater than or equal to number of nodes present in the list  
    if(n == 0 || n >= outOf())   
        return;  
    else {  
        //Traverse through the list till  bantu point to nth node  
        //after this loop,  bantu will point to nth node  
        for(int i = 1i < ni++)   
             bantu =  bantu->next;  
          
        //Now to move entire list from head to nth node and add it after tail  
        tail->next = head;  
        //Node next to nth node will be new head  
        head =  bantu->next;  
        //Previous node to head should be NULL  
        head->prev = NULL;  
        //nth node will become new tail of the list  
        tail =  bantu;  
        //tail's next will point to NULL  
        tail->next = NULL;  
    }  
}

//menghapus data di tengah
void hapusTengah(int value) {

        dLinkedList *bantu*bantu2*hapus;
        hapus=head;
        for(int i = 1i < valuei++) {
          if(bantu != NULL) {
            hapus = hapus->next; //menggeser sesuai value
          }
        }
        if(bantu != NULL) {
            bantu2 = hapus->next; // mengkaitkan node sebelum dan sesudahnya
            bantu = hapus->prev;
            bantu->next = bantu2;
            bantu2->prev = bantu;
            delete hapus;
            hapus = hapus->next;
        } 
        else {
          cout<<"\nNode sebelumnya adalah NULL";
        }
    
}
//menampilkan data
void tampil () {
    int i=1;
    dLinkedList* bantu;
    bantu = head;
    while (bantu != tail->next) { //perulangan sampai dengan tail
        cout<<bantu->data<<" "; //print
        bantu = bantu->next;
        i++;
    }
        
}

int main () {
    int count=0;

    char karakter[]= {'!','@','$','%','^','&','*','?'};
    char kata[20];
    int pil;

    cout<<"Masukkan Kata: ";
    cin.getline(kata,20); //input
    cin.ignore(); 
    
    for(int i=0i<strlen(kata); i++) {

        tambahBelakang(kata[i]); ; 
        count++;
    }
    if(count<6){
        cout<<"karakter minimal 6 digit!"<<endl;
    }

    else {
    system("cls");
    cout<<endl;
    cout<<"Pilih Menu"<<endl;
    cout<<"1. Enkripsi"<<endl;
    cout<<"2. Deskripsi"<<endl;
    cout<<endl;
    cout<<"Masukkan Pilihan: ";
    cin>>pil;

    switch (pil)
    {
    case 1:
           
        cout<<"Data sebelum dienkripsi: "<<kata<<endl;
        srand(time(0));
        rotateList(3);
        tambahTengah(karakter[rand()%8],4);
        cout<<"Data setelah dienkripsi: ";tampil();
        break;
    
    case 2:
        hapusTengah(4);
        rotateList(count-4);
        cout<<"Data setelah dideskripsi: ";tampil();
    default:
        break;
    }
    }

    
}

a.      Penjelasan Program

1)      Deklarasi struct linked list

//Deklarasi

struct dLinkedList {

    dLinkedList* prev;

    char data;

    dLinkedList* next;

};

 

    dLinkedList* head;

    dLinkedList* tail;

Pada program ini menggunakan double linked list dengan tipe data char.

 

2)      Tambah tengah

void tambahTengah(char wordint value) {

 

    dLinkedList *baru*bantu*bantu2;

    baru = new dLinkedList; //membuat node baru

    baru->data = word; //menambah data ke node baru

    baru->next = NULL;

    baru->prev = NULL;

    bantu = head;

    for(int i = 1i < value-1i++) {

        if(bantu != NULL) {

        bantu = bantu->next; //menggeser data sesuai value

        }

    }

    if(bantu != NULL) {

        bantu2 = bantu->next; // menghubungkan ke node setelah yang 

        dicari

        baru->next = bantu2; // menghubungkan node baru

        bantu2->prev = baru;

        bantu->next = baru; // menghubungkan ke node sebelum yang 

        dicari

        baru->prev = bantu;

    } 

    

}

Tambah tengah pada program ini digunakan untuk menambahkan karakter setelah huruf ke-3. 

 

3)      Tambah belakang

void tambahBelakang (char datamasuk) {

    if(kosong()) { //jika data kosong

        dLinkedList* simpul;

        simpul = new dLinkedList; //membuat node baru

        simpul->data = datamasuk; //menambah data ke node simpul

        simpul->prev=NULL;

        simpul->next=NULL;

        head = simpul;

        tail = simpul;

         

        

    }

    else {

        dLinkedList* simpul;

        simpul = new dLinkedList; //membuat node baru

        simpul->data =datamasuk;

        simpul->prev = tail;

        tail->next = simpul;

        tail = simpul;

        

  

    }

}

 

Tambah belakang digunakan untuk menambahkan setiap karakter ke dalam linked list melalui perulangan for,

for(int i=0i<strlen(kata); i++) {

 

        tambahBelakang(kata[i]); ; 

        count++;

    }

Dengan strlen akan menghitung jumlah karakter kemudian tambah belakang akan menambahkan karakter tersebut secara urut.

4)      Rotasi list

void rotateList(int n) {  

    dLinkedList*  bantu = head;  

    if(n == 0 || n >= outOf())   

        return;  

    else {  

        for(int i = 1i < ni++)   

             bantu =  bantu->next;  

          

        tail->next = head;  

        head =  bantu->next;  

        head->prev = NULL;  

        tail =  bantu;  

        tail->next = NULL;  

    }  

}

 

Rotate list digunakan untuk memindahkan 3 node terakhir, menjadi node terdepan.

 

5)      Hapus tengah

void hapusTengah(int value) {

 

        dLinkedList *bantu*bantu2*hapus;

        hapus=head;

        for(int i = 1i < valuei++) {

          if(bantu != NULL) {

            hapus = hapus->next; //menggeser sesuai value

          }

        }

        if(bantu != NULL) {

            bantu2 = hapus->next; // mengkaitkan node sebelum 

            dan sesudahnya

            bantu = hapus->prev;

            bantu->next = bantu2;

            bantu2->prev = bantu;

            delete hapus;

            hapus = hapus->next;

        } 

        else {

          cout<<"\nNode sebelumnya adalah NULL";

        }

    

}

Hapus tengah di sini hanya digunakan untuk menghapus karakter yang ada pada data. Jika user memilih deskripsi. Hapus tengah akan menghapus data ke 4 pada linked list, dimana data ke 4 tersebut adalah karakter.

 

6)      Enkripsi & Deskripsi

 case 1:  

        cout<<"Data sebelum dienkripsi: "<<kata<<endl;

        srand(time(0));

        rotateList(3);

        tambahTengah(karakter[rand()%8],4);

        cout<<"Data setelah dienkripsi: ";tampil();

        break;

    

 case 2:

        hapusTengah(4);

        rotateList(count-4);

        cout<<"Data setelah dideskripsi: ";tampil();

        break;

Pada enkripsi setelah user memasukkan kata maka program akan memasukkan kata tersebut ke dalam linked list kemudian merotasi node 1-3 ke node terakhir. Program akan memilih karakter secara random untuk dimasukkan ke dalam node ke-4. Baru kemudian data setelah dienkripsi bisa ditampilkan.

 

Pada Deskripsi user harus memasukkan password sesuai pola pada enkripsi, kemudian program akan menghapus karakter pada node ke 4 dan merotasi lagi menjadi ke bentuk semula.

 

c. Screenshoot


 

 

Komentar

Posting Komentar

Postingan Populer