Pada akhir periode, kita akan melihat PRENDERIMAN PR. Saya kebetulan menemukan algoritma playfair dan algoritma bukit dalam algoritma kriptografi klasik. Sangat menarik untuk mengimplementasikannya dalam bahasa JavaScript. Saya memeriksa Baidu saat pengkodean, dan kemudian memberikan tutorial yang bagus tentang dasar -dasar Javascript.
Playfair
Playfair Password (Bahasa Inggris: Playfair Cipher atau Playfair Square) adalah kata sandi pengganti. Ditulis berdasarkan tabel cipher 5*5 persegi, dengan 25 huruf diatur dalam tabel. Untuk 26 huruf dalam bahasa Inggris, hapus z yang paling umum digunakan untuk membentuk tabel kata sandi.
Ide Implementasi:
1. Siapkan daftar kata sandi
Kunci adalah kata atau frasa, dan tabel kata sandi disortir berdasarkan kunci yang diberikan oleh pengguna. Jika ada huruf duplikat, Anda dapat menghapus huruf duplikat sesudahnya.
Misalnya, anjing gila kunci dapat dikompilasi
| C | HAI | H | M | T |
| R | G | SAYA | N | U |
| A | B | J | P | V |
| Y | E | K | Q | W |
| D | F | L | S | X |
Salinan kode adalah sebagai berikut:
/*
* Fungsi: menyusun daftar kata sandi
*
* Parameter: kunci (pemindahan ruang dan pemrosesan kapitalisasi)
*
* Return: Tabel Kata Sandi
*/
fungsi createKey (keychars) {
// array alfabet
var allChars = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y'];
// Kunci Kunci Variabel Dapatkan posisi huruf dalam tabel alfabet dan hapus huruf
untuk (var i = 0; i <keychars.length; i ++) {
indeks var = allchars.indexof (keychars [i]);
if (index> -1) {
allchars.splice (indeks, 1);
}
}
// Masukkan huruf ke dalam keychar ke dalam alfabet
untuk (var i = keychars.length-1; i> = 0; i-) {
allchars.unshift (Keychars [i]);
}
// Masukkan keychar dari kolom pertama ke tabel kata sandi
untuk (var i = 0; i <5; i ++) {
untuk (var j = 0; j <5; j ++) {
kunci [j] [i] = allchars [i*5+j];
}
}
}
Mempertimbangkan bahwa karakter duplikat dan z perlu dihapus saat memasukkan keychar ke tabel kata sandi, algoritma desain adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
/*
* Fungsi: Hapus huruf duplikat dari string
*
* Parameter: string yang perlu diproses
*
* Return: string olahan
*/
fungsi dihapusuplicate (str) {
var result = [], tempstr = "";
var arr = str.split (''); // Pisahkan string menjadi array
//arr.sort();//sortting
untuk (var i = 0; i <arr.length; i ++) {
var REURTBACK = true; // Variabel desain adalah untuk memastikan bahwa bagian sebelumnya dari string tidak ada dalam karakter yang sama, karena algoritma berikut hanya dapat memastikan bahwa karakter yang sama terhubung bersama -sama
untuk (var j = 0; j <result.length; j ++) {
if (arr [i] == hasil [j])
repeatback = false;
}
if (arr [i]! == Tempstr && RepeatBack) {
result.push (arr [i]);
tempstr = arr [i];
}kalau tidak{
melanjutkan;
}
}
return result.join (""); // konversi array ke string
}
2. Atur teks yang jelas
Buat sepasang dua huruf teks biasa. Jika ada dua huruf identik di sebelah satu sama lain berpasangan atau huruf terakhir adalah lajang, masukkan huruf X. Pada tahap awal pengkodean, ia tidak mempertimbangkan dan menolak untuk memasukkan jumlah huruf sebagai tunggal, yang membuat pengalaman pengguna buruk.
var k = document.geteLementById ("keychars"). value.touppercase (). REPLACE (// S/IG, '');
Hapus spasi dan konversi ke huruf besar untuk teks biasa.
3. Tulis teks sandi
Aturan Enkripsi Teks Polos (dari Baidu):
1) Jika P1 P2 berada pada baris yang sama, ciphertext C1 C2 yang sesuai adalah huruf yang dekat dengan ujung kanan P1 P2. Kolom pertama dianggap sebagai sisi kanan kolom terakhir. Misalnya, menurut tabel sebelumnya, CT sesuai dengan OC
2) Jika P1 P2 berada di kolom yang sama, ciphertext C1 C2 yang sesuai adalah huruf tepat di bawah P1 P2. Baris pertama dianggap sebagai di bawah baris terakhir.
3) Jika P1 dan P2 tidak berada di baris yang sama dan di kolom yang sama, maka C1 dan C2 adalah huruf di dua sudut lain persegi panjang yang ditentukan oleh P1 dan P2 (seperti untuk penggantian horizontal atau penggantian vertikal, Anda harus membuat janji di muka, atau coba sendiri). Sesuai tabel sebelumnya, WH sesuai dengan TK atau KT.
Misalnya, menurut tabel di atas, teks biasa di mana ada kehidupan, ada harapan.
Anda pertama -tama dapat mengaturnya menjadi apa yang dia lakukan
Maka ciphertext adalah: kt yg wo ok gy nl hj dari cm yg kg lm mb wf
Ubah ciphertext menjadi modal, dan kemudian atur dalam kelompok beberapa huruf.
Misalnya, dalam kelompok 5, ktygw ookgy nlhjo fcmyg kgm bwf
4. Dekripsi
Isi matriks 5*5 (ulangi huruf dan huruf z yang diulang), isi posisi yang tersisa dari matriks agar pada posisi yang tersisa dari matriks, dan dapatkan teks biasa dari ciphertext sesuai dengan matriks pengganti. Lakukan yang sebaliknya.
Efeknya seperti yang ditunjukkan pada gambar:
bukit
Kata Sandi Hill adalah kata sandi pengganti yang menggunakan prinsip teori matriks dasar. Ditulis berdasarkan tabel cipher 5*5 persegi, dengan 25 huruf diatur dalam tabel. Untuk 26 huruf dalam bahasa Inggris, hapus z yang paling umum digunakan untuk membentuk tabel kata sandi.
Ide Implementasi:
1. Tulis alfabet
var chars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', ',' w ',' w '
2. Menghasilkan kunci secara acak
Salinan kode adalah sebagai berikut:
/*
* Fungsi: Menghasilkan kunci secara acak
*
* Kembali: matriks utama
*/
function randomCreateKey () {
// menghasilkan angka secara acak dari 0 hingga 26
untuk (var i = 0; i <3; i ++) {
untuk (var j = 0; j <3; j ++) {
kunci [i] [j] = math.round (math.random ()*100%26)
}
}
}
3. Kode Kunci, Proses teks biasa berdasarkan kunci yang dihasilkan secara otomatis:
Salinan kode adalah sebagai berikut:
/*
* Fungsi: Algoritma Hill
*
* Parameter: Array huruf besar dengan kelipatan panjang 3
*
* Return: String terenkripsi
*/
fungsi bukit (p) {
// huruf besar teks cipher
var res = "";
// Kembangkan total jumlah kali string perlu dilalui
var round = math.round (p.length/3);
//menghadapi
untuk (var b = 0; b <round; b ++) {
// Teks polos 3
var temp3 = "";
var temparr3 = [];
var sumarr3 = [];
untuk (var i = 0; i <3; i ++) {
temp3 += p.shift ();
untuk (var j = 0; j <chars.length; j ++) {
if (temp3 [i] == chars [j])
temparr3 [i] = j;
}
}
//menghitung
untuk (var i = 0; i <3; i ++) {
untuk (var j = 0; j <3; j ++) {
sumarr3 [i] = (temparr3 [j]*kunci [i] [j])%26;
}
}
// Dapatkan indeks karakter yang sesuai di alfabet
untuk (var i = 0; i <3; i ++) {
res += chars [sumarr3 [i]];
}
}
Return Res;
};
Efeknya seperti yang ditunjukkan pada gambar:
Algoritma di atas memiliki kekurangan:
1. Desain berorientasi proses, derajat kopling tinggi
2. Terlalu banyak loop bersarang, efisiensi algoritma perlu dioptimalkan
3. Pertimbangan yang tidak memadai tentang kemungkinan situasi, seperti tidak memproses ketika pengguna memasukkan karakter non-alfabet.
Meringkaskan:
Setelah mempelajari kursus Pengantar Keamanan Informasi untuk jangka waktu tertentu, saya hanya dapat memahami dasar -dasar keamanan informasi. Keamanan informasi adalah subjek yang sangat menarik. Ketika Anda mengalami beberapa masalah, pikirkan sebanyak mungkin, lakukan lebih banyak, dan gunakan lebih banyak. Pada saat yang sama, kita juga harus memperkuat akumulasi fondasi matematika, mengkonsolidasikan JS Foundation, dan memperluas pengetahuan. Jalan ini memiliki jalan panjang.