Dalam kriptografi, Caesar Cipher dikenal sebagai cara penyandian klasik yang menggunakan pergeseran karakter. Caesar cipher dinamai berdasarkan nama Julius Caesar yang menggunakannya untuk komunikasi militer pasukannya. Contoh penerapannya adalah ROT13 yang menggeser setiap karakter dalam teks sebanyak 13 langkah.
Contoh dengan pergeseran 2 langkah :
- Geri => Igtk
- G => I
- e => g
- r => t
- i => k
Algoritma caesar cipher cukup simpel karena kalian cukup mengeser huruf sekian langkah dengan operator penjumlahan atau pengurangan. Kalian pun bisa menerapkannya tanpa pemrograman dengan perhitungan manual. Kalau kalian ingin menggunakan bahasa C, kalian bisa membuat function di bawah ini untuk mengubah satu karakter.
char geser(char c, int i){
if(c>='a' && c <='z'){
c-='a';
c+=i+26;
c%=26;
c+='a';
}else if(c>='A' && c <='Z'){
c-='A';
c+=i+26;
c%=26;
c+='A';
}
return c;
}
Function di atas bisa dipanggil dari function main kalau kalian hanya ingin mengubah satu karakter. Untuk mengubah string, tentu saja kalian akan butuh loop. Loopnya bisa langsung diletakkan di function utama atau dibuat dengan function terpisah. Kalau mau membuat function untuk memisahkan loop dari function utama, kalian bisa membuat function seperti di bawah ini.
void ubah(char *s, int n){
int pj=strlen(s);
for(int i=0;i<pj;i++){
s[i]=geser(s[i], n);
}
}
Kode program utuh dari 2 function di atas beserta pemanggilan dari function utamanya bisa dilihat di bawah ini.
#include <stdio.h>
#include <string.h>
char geser(char c, int i){
if(c>='a' && c <='z'){
c-='a';
c+=i+26;
c%=26;
c+='a';
}else if(c>='A' && c <='Z'){
c-='A';
c+=i+26;
c%=26;
c+='A';
}
return c;
}
void ubah(char *s, int n){
int pj=strlen(s);
for(int i=0;i<pj;i++){
s[i]=geser(s[i], n);
}
}
int main(){
char s[256]="";
int n=13;
printf("Input :");fgets(s, 255, stdin);
ubah(s, n);
printf("Output : %s", s);
}
Input : Gerimisya Stela Rida Output : Trevzvfln Fgryn Evqn
Contoh di atas menggunakan pergeseran sebanyak 13 angka yang digunakan dalam algoritma ROT13. Kalian juga bisa mengganti nilai variabel n dengan nilai lain di bawah 26.
Versi C++
Kode program di atas bisa digunakan dalam bahasa C maupun C++. Kalau kalian mau pakai header iostream, contohnya bisa dilihat di bawah ini.
#include <iostream>
using namespace std;
char geser(char c, int i){
if(c>='a' && c <='z'){
c-='a';
c+=i+26;
c%=26;
c+='a';
}else if(c>='A' && c <='Z'){
c-='A';
c+=i+26;
c%=26;
c+='A';
}
return c;
}
string ubah(string s, int n){
int pj=s.length();
for(int i=0;i<pj;i++){
s[i]=geser(s[i], n);
}
return s;
}
int main(){
string s="";
int n=13;
printf("Input : ");getline(std::cin, s);
s=ubah(s, n);
cout << "Output : " << s;
}
Versi pascal
var s:string;
n:integer=13;
function geser(c:char;i:integer;):char;
var x:integer;
begin
if((c>='a')and (c <='z')) then
begin
x:=ord(c)-ord('a');
x:=x+i+26;
x:=x mod 26;
c:=chr(x+ord('a'));
end
else if((c>='A') and (c <='Z'))then
begin
x:=ord(c)-ord('A');
x:=x+i+26;
x:=x mod 26;
c:=chr(x+ord('A'));
end;
geser:=c;
end;
procedure ubah(var s:string;n:integer);
var i, pj:integer;
begin
pj:=length(s);
for i:=1 to pj do
begin
s[i]:=geser(s[i], n);
end;
end;
Begin
write('Input : ');readln(s);
ubah(s, n);
writeln('output : ', s);
end.
Males ngetik? Dowload source codenya di sini.