Javascript melaksanakan algoritma kata laluan playfair dan bukit_Pengetahuan asas

WBOY
Lepaskan: 2016-05-16 16:28:36
asal
1646 orang telah melayarinya

Sehingga akhir semester, belajar untuk kerja rumah tentang pengenalan kepada keselamatan maklumat. Saya kebetulan menjumpai algoritma playfair dan algoritma bukit dalam algoritma kriptografi klasik Sangat menarik untuk melaksanakannya dalam bahasa JavaScript. Saya menyemak Baidu semasa pengekodan, dan secara kebetulan, saya mempelajari asas JavaScript.

playfair

Sifir Playfair (Bahasa Inggeris: Playfair cipher atau Playfair square) ialah sifir penggantian. Ia ditulis berdasarkan jadual kata laluan yang terdiri daripada petak 5*5, dengan 25 huruf disusun dalam jadual. Untuk 26 huruf dalam bahasa Inggeris, Z yang paling biasa digunakan dialih keluar untuk membentuk jadual kata laluan.

Idea pelaksanaan:

1. Sediakan jadual kata laluan

Kunci ialah perkataan atau frasa, dan jadual kata laluan disusun berdasarkan kunci yang diberikan oleh pengguna. Jika terdapat huruf berulang, huruf berulang seterusnya boleh dialih keluar.

Jika kunci anjing gila, ia boleh dikompilasi menjadi

C
O
H
M
T
R
G
Saya
N
U
A
B
J
P
V
Y
E
K
S
W
D
F
L
S
X

Salin kod Kod adalah seperti berikut:

/*
* Fungsi: Sediakan jadual kata laluan
*
* Parameter: Kunci (selepas mengalih keluar ruang dan menggunakan huruf besar)
*
* Kembali: Jadual kata laluan
*/
fungsi createKey(keychars){
//Susun atur abjad
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'];
//Cara kekunci pembolehubah mendapat kedudukan huruf dalam jadual susunan abjad, padamkan huruf
for(var i = 0 ;i          indeks var = allChars.indexOf(keychars[i]);
Jika (indeks > -1) {
              allChars.splice(index, 1);
}
}
//Masukkan huruf dalam keychar ke dalam abjad
for(var i = keychars.length-1;i>=0;i--){
         allChars.unshift(keychars[i]);
}
//Masukkan keychars ke dalam jadual kata laluan dari lajur pertama
untuk(var i = 0; i<5; i){
           untuk(var j = 0; j<5;j){
             kunci[j][i] = allChars[i*5 j];
}
}

Pertimbangkan keperluan untuk mengalih keluar aksara pendua dan Z apabila memasukkan aksara kunci ke dalam jadual kata laluan Algoritma reka bentuk adalah seperti berikut:

Salin kod Kod adalah seperti berikut:

/*
* Fungsi: Keluarkan huruf berulang dalam rentetan
*
* Parameter: Rentetan yang perlu diproses
*
* Kembali: rentetan yang diproses
*/
function removeDuplicate(str){
var result = [],tempStr = "";
var arr = str.split('');//Pisah rentetan kepada tatasusunan
​​​​ //arr.sort();//Isih
untuk(var i = 0; i < arr.length; i ){
                 var repeatBack = true;//Pembolehubah reka bentuk adalah untuk memastikan aksara yang sama tidak wujud di bahagian hadapan rentetan, kerana algoritma berikut hanya boleh memastikan aksara yang sama disambungkan bersama
for(var j = 0;j Jika(arr[i] == hasil[j])
                          repeatBack = palsu;
            }
If(arr[i] !== tempStr && repeatBack){
                   result.push(arr[i]);
                tempStr = arr[i];
               } lain{
                         teruskan;
            }
}
           return result.join("");//Tukar tatasusunan kepada rentetan
}

2. Susun teks biasa

Bentuk sepasang setiap dua huruf plaintext. Jika terdapat dua huruf yang sama bersebelahan antara satu sama lain dalam sepasang atau huruf terakhir adalah satu huruf, masukkan X. Pengekodan awal tidak bertimbang rasa, dan pengguna secara paksa menolak untuk memasukkan bilangan huruf ganjil, mengakibatkan pengalaman pengguna yang buruk.

var k = document.getElementById("keychars").value.toUpperCase().replace(/s/ig,'');
Alih keluar ruang dan tukar teks biasa kepada huruf besar.

3. Tulis teks sifir

Peraturan penyulitan teks biasa (dari Baidu):

1) Jika p1 dan p2 berada pada baris yang sama, sifir teks c1 dan c2 yang sepadan ialah huruf serta-merta di sebelah kanan p1 dan p2. Lajur pertama dianggap berada di sebelah kanan lajur terakhir. Contohnya, mengikut jadual sebelumnya, ct sepadan dengan oc
2) Jika p1 dan p2 berada dalam lajur yang sama, teks sifir c1 dan c2 yang sepadan ialah huruf tepat di bawah p1 dan p2. Baris pertama dianggap berada di bawah baris terakhir.
3) Jika p1 dan p2 tidak berada dalam baris atau lajur yang sama, maka c1 dan c2 ialah huruf di dua penjuru lain segi empat tepat yang ditentukan oleh p1 dan p2 (untuk penggantian mendatar atau penggantian menegak, anda mesti membuat temu janji dalam terlebih dahulu, atau cuba sendiri). Mengikut jadual sebelumnya, wh sepadan dengan tk atau kt.

Contohnya, mengikut jadual di atas, teks yang jelas di mana ada kehidupan, di situ ada harapan.
Ia boleh diatur sebagai mana dia hidup semula pada masa lalu
Maka teks sifirnya ialah: kt yg wo ok gy nl hj of cm yg kg lm mb wf
Tukar teks sifir kepada huruf besar dan susun huruf dalam kumpulan.
Contohnya, sekumpulan 5 orang ialah KTYGW OOKGY NLHJO FCMYG KGLMM BWF

4. Penyahsulitan
Kunci diisi dalam matriks 5*5 (mengeluarkan huruf berulang dan huruf z lain yang tidak digunakan dalam matriks diisi dalam kedudukan matriks yang selebihnya mengikut urutan . Lakukan sebaliknya.

Kesannya adalah seperti yang ditunjukkan dalam rajah:

bukit

Hill Password ialah sifir penggantian yang menggunakan prinsip teori matriks asas. Ia ditulis berdasarkan jadual kata laluan yang terdiri daripada petak 5*5, dengan 25 huruf disusun dalam jadual. Untuk 26 huruf dalam bahasa Inggeris, Z yang paling biasa digunakan dialih keluar untuk membentuk jadual kata laluan.

Idea pelaksanaan:

1, Tulis abjad
var aksara = ['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','Z'];
2. Menjana kunci secara rawak

Salin kod Kod adalah seperti berikut:

/*
* Fungsi: Menjana kunci secara rawak
*
* Pulangan: matriks kunci
*/
fungsi randomCreateKey(){
// Menjana nombor secara rawak 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&)
}
}
}

3. Kod kunci memproses teks biasa berdasarkan kunci yang dijana secara automatik:

Salin kod Kod adalah seperti berikut:

/*
* Fungsi: algoritma bukit
*
* Parameter: tatasusunan huruf besar yang panjangnya ialah gandaan 3
*
* Kembali: rentetan yang disulitkan
*/
bukit fungsi(p){
//Teks sifir huruf besar
var res = "";
//Tentukan jumlah bilangan kali rentetan perlu dilalui
var round = Math.round(p.length/3);
//Memproses
untuk(var b = 0;b //Teks biasa 3
            var temp3 ="";
        var tempArr3 = [];
var sumArr3 = [];
untuk(var i = 0;i<3;i){
              temp3 = p.shift();
for(var j = 0;j Jika(temp3[i] == aksara[j])
                   tempArr3[i] = j;
            }
}
                                                                                                                                                                                                                                                                                                                        untuk(var i =0;i<3;i){
untuk(var j = 0;j<3;j ){
                 sumArr3[i] = (tempArr3[j]*kunci[i][j])&;
            }
}
//Dapatkan indeks aksara yang sepadan dalam abjad
untuk(var i =0;i<3;i){
             res = aksara[sumArr3[i]];
}
}
Kembalikan semula;
};

Kesannya adalah seperti yang ditunjukkan dalam rajah:

Algoritma di atas mempunyai kekurangan:

1. Reka bentuk berorientasikan proses, gandingan tinggi

2. Terdapat terlalu banyak gelung bersarang dan kecekapan algoritma perlu dioptimumkan

3. Pertimbangan yang tidak mencukupi tentang kemungkinan situasi, seperti tidak memproses apabila pengguna memasukkan aksara bukan abjad.

Ringkasan:

Setelah mempelajari kursus Pengenalan Keselamatan Maklumat untuk seketika, saya hanya boleh menconteng permukaan keselamatan maklumat. Keselamatan maklumat adalah subjek yang sangat menarik Apabila anda menghadapi beberapa masalah, anda harus memikirkannya sebanyak mungkin, melakukannya sebanyak mungkin, dan menggunakannya sebanyak mungkin. Pada masa yang sama, ia juga perlu untuk mengukuhkan pengumpulan asas matematik, mengukuhkan asas js, dan meluaskan pengetahuan. Jalan di hadapan adalah panjang dan sukar.

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan