Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions Kriptografi/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
cmake_minimum_required(VERSION 3.1)
set (CMAKE_CXX_STANDARD 11)
file( GLOB APP_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp )
foreach( testsourcefile ${APP_SOURCES} )
string( REPLACE ".cpp" "" testname ${testsourcefile} )
add_executable( ${testname} ${testsourcefile} )

set_target_properties(${testname} PROPERTIES LINKER_LANGUAGE CXX)
if(OpenMP_CXX_FOUND)
target_link_libraries(${testname} OpenMP::OpenMP_CXX)
endif()
install(TARGETS ${testname} DESTINATION "bin/Kriptografi")

endforeach( testsourcefile ${APP_SOURCES} )
80 changes: 80 additions & 0 deletions Kriptografi/caesar cipher.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#include <iostream>
#include <string>
#include <stdlib.h>
/*sumber ascii
http://sticksandstones.kstrom.com/appen.html
*/
/*
konsep caesar cipher
https://en.wikipedia.org/wiki/Caesar_cipher
*/
using namespace std;
string encrypt(string &kata, int &TargetEncrypt){
string ResultEncrypt = ""; //isi variabel dengan string kosong yang dimana nanti akan di isi oleh engkripsi string kata
for(int i = 0; i < kata.length(); i++){
if(isupper(kata[i])){ //huruf besar
ResultEncrypt += char((kata[i] - 65 + TargetEncrypt + 26) % 26 + 65);
// mengenkripsi huruf kapital dengan menggeser berdasarkan TargetEncrypt.
} else { //huruf kecil
ResultEncrypt += char((kata[i] - 97 + TargetEncrypt + 26) % 26 + 97);
// mengenkripsi huruf kecil dengan menggeser berdasarkan TargetEncrypt.
}
}
return ResultEncrypt;
/*
Rumus (kata[i] - 65 + TargetEncrypt + 26) % 26 + 65 digunakan untuk menggeser huruf kapital dalam algoritma Caesar Cipher.
Ini mengkonversi kata[i] dari ASCII ke indeks 0–25, menambahkan TargetEncrypt, menjamin hasil positif dengan tambahan 26,
dan akhirnya mengonversi kembali ke ASCII dengan % 26 dan ini juga berlaku untuk huruf kecil yg membedakan hanya code ascii
*/
}
string decrypt(string &kata, int &TargetDecrypt){
string ResultDecrypt = "";
for(int i = 0; i < kata.length(); i++){
if(isupper(kata[i])){ //huruf kapital
ResultDecrypt += char((kata[i] - 65 - TargetDecrypt + 26) % 26 + 65);
// mendeskripsi huruf kapital dengan menggeser berdasarkan TargetDecrypt
} else { //huruf kecil
ResultDecrypt += char((kata[i] - 97 - TargetDecrypt + 26) % 26 + 97);
// // mendeskripsi huruf kecil dengan menggeser berdasarkan TargetDecrypt
}
}
return ResultDecrypt;
}
int main(){
string kata;
int TargetEncrypt, TargetDecrypt, pilihan;
bool choice = true;
while(choice){
system("clear"); //untuk windows pakai system("cls")
cout << "pilihan yang tersedia \n";
cout << "1.encrypt \n";
cout << "2.decrypt \n";
cout << "Masukkan pilihan anda: ";
cin >> pilihan;
cin.ignore();
while(pilihan < 1 || pilihan > 2){ //jika input pilihan < 1 dan > 2 maka while akan berjalan dan meminta input ulang
cout << "anda memasukkan input yang salah ";
cin >> pilihan;
cin.ignore();
}
if(pilihan == 1){
cout << "Masukkan kata: ";
getline(cin,kata);
cout << "Masukkan target: ";
cin >> TargetEncrypt;
string HasilEngkripsi = encrypt(kata,TargetEncrypt);
cout << "hasil engripsi: " << HasilEngkripsi << endl;
} else {
cout << "Masukkan kata: ";
getline(cin,kata);
cout << "Masukkan target: ";
cin >> TargetDecrypt;
string HasilDecrypt = decrypt(kata,TargetDecrypt);
cout << "Hasil decrypt : " << HasilDecrypt << endl;
}
cout << "Lanjutkan? (1 untuk ya, 0 untuk tidak): "; //meminta user untuk melanjutkan progam atau tidak
cin >> choice;
cin.ignore();
}
return 0;
}
58 changes: 58 additions & 0 deletions Kriptografi/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Daftar Isi

1. [Pendahuluan Kriptografi](#pendahuluan-kriptografi)
2. [Implementasi Kriptografi](#implementasi-kriptografi)
3. [Macam-macam Algoritma Enkripsi/Kriptografi](#macam-macam-algoritma-enkripsikriptografi)

## Pendahuluan Kriptografi

Kriptografi adalah ilmu dan seni untuk menjaga keamanan informasi. Berasal dari
bahasa Yunani, "kryptos" yang berarti tersembunyi, dan "graphein" yang berarti
menulis. Kriptografi mengamankan komunikasi dan data dari pihak tak berwenang

Tujuan utama kriptografi:

- Kerahasiaan (Confidentiality)
- Integritas Data (Data Integrity)
- Autentikasi (Authentication)
- Nirpenyangkalan (Non-repudiation)

## Implementasi Kriptografi

Kriptografi diterapkan dalam berbagai bidang dan teknologi, termasuk:

1. Komunikasi Aman: Enkripsi pesan instan, email, dan panggilan suara/video.
2. Keamanan Jaringan: VPN, SSL/TLS untuk keamanan web.
3. Penyimpanan Data: Enkripsi hard drive dan cloud storage.
4. Transaksi Keuangan: Keamanan e-commerce dan perbankan online.
5. Blockchain dan Cryptocurrency: Basis dari teknologi mata uang digital.
6. Tanda Tangan Digital: Untuk verifikasi dokumen elektronik.

## Macam-macam Algoritma Enkripsi/Kriptografi

1. Algoritma Simetris:

- DES (Data Encryption Standard)
- AES (Advanced Encryption Standard)
- Blowfish
- Twofish
- RC4 (Rivest Cipher 4)

2. Algoritma Asimetris:

- RSA (Rivest-Shamir-Adleman)
- ECC (Elliptic Curve Cryptography)
- Diffie-Hellman
- ElGamal

3. Fungsi Hash:

- MD5 (Message Digest 5)
- SHA (Secure Hash Algorithm) family: SHA-1, SHA-2, SHA-3

4. Algoritma Klasik:

- Caesar Cipher
- Vigenère Cipher
- Substitution Cipher
- Transposition Cipher
60 changes: 60 additions & 0 deletions algorithm/sorting/insertion_sort.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#include <iostream>
#include <vector>
using namespace std;
//fungsi untuk menampilkan vector setelah sort secara Ascending(terkecil)
void tampilkanAscending(vector<int>& value){
for(int i = 0; i < value.size(); i++){
cout << value[i] << " ";
}
}
//fungsi untuk menampilkan vector setelah sort secara Descending(terbesar)
void tampilkanDescending(vector<int>& value){
for(int i = 0; i < value.size(); i++){
cout << value[i] << " ";
}
}
void InsertionSortAscending(vector<int>& value, int &key){ //insertion sort menaik
for(int i = 1;i < value.size(); i++){
key = value[i]; //inialisasi bilangan kedua merupakan key(kunci)
int j = i - 1; //inialisasi j adalah bilangan pertama
while(j >= 0 && value[j] > key){ //operator logika AND akan true jika kedua input true
/*jka bilangan lebih besar dari 0 dan bilangan lebih besar dari key maka while akan berjalan*/
value[j + 1] = value[j]; // Geser elemen
j = j - 1; //Pindah ke elemen berikutnya di kiri
}
value[j + 1] = key; // Masukkan key pada posisi yang benar
}
}
void InsertionSortDescending(vector<int>& value) { //insertion sort menurun
for(int i = 1; i < value.size(); i++) {
int key = value[i]; // key adalah elemen yang akan disisipkan
int j = i - 1;
// Geser elemen-elemen yang lebih kecil dari key ke kanan
while(j >= 0 && value[j] < key) {
value[j + 1] = value[j]; // Geser elemen
j = j - 1; // Pindah ke elemen berikutnya di kiri
}
value[j + 1] = key; // Masukkan key pada posisi yang benar
}
}
int main(){
int count,input,key;
vector<int> value;
//meminta user untuk memasukkan panjang data(vector)
cout << "Masukkan panjang data: ";
cin >> count;
for(int i = 0;i <= count - 1 ; i++){
cout << "Masukkan data ke " << i + 1 << ": ";
cin >> input;
value.push_back(input);
}
//menampilkan vector setelah sorting
InsertionSortAscending(value,key);
cout << "Data setelah di urut mulai dari terkecil ";
tampilkanAscending(value);
InsertionSortDescending(value);
cout << "\ndata setelah di urut mulai terbesar ";
tampilkanDescending(value);
cin.get();
return 0;
}
58 changes: 58 additions & 0 deletions algorithm/sorting/selection_sort.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#include <iostream>
#include <vector>
#include <array>
using namespace std;
// Fungsi untuk menukar posisi dua elemen
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void PrintVec(vector<int>& val){ //gunakan referencing
for(int print = 0; print < val.size(); print++){
cout << val[print] << " ";
}
}
void SelectionSort(vector<int>& val){ //gunakan referencing untuk menghindari banyak penggunaan variabel
/*
Lakukan iterasi untuk setiap elemen vector dengan i sebagai indeks elemen pertama.
Karena elemen terakhir secara otomatis sudah berada di posisi yang benar setelah semua iterasi,
maka loop untuk i berhenti di val.size() - 1.
*/
for(int i = 0; i < val.size() - 1; i++){
//asumsikan elemen minimum adalah element index pertama atau i(karena index dimulai dari 0)
int min = i;
for(int j = i + 1; j<val.size(); j++){
/*jika angka kedua lebih kecil dari angka pertama maka update nilai min menjadi angka kedua(j)*/
if(val[j] < val[i]){
min = j;
}
}
/*
Jika elemen terkecil yang ditemukan (min) berbeda dengan elemen saat ini (i),
maka tukar elemen pada posisi i dengan elemen terkecil yang ditemukan.
Proses ini menempatkan elemen terkecil di posisi yang benar pada setiap iterasi.
*/
if(min != i){
swap(val[i],val[min]);
}
}
}
int main(){
int value;
int count;
vector<int> val;
// meminta user untuk memasukkan panjang data vector
cout << "Masukkan panjang data: ";
cin >> count;
for(int i = 0; i <= count - 1 ; i++){
cout << "Masukkan data ke " << i + 1 << ": ";
cin >> value;
val.push_back(value); //memasukkan nilai yg dimasukkan(value) ke vector val
}
SelectionSort(val);
cout << "sesudah sorting " << endl;
PrintVec(val);
cin.get();
return 0;
}
Loading