Cara membuat sandi Caesar dan dekripsi dalam C

Pembaharuan Terakhir: 04/12/2025
penulis: Isaac
  • Sandi Caesar mengganti setiap huruf dengan huruf lain yang ditempatkan pada sejumlah posisi tertentu, yang ditentukan oleh sebuah kunci.
  • Dalam C, hal ini diimplementasikan dengan mengubah huruf menjadi kode numerik, menerapkan penjumlahan dan modulo 26, serta menghormati huruf besar dan huruf kecil.
  • Fitur-fitur seperti isalpha, isupper, islower, strlen dan desain modular memfasilitasi program interaktif untuk enkripsi, dekripsi, dan brute-forcing.
  • Ini adalah algoritma yang relevan secara historis tetapi lemah secara kriptografi, ideal sebagai latihan pendidikan dan pembelajaran. pemrograman.

Program sandi Caesar dalam C

Jika Anda memulai dengan C dan menginginkan proyek praktis, Buatlah program untuk mengenkripsi dan mendekripsi menggunakan sandi Caesar. Ini pilihan yang sempurna. Sederhana, memaksa Anda memanipulasi string, bekerja dengan karakter, dan berpikir dalam istilah matematika, tetapi tanpa membuat Anda tergila-gila dengan kompleksitas.

Selain berfungsi sebagai latihan pemrograman, Sandi Caesar adalah titik masuk yang hebat ke dunia kriptografiAnda akan memahami apa itu kunci, mengapa beberapa sistem lemah, dan cara menyerang enkripsi dengan brute force. Kita akan membahasnya langkah demi langkah, dengan teori, contoh, dan beberapa pendekatan implementasi dalam C.

Apa itu sandi Caesar dan dari mana asalnya?

Panggilannya sandi caesarSandi geser, atau sandi geser, adalah salah satu sistem kriptografi tertua yang ada. Namanya berasal dari Julius Caesar, yang katanya dia gunakan untuk memerintah pesan militer yang disamarkan kepada para jenderalnya, sehingga jika seseorang mencegat teks tersebut, mereka tidak dapat memahaminya pada pandangan pertama.

Idenya sangat sederhana: Setiap huruf dalam pesan asli digantikan oleh huruf lain yang memiliki jumlah posisi tetap, maju atau mundur dalam alfabet.Jumlah posisi tersebut adalah kunciMisalnya, dengan kunci 3, A menjadi D, B menjadi E, C menjadi F dan seterusnya hingga Z, di mana alfabet "berbalik" dan dimulai lagi dengan A.

Skema ini milik sandi substitusi monoalfabetikSetiap kali huruf yang sama muncul dalam teks biasa, huruf tersebut diubah menjadi huruf terenkripsi yang sama. Hal ini membuatnya sangat mudah dipahami dan diimplementasikan, tetapi juga sangat mudah dipecahkan dengan sedikit analisis.

Alfabet yang bergeser dalam sandi Caesar

Landasan matematika sandi Caesar

Di balik metode klasik ini terdapat sebuah formulasi matematika yang sangat kompak. Kami memberi nomor setiap huruf dari 0 hingga n-1 (dimana n adalah ukuran alfabet), kita dapat mengekspresikan cipher sebagai:

C = (P + k) mod n

Dimana P adalah posisi huruf aslinya, C adalah posisi surat terenkripsi, k adalah kunci perpindahan dan n adalah jumlah total simbol dari alfabet (26 dalam alfabet Inggris tanpa ñ). Operator mod Ini memastikan bahwa, setelah mencapai akhir alfabet, hitungan dimulai lagi dari awal.

Untuk mengambil pesan, cukup membalikkan operasi:

P = (C − k) mod n

Dalam praktiknya, ketika kita mengimplementasikannya di C kita tidak bekerja dengan posisi abstrak, tetapi dengan kode numerik karakter (kompatibel dengan ASCII atau UTF-8)Huruf kapital A sampai Z menempati nilai 65 sampai 90, dan huruf kecil aa sampai z berkisar antara 97 sampai 122. Dengan memanfaatkan rentang ini, kita dapat mengurangkan kode basis ('A' atau 'a'), menerapkan pergeseran dengan modulo 26 dan menambahkan kembali basisnya.

Detail utama: Operasi modular menjamin “efek melingkar” dari alfabetJika Anda menggeser Z tiga posisi dengan tombol 3 dalam rentang huruf besar, Anda akan mendapatkan C, karena perhitungan dilakukan dalam rentang 0-25 dan kemudian diubah kembali ke kode ASCII.

Konsep kriptografi dasar yang Anda butuhkan

Bekerja dengan sandi Caesar memungkinkan Anda untuk menginternalisasi beberapa konsep kriptografi klasik tanpa masuk ke matematika tingkat lanjut atau algoritma modern.

  Pengaturan Windows 11 yang direkomendasikan oleh para profesional

Kami menyebut pesan asli yang tidak terenkripsi teks pesawatInilah yang ingin Anda komunikasikan: misalnya, "Selamat tinggal" atau frasa lengkap. Hasil setelah menerapkan enkripsi adalah teks sandi o kriptogram, yang tampak seperti serangkaian huruf yang tidak berarti, seperti "Dglrv".

Proses mengubah plaintext menjadi ciphertext disebut enkripsi, sedangkan operasi kebalikannya disebut dekripsiDalam kedua kasus tersebut, kunciyang dalam sandi Caesar hanyalah bilangan bulat antara 1 dan 26 (atau antara 0 dan 25, tergantung bagaimana Anda mendefinisikannya dalam program), dan penerapannya dalam layanan seperti Gmail.

Hal yang menarik adalah, meskipun hasilnya mungkin tampak aman bagi pengguna tanpa pengetahuan, Keamanan sebenarnya dari sandi Caesar praktis nol.Hanya ada 25 kemungkinan kunci dalam alfabet Latin standar, sehingga penyerang dapat mencoba semuanya dalam hitungan milidetik dengan program brute-force.

Contoh enkripsi dan dekripsi Caesar

ASCII, ordinal, dan konversi antara huruf dan angka

Untuk mengimplementasikan sistem ini dalam C, Anda perlu memahami dengan baik bagaimana komputer merepresentasikan karakterSecara historis, ASCII yang paling banyak digunakan, yang menetapkan bilangan bulat antara 0 dan 127 untuk setiap simbol, meskipun dalam praktiknya rentang yang dapat dicetak dari 32 hingga 126 paling banyak digunakan.

Seperti yang telah kami komentari, Huruf kapital AZ memiliki kode dari 65 hingga 90, Dan huruf kecil az dari 97 sampai 122Angka 0-9 berkisar antara 48 hingga 57. Saat ini, UTF-8 umum digunakan, tetapi untuk karakter dasar, nilainya tetap sama dengan ASCII, sehingga kode kita akan tetap valid.

Trik yang biasa dilakukan adalah mengubah huruf menjadi kode numeriknyamemanipulasi angka tersebut dengan operasi penjumlahan, pengurangan, dan modulus, lalu mengubahnya kembali menjadi karakter. Ular sanca Hal ini dilakukan dengan fungsi pesanan() y chr(); dalam C mereka tidak ada seperti itu, tetapi Tipe char itu sendiri dapat diperlakukan sebagai integer, dan konstanta karakter seperti 'A' atau 'a' bertindak sebagai nilai numerik.

Misalnya, untuk memindahkan huruf 'A' tiga posisi ke depan dalam C, Anda dapat berpikir seperti ini: 'A' memiliki kode 65, Anda menambahkan 3 dan Anda mendapatkan 68, yang sesuai dengan 'D'Saat bekerja dengan huruf besar, pertama-tama kurangi 'A' untuk menormalkan rentang ke 0-25, terapkan offset modulo 26, lalu tambahkan 'A' kembali untuk memulihkan kode yang benar.

Desain umum program C untuk sandi Caesar

Program C yang menerapkan enkripsi dan dekripsi Caesar biasanya selalu mengikuti struktur yang sangat miripmeskipun rinciannya dapat berubah tergantung pada gaya penulis:

  • Permintaan teks dari pengguna: string diminta yang akan menjadi pesan yang akan dienkripsi atau didekripsi.
  • Membaca tombol angka: pengguna memasukkan offset, biasanya bilangan bulat antara 1 dan 26.
  • Pemilihan mode: enkripsi, dekripsi, atau bahkan kekerasan jika Anda ingin menambahkan ekstra.
  • Fungsi terjemahan utama: menerima pesan, kunci dan modus, menelusuri string dan menghasilkan hasil yang diproses.
  • Keluaran layarKriptogram atau teks biasa yang dipulihkan dicetak.

Inti algoritmanya selalu sama: melintasi string karakter demi karakter.Periksa apakah setiap simbol merupakan huruf dan, jika ya, terapkan transformasi yang sesuai, dengan memperhatikan huruf besar dan kecil. Segala sesuatu yang bukan huruf (spasi, tanda baca, angka, dll.) biasanya dibiarkan apa adanya.

Kode C untuk sandi Caesar

Menggunakan fungsi C standar untuk bekerja dengan karakter

Untuk membuat kode lebih bersih dan kuat, sangat disarankan untuk mengandalkan header. , yang menawarkan beberapa fungsi yang sangat berguna untuk mengklasifikasikan karakter.

  Cara Membuka File MBOX

Klaf fungsi:

Secara khusus, untuk sandi Caesar, Anda akan sangat tertarik pada:

  • isalfa(c): mengembalikan nilai bukan nol jika c adalah huruf (huruf besar atau kecil), dan nol jika tidak.
  • atas(c): memeriksa apakah c adalah huruf kapital.
  • islower(c): memeriksa apakah c adalah huruf kecil.

Con estas funciones puedes dengan mudah menyaring karakter mana yang akan diprosesJika isalpha(c) bernilai salah, Anda cukup menyalin simbol tersebut ke hasil dan melanjutkan ke hasil berikutnya. Jika berupa huruf, Anda menentukan rentang yang sesuai (AZ atau az) berdasarkan isupper atau islower dan menerapkan pergeseran tanpa khawatir keluar dari alfabet yang sesuai.

Secara paralel, Anda akan membutuhkan header untuk fungsi seperti strlen()yang memungkinkan Anda mengetahui panjang string dan menggunakannya dalam satu loop untuk o sementara dengan mengulangi pesan tersebut.

Contoh implementasi sandi Caesar dasar dalam C

Versi yang sangat umum dari program C mendefinisikan sebuah fungsi, yang dapat kita panggil, misalnya berhenti(), yang bertanggung jawab atas mengubah string yang diterima di tempat atau untuk menghasilkan salinan terenkripsi dari buffer masukan.

Aliran khas:

  • En utama()Pengguna diminta agar teks diproses.
  • Kunci perpindahan diminta dan divalidasi untuk memastikannya berada dalam rentang yang diizinkan.
  • Fungsi enkripsi dipanggil dengan melewatkan teks dan kunci.
  • Hasilnya ditampilkan di layar.

Struktur internal:

  • Hitung panjang teks menggunakan strlen() untuk mengatur batas loop.
  • Telusuri string karakter demi karakter menggunakan indeks integer.
  • Periksa apakah setiap karakter merupakan huruf besar, huruf kecil, atau bukan alfabet.
  • Terapkan perpindahan dengan rumus yang sesuai dan operator % 26.
  • Biarkan karakter non-alfabet tidak berubah.

Penggunaan operator % 26 sangat penting untuk hasil tetap dalam alfabetJadi, jika Anda menggeser z dengan tombol 3, Anda memperoleh c alih-alih simbol kode ASCII yang aneh.

Manipulasi string dalam C: scanf, fgets dan buffer

Salah satu aspek yang paling sulit dalam menulis program ini dalam C bukanlah enkripsi itu sendiri, tetapi cara membaca string dari input standarMeskipun `scanf` dengan "%s" tampak menggoda, ia memiliki beberapa masalah: ia memotong pembacaan di spasi pertama, ia tidak mengontrol ukuran buffer dengan baik, dan mudah menyebabkan luapan jika Anda tidak berhati-hati.

Itulah sebabnya banyak contoh modern memilih untuk menggunakan fget() untuk membaca seluruh baris. Fungsi ini menerima buffer, ukuran maksimumnya, dan sumber input (biasanya stdin) dan memastikan bahwa batasnya tidak terlampaui. Komprominya adalah Biasanya meninggalkan jeda baris di akhir stringJadi biasanya merupakan ide yang bagus untuk membersihkannya secara manual dengan memeriksa string dan mengganti '\n' dengan '\0' saat muncul.

Dalam kasus apa pun, algoritma enkripsi tidak bergantung pada bagaimana Anda memperoleh string tersebut: Anda dapat merangkum logika Caesar dalam fungsi yang menerima char[] yang telah disiapkan sebelumnya, lalu putuskan di main apakah akan mengisi array itu dengan fgets, scanf atau metode lain sesuai kebutuhan Anda.

Implementasi lengkap sandi Caesar dalam C

Struktur program interaktif yang lengkap

Di luar fungsi enkripsi dasar, seseorang dapat membangun program interaktif yang cukup komprehensif yang memungkinkan pengguna untuk memilih apakah akan mengenkripsi, mendekripsi, atau bahkan mencoba semua kunci yang mungkin (mode brute force).

Organisasi yang sangat jelas terdiri dari pemisahan logika menjadi beberapa fungsi:

  • dapatkanMode(): menanyakan pengguna apakah mereka ingin mengenkripsi, mendekripsi, atau menggunakan kekerasan dan mengembalikan karakter atau string pendek yang mewakili mode yang dipilih.
  • dapatkanPesan(): bertanggung jawab untuk meminta teks diproses dan mengembalikannya.
  • dapatkanKunci(): meminta kunci dari pengguna, memaksa pengguna untuk memasukkan nilai antara 1 dan maksimum (misalnya 26) dan mengembalikan bilangan bulat tersebut.
  • getTranslatedMessage(mode, pesan, kunci): menerapkan logika enkripsi atau dekripsi menurut mode, mengembalikan teks yang diubah.
  Cara Membuat Outlook Dimulai Secara Rutin Dengan Laptop

Dalam mode dekripsi sangat nyaman bekerja dengan fungsi yang sama seperti untuk enkripsiNamun, tanda kuncinya diubah. Artinya, jika pengguna memilih untuk mendekripsi, kuncinya dikalikan -1 dan algoritma yang sama yang digunakan untuk enkripsi diterapkan. Dengan cara ini, Anda menghindari duplikasi kode.

Mode brute force menambah keingintahuan yang patut diperhatikan: mengotomatiskan proses pengujian semua kunci yang mungkinProgram ini mengulang dari 1 hingga ukuran kunci maksimum, memanggil fungsi translasi dalam mode dekripsi pada setiap iterasi dan menampilkan setiap hasil beserta kunci yang digunakan. Pengguna hanya perlu mengamati baris mana yang masuk akal dalam bahasa Spanyol untuk menyimpulkan pergeseran mana yang awalnya digunakan.

#termasuk // Untuk printf dan scanf #include // Untuk strlen // Fungsi yang menerapkan sandi Caesar void caesar_cipher(char *text, int shift) { for (int i = 0; i < strlen(text); i++) { char c = text[i]; // karakter saat ini // Jika huruf kapital if (c >= 'A' && c <= 'Z') { text[i] = ((c - 'A' + shift) % 26) + 'A'; } // Jika huruf kecil else if (c >= 'a' && c <= 'z') { text[i] = ((c - 'a' + shift) % 26) + 'a'; } // Jika bukan huruf, biarkan apa adanya } } int main() { char message[100]; // buffer untuk teks int shift; // nilai shift printf("Masukkan pesan yang akan dienkripsi: "); scanf("%99[^\n]", message); // Membaca hingga 99 karakter termasuk spasi printf("Masukkan offset (misalnya, 3): "); scanf("%d", &offset); // Terapkan enkripsi caesar_cipher(message, offset); printf("Pesan terenkripsi: %s\n", message); return 0; }

Menangani huruf besar, huruf kecil, dan karakter khusus

Sesuatu yang sering diabaikan di awal adalah pentingnya Hargai bentuk huruf dan jangan merusak teksProgram sandi Caesar yang baik seharusnya memperlakukan huruf besar dan huruf kecil secara terpisah, dan membiarkan simbol-simbol yang tidak termasuk dalam alfabet tetap utuh.

Logika umum adalah:

  • Jika simbol tidak lolos pemeriksaan isalfa()Ini disalin langsung ke hasil tanpa perubahan apa pun.
  • Jika huruf kapital, itu menormalkan nilai dengan mengurangi 'A'Perpindahan diterapkan dalam modulo 26 dan kemudian 'A' ditambahkan lagi.
  • Jika hurufnya kecil, hal yang sama dilakukan tetapi dengan rentang berdasarkan 'a'.
  • Jika saat menjumlahkan kunci Anda berada di atas rentang (di luar 'Z' atau 'z'), kurangi dengan 26; jika saat mengurangi berada di bawahnya, tambahkan dengan 26.

Dengan cara ini Anda dapat membuat teks seperti "Selamat tinggal" dengan kunci 3 menjadi "Dglrv" menghormati huruf kapital awal dan sisanya dalam huruf kecil, dan setelah menguraikannya Anda kembali persis ke aslinya.

Penting juga untuk menyadari bahwa Sandi Caesar tidak mengubah spasi atau tanda bacaHal ini memungkinkan struktur visual kalimat dan paragraf dipertahankan, tetapi membuat panjang pesan dan posisi relatif kata-kata tetap terlihat oleh penyerang.

algoritma enkripsi dan hashing yang lebih aman
Artikel terkait:
Algoritma enkripsi dan hashing yang lebih aman: panduan lengkap