Enkripsi dan Deskripsi Data Berbasis Teks Menggunakan Algoritma AES/Rijndael.
i
Universitas Kristen MaranathaABSTRAK
Kriptografi adalah ilmu yang mempelajari teknik
–
teknik matematika
yang berhubungan dengan aspek keamanan informasi seperti kerahasiaan data,
keabsahan data, integritas data dan autentikasi data. Data yang diacak biasa
disebut plainteks, dan dienkripsi menggunakan kunci enkripsi sehingga
menghasilkan chiperteks. Untuk mengembalikan chiperteks kembali ke bentuk
semula, dilakukan proses dekripsi yang juga menggunakan kunci dekripsi. Tugas
akhir ini membahas tentang salah satu algoritma kriptografi yaitu AES atau
Rijndael dan bagaimana mengimplementasikan algoritma tersebut supaya dapat
digunakan untuk mengamankan data berupa teks.
(2)
ii
Universitas Kristen MaranathaABSTRACT
Cryptography is technique that studies mathematical techniques related to
aspects of information security such as data confidentiality, data validity, integrity
and authentication. Encrypted data called plaintext and encrypted using the
encryption key so as to produce chiperteks. To restore chiperteks back into
plaintext, do the decryption process which also uses the decryption key. This
thesis discusses one of the cryptographic algorithms, AES or Rijndael and how to
implement the algorithm so that it can use to secure data in the form of text.
(3)
v
Universitas Kristen MaranathaDAFTAR ISI
ABSTRAK
i
ABSTRACT
ii
KATA PENGANTAR
iii
DAFTAR ISI
v
DAFTAR GAMBAR
vii
DAFTAR TABEL
ix
BAB 1 PENDAHULUAN
1
1.1 Latar Belakang Masalah
1
1.2 Rumusan Masalah
2
1.3 Tujuan
2
1.4 Pembatasan Masalah
3
1.5 Sistematika Penulisan
3
BAB 2 LANDASAN TEORI
5
2.1 Teori Dasar Kriptografi
5
2.2 Algoritma Kriptografi
6
2.2.1 Algoritma Kunci Simetri
7
2.2.2 Algoritma Kunci Asimetri
8
2.3 Teknik Dasar Kriptografi
10
2.3.1 Metode Subtitusi
10
2.3.2 Teknik Blok
10
2.3.3 Teknik Permutasi Atau Transposisi
11
2.4 Serangan Terhadap Kriptografi
11
2.4.1 Berdasarkan Keterlibatan Penyerang Dalam Komunikasi
11
2.4.2 Berdasarkan Banyaknya Informasi Yang Diketahui oleh
12
Kriptanalis
2.4.3 Berdasarkan Teknik yang Digunakan Untuk Menemukan Kunci 13
2.5 Algoritma AES / Rijndael
14
(4)
vi
Universitas Kristen Maranatha2.5.2 Transformasi Shiftrows
19
2.5.3 Transformasi MixColumns
20
2.5.4 Transformasi Addroundkey
22
BAB 3 PERANCANGAN
23
BAB 4 PENGAMATAN DATA
27
4.1 Percobaan
27
4.1.1 Percobaan 1
27
4.1.2 Percobaan 2
29
4.1.3 Percobaan 3
30
4.1.4 Percobaan 4
33
4.1.5 Percobaan 5
37
BAB 5 KESIMPULAN DAN SARAN
41
5.1 Kesimpulan
41
5.2 Saran
41
DAFTAR PUSTAKA
42
(5)
vii
Universitas Kristen MaranathaDAFTAR GAMBAR
Gambar 2.1 : Proses Enkripsi
7
Gambar 2.2 : Proses Dekripsi
7
Gambar 2.3 : Contoh Tabel Subtitusi
10
Gambar 2.4 : Teknik Blok
10
Gambar 2.5 : Blok Diagram Enkripsi dan Dekripsi Menggunakan
16
Algoritma AES
Gambar 2.6 : Proses Subtitusi dengan S-Box
18
Gambar 2.7 : Contoh Subtitusi Menggunakan S-Box
19
Gambar 2.8 : Hasil Subtitusi dengan S-Box
19
Gambar 2.9 : Proses Transformasi Shiftrows
20
Gambar 2.10 : Hasil Transformasi Shiftrows
20
Gambar 2.11 : Transformasi Mixcolumns
21
Gambar 2.12 : Hasil Setelah Transformasi Mixcolumns
21
Gambar 2.13 : Transformasi Addroundkey
22
Gambar 3.1 : Flowchart program AES Cryptographer
23
Gambar 3.2 : Flowchart Proses Enkripsi
24
Gambar 3.3 : Flowchart Proses Dekripsi
24
Gambar 4.1 : Hasil Enkripsi Percobaan 1a
27
Gambar 4.2 : Hasil Enkripsi Percobaan 2a
29
(6)
viii
Universitas Kristen MaranathaGambar 4.3 : Hasil Dekripsi Percobaan 3a
31
Gambar 4.4 : Hasil Percobaan 4a
34
(7)
ix
Universitas Kristen MaranathaDAFTAR TABEL
Tabel 4.1 : Tabel Hasil Percobaan 1
28
Tabel 4.2 : Tabel Hasil Percobaan 2
30
Tabel 4.3 : Tabel Perbandingan Percobaan 3 dengan Percobaan 4
36
Tabel 4.4 : Tabel Perbandingan Percobaan 3 dan Percobaan 5
40
(8)
A - 1
LAMPIRAN A
AES CRYPTOGRAPHER
BASE TRANSFORM
class BaseTransform {#region Convert text to hex
public static string FromTextToHex(string text) {
StringBuilder hexstring = new StringBuilder(text.Length * 2);
foreach (char word in text) {
hexstring.Append(String.Format("{0:X}", Convert.ToInt32(word)));
}
return hexstring.ToString(); }
#endregion
#region convert hex & binary to text
public static string FromHexToText(string hexstring) {
StringBuilder text = new StringBuilder(hexstring.Length / 2);
for (int i = 0; i < (hexstring.Length / 2); i++) {
string word = hexstring.Substring(i * 2, 2); text.Append((char)Convert.ToInt32(word, 16)); }
return text.ToString(); }
public static string FromBinaryToText(string binarystring) {
StringBuilder text = new StringBuilder(binarystring.Length / 8);
for (int i = 0; i < (binarystring.Length / 8); i++) {
string word = binarystring.Substring(i * 8, 8); text.Append((char)Convert.ToInt32(word, 2)); }
return text.ToString(); }
(9)
A - 2
#region Convert integer to binary
public static string FromDeciamlToBinary(int binary) {
if (binary < 0) {
Console.WriteLine("It requires a integer greater than 0.");
return null; }
string binarystring = ""; int factor = 128;
for (int i = 0; i < 8; i++) {
if (binary >= factor) {
binary -= factor; binarystring += "1"; }
else {
binarystring += "0"; }
factor /= 2; }
return binarystring; }
public static byte FromBinaryToByte(string binary) {
byte value = 0; int factor = 128;
for (int i = 0; i < 8; i++) {
if (binary[i] == '1') {
value += (byte)factor; }
factor /= 2; }
return value; }
#endregion
#region convert hex to binary
public static string FromHexToBinary(string hexstring) {
StringBuilder binarystring = new StringBuilder(hexstring.Length * 4);
(10)
A - 3
{
for (int i = 0; i < hexstring.Length; i++) {
int hex =
Convert.ToInt32(hexstring[i].ToString(), 16); int factor = 8;
for (int j = 0; j < 4; j++) {
if (hex >= factor) {
hex -= factor;
binarystring.Append("1"); }
else {
binarystring.Append("0"); }
factor /= 2; }
} }
catch (Exception e) {
Console.WriteLine(e.Message + " - wrong hexa integer format.");
}
return binarystring.ToString(); }
#endregion
#region Convert Binary to hex
public static string FromBinaryToHex(string binarystring) {
StringBuilder hexstring = new StringBuilder(binarystring.Length / 4);
for (int i = 0; i < binarystring.Length / 4; i++) {
int word =
Convert.ToInt32(binarystring.Substring(i * 4, 4), 2);
hexstring.Append(String.Format("{0:X}", word)); }
return hexstring.ToString(); }
#endregion
#region Convert Text to binary
public static string FromTextToBinary(string text) {
StringBuilder binarystring = new StringBuilder(text.Length * 8);
(11)
A - 4
foreach (char word in text) {
int binary = word; int factor = 128;
for (int i = 0; i < 8; i++) {
if (binary >= factor) {
binary -= factor;
binarystring.Append("1"); }
else {
binarystring.Append("0"); }
factor /= 2; }
}
return binarystring.ToString(); }
#endregion
#region Set Text Multiple Of 64bit
public static string setTextMutipleOf64Bits(string text) {
int maxLength = 0;
if ((text.Length % 64) != 0) {
maxLength = ((text.Length / 64) + 1) * 64; }
text = text.PadRight(maxLength, '0'); return text;
}
#endregion
#region Set text multiple of 128bit
public static string setTextMutipleOf128Bits(string text) {
if ((text.Length % 128) != 0) {
int maxLength;
maxLength = ((text.Length / 128) + 1) * 128; text = text.PadRight(maxLength, '0');
}
return text; }
#endregion }
(12)
A - 5
TRANSFORM TABLES
class TransformTables {#region S-Box and Inverse S-Box
public static readonly string [,] sbox = new string[,] { {"63","7c","77","7b","f2","6b","6f","c5","30","01","67","2b","fe", "d7","ab","76"}, {"ca","82","c9","7d","fa","59","47","f0","ad","d4","a2","af","9c", "a4","72","c0"}, {"b7","fd","93","26","36","3f","f7","cc","34","a5","e5","f1","71", "d8","31","15"}, {"04","c7","23","c3","18","96","05","9a","07","12","80","e2","eb", "27","b2","75"}, {"09","83","2c","1a","1b","6e","5a","a0","52","3b","d6","b3","29", "e3","2f","84"}, {"53","d1","00","ed","20","fc","b1","5b","6a","cb","be","39","4a", "4c","58","cf"}, {"d0","ef","aa","fb","43","4d","33","85","45","f9","02","7f","50", "3c","9f","a8"}, {"51","a3","40","8f","92","9d","38","f5","bc","b6","da","21","10", "ff","f3","d2"}, {"cd","0c","13","ec","5f","97","44","17","c4","a7","7e","3d","64", "5d","19","73"}, {"60","81","4f","dc","22","2a","90","88","46","ee","b8","14","de", "5e","0b","db"}, {"e0","32","3a","0a","49","06","24","5c","c2","d3","ac","62","91", "95","e4","79"}, {"e7","c8","37","6d","8d","d5","4e","a9","6c","56","f4","ea","65", "7a","ae","08"}, {"ba","78","25","2e","1c","a6","b4","c6","e8","dd","74","1f","4b", "bd","8b","8a"}, {"70","3e","b5","66","48","03","f6","0e","61","35","57","b9","86", "c1","1d","9e"}, {"e1","f8","98","11","69","d9","8e","94","9b","1e","87","e9","ce", "55","28","df"}, {"8c","a1","89","0d","bf","e6","42","68","41","99","2d","0f","b0", "54","bb","16"}};
(13)
A - 6
public static readonly string[,] inverse_sbox = new string[,] { {"52","09","6a","d5","30","36","a5","38","bf","40","a3","9e","81", "f3","d7","fb"}, {"7c","e3","39","82","9b","2f","ff","87","34","8e","43","44","c4", "de","e9","cb"}, {"54","7b","94","32","a6","c2","23","3d","ee","4c","95","0b","42", "fa","c3","4e"}, {"08","2e","a1","66","28","d9","24","b2","76","5b","a2","49","6d", "8b","d1","25"}, {"72","f8","f6","64","86","68","98","16","d4","a4","5c","cc","5d", "65","b6","92"}, {"6c","70","48","50","fd","ed","b9","da","5e","15","46","57","a7", "8d","9d","84"}, {"90","d8","ab","00","8c","bc","d3","0a","f7","e4","58","05","b8", "b3","45","06"}, {"d0","2c","1e","8f","ca","3f","0f","02","c1","af","bd","03","01", "13","8a","6b"}, {"3a","91","11","41","4f","67","dc","ea","97","f2","cf","ce","f0", "b4","e6","73"}, {"96","ac","74","22","e7","ad","35","85","e2","f9","37","e8","1c", "75","df","6e"}, {"47","f1","1a","71","1d","29","c5","89","6f","b7","62","0e","aa", "18","be","1b"}, {"fc","56","3e","4b","c6","d2","79","20","9a","db","c0","fe","78", "cd","5a","f4"}, {"1f","dd","a8","33","88","07","c7","31","b1","12","10","59","27", "80","ec","5f"}, {"60","51","7f","a9","19","b5","4a","0d","2d","e5","7a","9f","93", "c9","9c","ef"}, {"a0","e0","3b","4d","ae","2a","f5","b0","c8","eb","bb","3c","83", "53","99","61"}, {"17","2b","04","7e","ba","77","d6","26","e1","69","14","63","55", "21","0c","7d"}}; #endregion
#region MixColumns Transform Matrix
public static readonly Matrix MixColumnFactor = new
Matrix(BaseTransform.FromHexToBinary("0201010303020101010302010101 0302"));
(14)
A - 7
public static readonly Matrix Inverse_MixColumnFactor = new
Matrix(BaseTransform.FromHexToBinary("0e090d0b0b0e090d0d0b0e09090d 0b0e"));
#endregion #region Rcon
public static List<Matrix> Rcon = new List<Matrix>(10); #endregion
#region Transform Tables static TransformTables() {
Rcon.Add(new
Matrix(BaseTransform.FromHexToBinary("01000000"), 4, 1)); Rcon.Add(new
Matrix(BaseTransform.FromHexToBinary("02000000"), 4, 1)); Rcon.Add(new
Matrix(BaseTransform.FromHexToBinary("04000000"), 4, 1)); Rcon.Add(new
Matrix(BaseTransform.FromHexToBinary("08000000"), 4, 1)); Rcon.Add(new
Matrix(BaseTransform.FromHexToBinary("10000000"), 4, 1)); Rcon.Add(new
Matrix(BaseTransform.FromHexToBinary("20000000"), 4, 1)); Rcon.Add(new
Matrix(BaseTransform.FromHexToBinary("40000000"), 4, 1)); Rcon.Add(new
Matrix(BaseTransform.FromHexToBinary("80000000"), 4, 1)); Rcon.Add(new
Matrix(BaseTransform.FromHexToBinary("1b000000"), 4, 1)); Rcon.Add(new
Matrix(BaseTransform.FromHexToBinary("36000000"), 4, 1)); }
#endregion
KEYS
class Keys {public List<Matrix> RoundKeys = new List<Matrix>(11);
public void setCipherKey(Matrix CipherKey) {
if (RoundKeys.Count == 0) {
RoundKeys.Add(CipherKey); }
else {
RoundKeys.Clear();
RoundKeys.Add(CipherKey); }
(15)
A - 8
RoundKeys.Add(new Matrix(4, 4)); RoundKeys.Add(new Matrix(4, 4)); RoundKeys.Add(new Matrix(4, 4)); RoundKeys.Add(new Matrix(4, 4)); RoundKeys.Add(new Matrix(4, 4)); RoundKeys.Add(new Matrix(4, 4)); RoundKeys.Add(new Matrix(4, 4)); RoundKeys.Add(new Matrix(4, 4)); RoundKeys.Add(new Matrix(4, 4)); RoundKeys.Add(new Matrix(4, 4)); }
}
MATRIX
class Matrix {#region Private Fields private string[,] matrix; private int rows = 0; private int columns = 0; #endregion
#region Constructor
public Matrix(int rows, int columns) : this("", rows, columns)
{ }
public Matrix(string text) : this(text, 4, 4) {
}
public Matrix(string text, int rows, int columns) {
if (text.Length != columns * rows * 8) {
text = text.PadRight(columns * rows * 8 - text.Length, '0');
}
matrix = new string[rows, columns]; int count = 0;
this.rows = rows;
this.columns = columns;
for (int i = 0; i < columns; i++) {
for (int j = 0; j < rows; j++) {
matrix[j, i] = text.Substring(count * 8, 8); count++;
(16)
A - 9
} } }
#endregion
public void setState(string text) {
if (text.Length != columns * rows * 8) {
throw new Exception("It's not equal size to state");
}
int count = 0;
for (int i = 0; i < columns; i++) {
for (int j = 0; j < rows; j++) {
matrix[j, i] = text.Substring(count * 8, 8); count++;
}
} }
#region Properties, Indexer public int Rows
{
get {
return rows; }
}
public int Columns {
get {
return columns; }
}
public string this[int i, int j] {
get {
return matrix[i, j]; }
set {
if (value.Length == 2) {
matrix[i, j] = BaseTransform.FromHexToBinary(value); }
(17)
A - 10
{
matrix[i, j] = value; }
} }
#endregion
#region Overrided ToString method public override string ToString() {
StringBuilder text = new StringBuilder(128); if (matrix != null)
{
for (int j = 0; j < columns; j++) {
for (int i = 0; i < rows; i++) {
text.Append(matrix[i, j]); }
} }
return text.ToString(); }
#endregion
#region one row operation
public string[] getRow(int rowindex) {
string[] row = new string[columns]; if (rowindex > rows)
{
throw new IndexOutOfRangeException("out of row index error.");
}
for (int i = 0; i < columns; i++) {
row[i] = matrix[rowindex, i]; }
return row; }
public void setRow(string[] row, int rowindex) {
if (rowindex > rows) {
throw new IndexOutOfRangeException("out of row index error.");
}
for (int i = 0; i < columns; i++) {
(18)
A - 11
} }
#endregion
#region one column operation
public string[] getWord(int wordindex) {
string[] word = new string[rows]; if (wordindex > rows)
{
throw new IndexOutOfRangeException("out of column index error.");
}
for (int i = 0; i < rows; i++) {
word[i] = matrix[i, wordindex]; }
return word; }
public void setWord(string[] word, int wordindex) {
if (wordindex > rows) {
throw new IndexOutOfRangeException("out of column index error.");
}
for (int i = 0; i < rows; i++) {
matrix[i, wordindex] = word[i]; }
}
#endregion }
#endregion
#region Matrix Operations class MatrixMultiplication {
public static Matrix Multiply(Matrix a, Matrix b, bool IsMixColumns)
{
if (IsMixColumns) {
return MixColumnsMultiply(a, b); }
else {
return null; }
(19)
A - 12
public static Matrix XOR(Matrix a, Matrix b) {
Matrix c = new Matrix(a.Rows, a.Columns); for (int i = 0; i < c.Rows; i++)
{
for (int j = 0; j < c.Columns; j++) {
c[i, j] = MultiplicativeInverse.XOR(a[i, j], b[i, j]);
} }
return c; }
#region Matrix multiplication by MixColumns step
private static Matrix MixColumnsMultiply(Matrix a, Matrix b)
{
/* If A is an m-by-n matrix and B is an n-by-p matrix,
then their matrix product AB is the m-by-p matrix (m rows, p columns) */
//A - m rows, n columns
//B - n rows, p columns
//AB - m rows, p columns
Matrix c = new Matrix(a.Rows, b.Columns);
//string temp2 = "";
for (int j = 0; j < c.Columns; j++) {
//temp.Remove(0, temp.Length);
for (int i = 0; i < c.Rows; i++) {
StringBuilder temp = new StringBuilder(32);
temp.Append(MultiplicativeInverse.GetInverse(a[i, 0], b[0, j], "00011011", 8));
temp.Append(MultiplicativeInverse.GetInverse(a[i, 1], b[1, j], "00011011", 8));
temp.Append(MultiplicativeInverse.GetInverse(a[i, 2], b[2, j], "00011011", 8));
temp.Append(MultiplicativeInverse.GetInverse(a[i, 3], b[3, j], "00011011", 8));
(20)
A - 13
temp2 =
MultiplicativeInverse.XOR(temp.ToString().Substring(0, 8), temp.ToString().Substring(8, 8));
temp2 = MultiplicativeInverse.XOR(temp2, temp.ToString().Substring(16, 8));
temp2 = MultiplicativeInverse.XOR(temp2, temp.ToString().Substring(24, 8));
c[i, j] = temp2; }
}
return c; }
#endregion }
#endregion
PROCESS AES
class Matrix {
#region Private Fields private string[,] matrix; private int rows = 0; private int columns = 0; #endregion
#region Constructor
public Matrix(int rows, int columns) : this("", rows, columns)
{ }
public Matrix(string text) : this(text, 4, 4) {
}
public Matrix(string text, int rows, int columns) {
if (text.Length != columns * rows * 8) {
text = text.PadRight(columns * rows * 8 - text.Length, '0');
}
matrix = new string[rows, columns]; int count = 0;
this.rows = rows;
this.columns = columns;
(21)
A - 14
{
for (int j = 0; j < rows; j++) {
matrix[j, i] = text.Substring(count * 8, 8); count++;
} } }
#endregion
public void setState(string text) {
if (text.Length != columns * rows * 8) {
throw new Exception("It's not equal size to state");
}
int count = 0;
for (int i = 0; i < columns; i++) {
for (int j = 0; j < rows; j++) {
matrix[j, i] = text.Substring(count * 8, 8); count++;
}
} }
#region Properties, Indexer public int Rows
{
get {
return rows; }
}
public int Columns {
get {
return columns; }
}
public string this[int i, int j] {
get {
return matrix[i, j]; }
set {
(22)
A - 15
{
matrix[i, j] = BaseTransform.FromHexToBinary(value); }
else if (value.Length == 8) {
matrix[i, j] = value; }
} }
#endregion
#region Overrided ToString method public override string ToString() {
StringBuilder text = new StringBuilder(128); if (matrix != null)
{
for (int j = 0; j < columns; j++) {
for (int i = 0; i < rows; i++) {
text.Append(matrix[i, j]); }
} }
return text.ToString(); }
#endregion
#region one row operation
public string[] getRow(int rowindex) {
string[] row = new string[columns]; if (rowindex > rows)
{
throw new IndexOutOfRangeException("out of row index error.");
}
for (int i = 0; i < columns; i++) {
row[i] = matrix[rowindex, i]; }
return row; }
public void setRow(string[] row, int rowindex) {
if (rowindex > rows) {
throw new IndexOutOfRangeException("out of row index error.");
(23)
A - 16
}
for (int i = 0; i < columns; i++) {
matrix[rowindex, i] = row[i]; }
}
#endregion
#region one column operation
public string[] getWord(int wordindex) {
string[] word = new string[rows]; if (wordindex > rows)
{
throw new IndexOutOfRangeException("out of column index error.");
}
for (int i = 0; i < rows; i++) {
word[i] = matrix[i, wordindex]; }
return word; }
public void setWord(string[] word, int wordindex) {
if (wordindex > rows) {
throw new IndexOutOfRangeException("out of column index error.");
}
for (int i = 0; i < rows; i++) {
matrix[i, wordindex] = word[i]; }
}
#endregion }
#endregion
#region Matrix Operations class MatrixMultiplication {
public static Matrix Multiply(Matrix a, Matrix b, bool IsMixColumns)
{
if (IsMixColumns) {
return MixColumnsMultiply(a, b); }
(24)
A - 17
else {
return null; }
}
public static Matrix XOR(Matrix a, Matrix b) {
Matrix c = new Matrix(a.Rows, a.Columns); for (int i = 0; i < c.Rows; i++)
{
for (int j = 0; j < c.Columns; j++) {
c[i, j] = MultiplicativeInverse.XOR(a[i, j], b[i, j]);
} }
return c; }
#region Matrix multiplication by MixColumns step
private static Matrix MixColumnsMultiply(Matrix a, Matrix b)
{
/* If A is an m-by-n matrix and B is an n-by-p matrix,
then their matrix product AB is the m-by-p matrix (m rows, p columns) */
//A - m rows, n columns
//B - n rows, p columns
//AB - m rows, p columns
Matrix c = new Matrix(a.Rows, b.Columns);
//string temp2 = "";
for (int j = 0; j < c.Columns; j++) {
//temp.Remove(0, temp.Length);
for (int i = 0; i < c.Rows; i++) {
StringBuilder temp = new StringBuilder(32);
temp.Append(MultiplicativeInverse.GetInverse(a[i, 0], b[0, j], "00011011", 8));
temp.Append(MultiplicativeInverse.GetInverse(a[i, 1], b[1, j], "00011011", 8));
temp.Append(MultiplicativeInverse.GetInverse(a[i, 2], b[2, j], "00011011", 8));
temp.Append(MultiplicativeInverse.GetInverse(a[i, 3], b[3, j], "00011011", 8));
(25)
A - 18
string temp2; temp2 =
MultiplicativeInverse.XOR(temp.ToString().Substring(0, 8), temp.ToString().Substring(8, 8));
temp2 = MultiplicativeInverse.XOR(temp2, temp.ToString().Substring(16, 8));
temp2 = MultiplicativeInverse.XOR(temp2, temp.ToString().Substring(24, 8));
c[i, j] = temp2; }
}
return c; }
#endregion }
#endregion
MULTIPLICATIVE INVERSE
class MultiplicativeInverse {#region For Multiplication of GP(2n) #region Non-circular left shift
public static string LeftShift2(string text, int level) {
StringBuilder shifted = new StringBuilder(text.Length);
shifted.Append(text.Substring(1) + "0"); if (!level.Equals(8))
{
for (int i = 0; i <= text.Length - (1 + level); i++)
{
shifted[i] = '0'; }
}
return shifted.ToString(); }
#endregion
#region Calculate Multiplicative Inverse
public static string GetInverse(string text1, string text2, string mx, int n)
{
(26)
A - 19
if (text1.IndexOf('1') > text2.IndexOf('1')) {
string temp = text2; text2 = text1;
text1 = temp; }
multiplyTable[0] = text1; for (int i = 1; i < n; i++) {
multiplyTable[i] = LeftShift2(multiplyTable[i - 1], n);
if (multiplyTable[i - 1][text1.Length - n].Equals('1'))
{
multiplyTable[i] = XOR(multiplyTable[i], mx); }
}
string Mul_Inverse = "";
for (int i = 0; i < text2.Length; i++) {
if (text2[i].Equals('1')) {
if (Mul_Inverse.Equals("")) {
Mul_Inverse = multiplyTable[(text2.Length - 1/*2*/) - i];
} else {
Mul_Inverse = XOR(Mul_Inverse, multiplyTable[(text2.Length - 1) - i]);
} } }
if (Mul_Inverse.Equals("")) {
Mul_Inverse = "00000000"; }
return Mul_Inverse; }
#endregion
#region XOR Operation
public static string XOR(string text1, string text2) {
if (text1.Length != text2.Length) {
int count = Math.Abs(text1.Length - text2.Length); string temp = "";
(27)
A - 20
for (int i = 0; i < count; i++) {
temp += "0"; }
if (text1.Length > text2.Length) {
text2 = temp + text2; }
else {
text1 = temp + text1; }
}
StringBuilder XORed_Text = new StringBuilder(text1.Length);
for (int i = 0; i < text1.Length; i++) {
if (text1[i] != text2[i]) {
XORed_Text.Append("1"); }
else {
XORed_Text.Append("0"); }
}
return XORed_Text.ToString(); }
#endregion #endregion }
(28)
1 Universitas Kristen Maranatha
BAB I
PENDAHULUAN
1.1
LATAR BELAKANG MASALAH
Data merupakan sesuatu yang harus dijaga, terutama kerahasiaan dan
keamanannya. Salah satu cara mengamankan data adalah menggunakan teknik
kriptografi. Kriptografi merupakan salah satu metode pengamanan data yang biasa
digunakan untuk menjaga kerahasiaan data, keaslian data, serta autentikasi sang
pengirim pesan.
Kriptografi adalah ilmu yang berguna untuk mengacak data sedemikian
rupa sehingga tidak bisa dibaca oleh pihak ketiga, data yang diacak hanya bisa
dibaca oleh pihak yang berwenang dengan menggunakan sebuah kunci yang
sudah disepakati.
Data yang ingin diacak biasa disebut plainteks dan di enkripsi
menggunakan kunci enkripsi, data hasil enkripsi dinamakan chiperteks dan di
dekripsi kembali menggunakan kunci dekripsi.
Dari segi algoritma yang digunakan, kriptografi dibagi menjadi 2,
algoritma kunci simetri dan asimetri. Pada algoritma kunci simetri, kedua pihak
menggunakan kunci umum yang sama, sedangkan pada algoritma kunci asimetri,
kedua pihak masing-masing berbagi kunci publik.
(29)
2 Universitas Kristen Maranatha
Algoritma kriptografi yang baik membutuhkan waktu yang lama untuk
memecahkan pesan yang telah disandikan. Seiring dengan berkembangnya
teknologi komputer, dunia teknologi membutuhkan algoritma kriptografi yang
lebih kuat dan aman.
Algoritma AES atau Rijndael adalah salah satu contoh algoritma kunci
simetris, diciptakan oleh Vincent Rijmen dan John Daemen asal Belgia sebagai
pemenang kompetisi kriptografi untuk mencari pengganti DES yang
diselenggarakan oleh NIST (National Institute of Standards and Technology) pada
tahun 2001. Setelah mengalami proses standarisasi oleh NIST, akhirnya pada
bulan Mei 2002 Rijndael / AES ditetapkan sebagai standar algoritma kriptografi.
1.2
RUMUSAN MASALAH
Bagaimana membuat program yang mengimplementasikan algoritma AES
agar bisa digunakan untuk mengamankan data berbasis teks agar tidak bisa dibaca
oleh pihak yang tidak berwenang.
1.3
TUJUAN
Membuat sebuah program yang bisa digunakan untuk mengamankan data
dengan menggunakan kriptografi algoritma AES.
(30)
3 Universitas Kristen Maranatha
1.4
PEMBATASAN MASALAH
-
Data yang diamankan / diacak berupa data berbasis teks saja
-
Program dibuat menggunakan bahasa pemgograman C#
-
Program dibuat menggunakan Microsoft Visual Studio C#
-
Kapasitas maksimal input sama dengan kapasitas maksimal textbox
program yang digunakan
1.5
SISTEMATIKA PENULISAN
BAB I PENDAHULUAN
Berisikan tentang latar belakang masalah dan tujuan dibuatnya karya tulis ini.
BAB II LANDASAN TEORI
Berisikan tentang teori
–
teori mengenai kriptografi, macam
–
macam algoritma
kriptografi, algoritma AES / Rijndael dan beberapa serangan terhadap teknik
kriptografi
BAB III PERANCANGAN
Berisi tentang bagaimana jalannya program yang mengimplementasikan
Algoritma AES / Rijndael
(31)
4 Universitas Kristen Maranatha
BAB IV PENGAMATAN DATA
Berisi tentang hasil keluaran program dan beberapa percobaan
BAB V Kesimpulan dan Saran
Berisi kesimpulan dan saran
(32)
41
Universitas Kristen MaranathaBAB V
KESIMPULAN DAN SARAN
5.1 KESIMPULAN
Perancangan dan pembuatan program yang dapat digunakan untuk
mengimplementasikan kriptografi algoritma AES / Rijndael telah berhasil
diselesaikan.
Dari beberapa percobaan yang dilakukan, program berjalan dengan baik
dan hasil keluaran juga sesuai sebagaimana mestinya. Proses enkripsi dan dekripsi
berjalan baik.
Proses enkripsi plainteks yang sama dengan kunci berbeda menghasilkan
chiperteks yang berbeda
–
beda, dan hasil enkripsi plainteks yang berbeda dengan
kunci yang sama juga menghasilkan chiperteks yang berbeda
–
beda.
Proses dekripsi pesan dengan kunci yang salah menghasilkan plainteks
yang salah, begitu juga dekripsi chiperteks yang salah akan menghasilkan
plainteks yang salah juga.
5.2 SARAN
Program ini mengimplementasikan algoritma AES / Rijndael untuk
mengamankan pesan, namun penggunaannya tidak praktis, karena pesan yang di
enkripsi harus disimpan ke notepad atau sejenisnya untuk seterusnya dikirim
kepada penerima pesan, untuk kedepannya, kemungkinan program ini dapat
dikembangkan menjadi sebuah sistem realtime sehingga dapat digunakan dalam
chatting, kirim pesan melalui situs email, jejaring sosial, dan berbagai media
pengiriman pesan lainnya.
(33)
42
Universitas Kristen MaranathaDAFTAR PUSTAKA
Munir, Rinaldi. 2006. Kriptografi. Bandung: Informatika
Ariyus, Dony. 2006. Kriptografi Keamanan Data dan Komunikasi. Yogyakarta :
Graha Ilmu
Andi, 2003. Memahami Model Enkripsi dan Security Data. Semarang : Andi
Yogyakarta
Kurniawan, Yusuf. 2004. Kriptografi Keamanan Internet dan Jaringan Komputer.
Bandung : Informatika
Manurung, Rosida T. 2009. Teknik Penulisan Karya Ilmiah. Bandung : Jendela
Mas Pustaka
–
Anggota IKAPI
http://id.wikipedia.org/wiki/Kriptografi
http://id.wikipedia.org/wiki/Advanced_Encryption_Standard.
http://blog.uad.ac.id/waskito/2009/12/02/2-4-5ekspansi-kunci-algoritma-kriptografi-rijndael-128/
http://bangunariyanto.wordpress.com/2010/03/09/advanced-encryption-standard/
http://ae89crypt5.wordpress.com/2008/05/12/sejarah-kriptografi/
(1)
BAB I
PENDAHULUAN
1.1 LATAR BELAKANG MASALAH
Data merupakan sesuatu yang harus dijaga, terutama kerahasiaan dan keamanannya. Salah satu cara mengamankan data adalah menggunakan teknik kriptografi. Kriptografi merupakan salah satu metode pengamanan data yang biasa digunakan untuk menjaga kerahasiaan data, keaslian data, serta autentikasi sang pengirim pesan.
Kriptografi adalah ilmu yang berguna untuk mengacak data sedemikian rupa sehingga tidak bisa dibaca oleh pihak ketiga, data yang diacak hanya bisa dibaca oleh pihak yang berwenang dengan menggunakan sebuah kunci yang sudah disepakati.
Data yang ingin diacak biasa disebut plainteks dan di enkripsi menggunakan kunci enkripsi, data hasil enkripsi dinamakan chiperteks dan di dekripsi kembali menggunakan kunci dekripsi.
Dari segi algoritma yang digunakan, kriptografi dibagi menjadi 2, algoritma kunci simetri dan asimetri. Pada algoritma kunci simetri, kedua pihak menggunakan kunci umum yang sama, sedangkan pada algoritma kunci asimetri,
(2)
Algoritma kriptografi yang baik membutuhkan waktu yang lama untuk memecahkan pesan yang telah disandikan. Seiring dengan berkembangnya teknologi komputer, dunia teknologi membutuhkan algoritma kriptografi yang lebih kuat dan aman.
Algoritma AES atau Rijndael adalah salah satu contoh algoritma kunci simetris, diciptakan oleh Vincent Rijmen dan John Daemen asal Belgia sebagai pemenang kompetisi kriptografi untuk mencari pengganti DES yang diselenggarakan oleh NIST (National Institute of Standards and Technology) pada tahun 2001. Setelah mengalami proses standarisasi oleh NIST, akhirnya pada bulan Mei 2002 Rijndael / AES ditetapkan sebagai standar algoritma kriptografi.
1.2 RUMUSAN MASALAH
Bagaimana membuat program yang mengimplementasikan algoritma AES agar bisa digunakan untuk mengamankan data berbasis teks agar tidak bisa dibaca oleh pihak yang tidak berwenang.
1.3 TUJUAN
Membuat sebuah program yang bisa digunakan untuk mengamankan data dengan menggunakan kriptografi algoritma AES.
(3)
1.4 PEMBATASAN MASALAH
- Data yang diamankan / diacak berupa data berbasis teks saja - Program dibuat menggunakan bahasa pemgograman C# - Program dibuat menggunakan Microsoft Visual Studio C#
- Kapasitas maksimal input sama dengan kapasitas maksimal textbox program yang digunakan
1.5 SISTEMATIKA PENULISAN
BAB I PENDAHULUAN
Berisikan tentang latar belakang masalah dan tujuan dibuatnya karya tulis ini.
BAB II LANDASAN TEORI
Berisikan tentang teori – teori mengenai kriptografi, macam – macam algoritma kriptografi, algoritma AES / Rijndael dan beberapa serangan terhadap teknik kriptografi
BAB III PERANCANGAN
Berisi tentang bagaimana jalannya program yang mengimplementasikan Algoritma AES / Rijndael
(4)
BAB IV PENGAMATAN DATA
Berisi tentang hasil keluaran program dan beberapa percobaan
BAB V Kesimpulan dan Saran Berisi kesimpulan dan saran
(5)
BAB V
KESIMPULAN DAN SARAN
5.1 KESIMPULAN
Perancangan dan pembuatan program yang dapat digunakan untuk mengimplementasikan kriptografi algoritma AES / Rijndael telah berhasil diselesaikan.
Dari beberapa percobaan yang dilakukan, program berjalan dengan baik dan hasil keluaran juga sesuai sebagaimana mestinya. Proses enkripsi dan dekripsi berjalan baik.
Proses enkripsi plainteks yang sama dengan kunci berbeda menghasilkan chiperteks yang berbeda – beda, dan hasil enkripsi plainteks yang berbeda dengan kunci yang sama juga menghasilkan chiperteks yang berbeda – beda.
Proses dekripsi pesan dengan kunci yang salah menghasilkan plainteks yang salah, begitu juga dekripsi chiperteks yang salah akan menghasilkan plainteks yang salah juga.
5.2 SARAN
Program ini mengimplementasikan algoritma AES / Rijndael untuk mengamankan pesan, namun penggunaannya tidak praktis, karena pesan yang di enkripsi harus disimpan ke notepad atau sejenisnya untuk seterusnya dikirim kepada penerima pesan, untuk kedepannya, kemungkinan program ini dapat dikembangkan menjadi sebuah sistem realtime sehingga dapat digunakan dalam chatting, kirim pesan melalui situs email, jejaring sosial, dan berbagai media
(6)
DAFTAR PUSTAKA
Munir, Rinaldi. 2006. Kriptografi. Bandung: Informatika
Ariyus, Dony. 2006. Kriptografi Keamanan Data dan Komunikasi. Yogyakarta : Graha Ilmu
Andi, 2003. Memahami Model Enkripsi dan Security Data. Semarang : Andi Yogyakarta
Kurniawan, Yusuf. 2004. Kriptografi Keamanan Internet dan Jaringan Komputer. Bandung : Informatika
Manurung, Rosida T. 2009. Teknik Penulisan Karya Ilmiah. Bandung : Jendela Mas Pustaka – Anggota IKAPI
http://id.wikipedia.org/wiki/Kriptografi
http://id.wikipedia.org/wiki/Advanced_Encryption_Standard.
http://blog.uad.ac.id/waskito/2009/12/02/2-4-5ekspansi-kunci-algoritma-kriptografi-rijndael-128/
http://bangunariyanto.wordpress.com/2010/03/09/advanced-encryption-standard/ http://ae89crypt5.wordpress.com/2008/05/12/sejarah-kriptografi/