Artikel ini akan memperkenalkan algoritma enkripsi/dekripsi yang sederhana dan mudah digunakan: menggunakan operasi OR (XOR) eksklusif. Prinsip algoritma ini sederhana dan bertujuan untuk memberikan kesan yang lebih intuitif kepada pembaca tentang enkripsi/dekripsi informasi.
Prinsip algoritma XOR
Dilihat dari metode utama enkripsi, metode transposisi terlalu sederhana, terutama jika jumlah datanya sedikit, teks biasa dari teks tersandi mudah ditebak, dan metode substitusi merupakan metode yang efektif dan sederhana. algoritma.
Dilihat dari karakteristik berbagai operasi substitusi, operasi XOR paling cocok untuk operasi enkripsi dan dekripsi sederhana. Prinsip metode ini adalah: ketika bilangan A dan bilangan B lainnya di-XOR, bilangan C lainnya akan dihasilkan operasi XOR pada C dan B, dan C akan dikembalikan ke A.
Dibandingkan dengan algoritma enkripsi sederhana lainnya, kelebihan algoritma XOR adalah sebagai berikut.
(1) Algoritmanya sederhana dan dapat dengan mudah diimplementasikan dalam bahasa tingkat tinggi.
(2) Cepat dan dapat digunakan kapan saja dan di mana saja.
(3) Ini valid untuk karakter apa pun. Tidak seperti beberapa algoritma enkripsi sederhana, yang hanya valid untuk karakter Barat, karakter Cina tidak dapat dikembalikan ke karakter asli setelah enkripsi dan dekripsi.
Implementasi algoritma XOR
Bagian sebelumnya memperkenalkan prinsip bagaimana menggunakan operasi XOR untuk enkripsi/dekripsi. Berdasarkan prinsip algoritma enkripsi XOR yang diperkenalkan pada bagian sebelumnya, tidak sulit untuk menulis fungsi enkripsi dan dekripsi berikut. Algoritme enkripsi dicantumkan terlebih dahulu.
1 <!--encrypy_xor: Fungsi enkripsi yang hanya menggunakan operasi XOR----------------------->
2 <?php
3 //Fungsi enkripsi
4 fungsi myEncrypt($string, $key)
5 {
6 untuk($i=0; $i<STRLEN($STRING); p $i++)<>
7 {
8 untuk($j=0; $j<STRLEN($KEY); p $j++)<>
9 {
10 $string[$i] = $string[$i]^$kunci[$j];
11 }
12}
13 kembalikan $string;
14}
Baris 4 mendefinisikan fungsi enkripsi myEncrypt(). Parameter masukan $string adalah teks biasa, dan $kunci adalah kuncinya; keluarannya adalah teks sandi yang dihasilkan menggunakan $kunci sebagai kunci dan menggunakan algoritma enkripsi XOR.
Perulangan for bagian luar pada baris 6 hingga 12 melakukan perulangan melalui setiap karakter string teks biasa, sedangkan perulangan for bagian dalam (baris 8 hingga 11) melakukan perulangan melalui setiap karakter dalam teks biasa dan melakukan pengecualian pada setiap bit operasi OR. Prinsip ini telah diperkenalkan pada bagian sebelumnya dan tidak akan diulangi lagi.
Sekali lagi, mirip dengan fungsi enkripsi, fungsi dekripsi berikut dapat ditulis.
1 //fungsi dekripsi
2 fungsi myDecrypt($string, $key)
3 {
4 untuk($i=0; $i<STRLEN($STRING); p $i++)<>
5 {
6 untuk($j=0; $j<STRLEN($KEY); p $j++)<>
7 {
8 $string[$i] = $kunci[$j]^$string[$i];
9}
10}
11 kembalikan $string;
12}
13?>
Baris 4 mendefinisikan fungsi dekripsi myDecrypt(), parameter input $string adalah ciphertext, dan $key adalah kuncinya; outputnya adalah plaintext yang dihasilkan menggunakan $key sebagai kunci dan menggunakan algoritma dekripsi XOR.
Di bawah ini, contoh aplikasi digunakan untuk mengilustrasikan lebih lanjut fungsi fungsi enkripsi.
1 //Contoh
2 $kata sandi_saya="kursi";
3 echo "kata sandi_saya = $kata sandi_saya";
4 $kunci_saya="1234567890";
5 $kata sandi_saya_en=Enkripsi Saya($kata_kata_saya,$kunci_saya);
6 gema "kata_kata_saya_en = $kata_kata_saya_en";
7 $kata sandi_saya_de=Dekripsisaya($kata_kata_saya_en,$kunci_saya);
8 echo "my_password_de = $my_password_de";
Baris 3 pertama-tama mendefinisikan teks yang jelas $my_password, dan kemudian mendefinisikan kunci $my_key pada baris 4.
Baris 5 dan 6 masing-masing memanggil fungsi enkripsi untuk menghasilkan teks tersandi dan mengeluarkannya, pada gilirannya, teks tersandi didekripsi pada baris 7 dan 8.
Hasil dari menjalankan contoh di atas adalah sebagai berikut.
my_password = kursi
my_password_en = RYPXC
my_password_de = kursi
Menerapkan otentikasi identitas menggunakan algoritma XOR
Dua bagian sebelumnya memperkenalkan prinsip dan implementasi enkripsi/dekripsi informasi menggunakan operasi XOR. Selanjutnya, metode ini akan digunakan untuk mengenkripsi kata sandi login pengguna. Dalam contoh ini, untuk melindungi kata sandi pengguna, sistem ingin mencapai tujuan berikut.
·Saat mendaftar, pengguna perlu mengisi formulir kata sandi pengguna.
·Selain pengguna itu sendiri, tidak ada orang lain yang dapat memperoleh informasi kata sandinya, termasuk perancang sistem dan administrator basis data.
·Sistem dapat memverifikasi keabsahan pengguna berdasarkan kata sandi yang dimasukkan oleh pengguna.
Untuk mencapai tujuan di atas, saat menggunakan algoritma XOR, Anda dapat memilih nama pengguna sebagai teks biasa, dan kuncinya adalah kata sandi yang ditentukan pengguna, dan kemudian menyimpan nama pengguna terenkripsi dalam database.
Selain itu, saat pengguna masuk, ada dua cara berikut untuk memverifikasi pengguna yang sah.
(1) Enkripsi ulang berdasarkan informasi nama pengguna (teks biasa) dan kata sandi (kunci) yang dikirimkan, dan gunakan informasi terenkripsi untuk membandingkan dengan informasi kata sandi yang disimpan dalam database. Jika sama, pengguna tersebut sah, sebaliknya , pengguna tersebut ilegal.
(2) Dekripsi berdasarkan informasi kata sandi (teks biasa) yang disimpan dalam database dan informasi kata sandi (kunci) yang dimasukkan oleh pengguna, dan bandingkan informasi terenkripsi dengan nama pengguna yang dikirimkan oleh pengguna sah, sebaliknya, untuk pengguna ilegal.
Kedua metode tersebut dapat mencapai tujuan ketiga. Kode implementasi contoh ini dapat diimplementasikan berdasarkan implementasi Bagian 18.4.1 "Login Pengguna" dan Bagian 18.4.2 "Periksa Pengguna". Halaman "Login Pengguna" tidak perlu diubah. Periksa Pengguna" adalah sebagai berikut.
1 <?php
2 session_start(); //Muat perpustakaan Sesi, yang harus ditempatkan pada baris pertama
3 $nama_pengguna=$_POST["nama_pengguna"];
4 session_register("user_name"); //Daftarkan variabel $user_name, perhatikan bahwa tidak ada simbol $
5
6 require_once("sys_conf.inc"); //File konfigurasi sistem, termasuk informasi konfigurasi database
7 require_once("encrypy_xor.php"); //Berisi file fungsi enkripsi xor
8
9 //Hubungkan ke basis data
10 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);
11 mysql_select_db($DBNAME); //Pilih basis data my_chat
12
13 //Menanyakan apakah ada informasi pengguna yang login
14 $str="pilih nama, kata sandi dari pengguna di mana nama ='$nama_pengguna'";
15 $hasil=mysql_query($str,$link_id); //Jalankan kueri
16 @$rows=mysql_num_rows($result); //Jumlah record yang diperoleh dari hasil query
17 $nama_pengguna=$_SESSION["nama_pengguna"];
18 $kata sandi=$_POST["kata sandi"];
19 $password_en=myEncrypt($user_name,$password); //Enkripsi informasi pengguna
20
21 //Untuk pengguna lama
22 jika($baris!=0)
dua puluh tiga {
24 daftar($nama,$pwd)=mysql_fetch_row($hasil);
25 $password_de=myDecrypt($pwd,$password); //Dekripsi informasi pengguna
26
27 //Jika kata sandi yang dimasukkan benar
28 if($nama_pengguna==$kata sandi_de)
29 {
30 $str="perbarui kumpulan pengguna is_online =1 di mana nama ='$nama_pengguna' dan kata sandi='$kata sandi_en'";
31 $hasil=mysql_query($str, $link_id); //Jalankan kueri
32 require("main.php"); //Buka halaman obrolan
33}
34 //Kesalahan masukan kata sandi
35 lainnya
36 {
37 memerlukan("relogin.php");
38 }
39 }
40 //Untuk pengguna baru, tulis informasi mereka ke database
41 lainnya
42 {
43 $str="masukkan ke nilai pengguna (nama, kata sandi, is_online) ('$nama_pengguna', '$kata sandi_en',1)";
44 $hasil=mysql_query($str, $link_id); //Jalankan kueri
45 require("main.php"); //Buka halaman obrolan
46 }
47 //Tutup database
48 mysql_close($link_id);
49 ?>
Baris 7 memperkenalkan file fungsi enkripsi encrypy_xor.php, termasuk dua fungsi yang diperkenalkan di bagian sebelumnya.
Pada baris 19, nilai sandi terenkripsi diperoleh dengan menggunakan nama pengguna dan sandi yang dikirimkan oleh pengguna, dan bagi pengguna baru, nilai terenkripsi ini disimpan dalam database pada baris 44.
Selain itu, untuk pengguna lama, dapatkan informasi nama pengguna dan kata sandi terenkripsi di database pada baris 24, gunakan kedua nilai ini untuk mendekripsi pada baris 25, lalu bandingkan nilai yang didekripsi dengan informasi nama pengguna yang dikirimkan oleh pengguna pada baris 28 untuk memeriksa keabsahan pengguna.
Bagian sebelumnya tentangpembuatan kunci secara otomatis
memperkenalkan cara menggunakan algoritma enkripsi XOR untuk mengenkripsi informasi pengguna. Informasi kata sandi yang dimasukkan oleh pengguna sebenarnya menjadi kunci dalam algoritma enkripsi, dan nama pengguna digunakan sebagai teks biasa sangat Ini menyelesaikan fungsinya dengan baik, tetapi secara logis, metode ini tampaknya agak tidak masuk akal.
Artikel ini akan memperkenalkan teknologi yang secara otomatis menghasilkan kunci. Anda dapat menggunakan kunci yang dibuat secara otomatis untuk mengenkripsi teks biasa dari kata sandi yang dikirimkan oleh pengguna, sehingga logikanya lebih masuk akal.
Dalam contoh ini, diasumsikan bahwa kunci yang dihasilkan adalah 512 bit. Kodenya adalah sebagai berikut.
1 <!--keygen.php: Secara otomatis menghasilkan kunci--------------------------------------------------->
2 <?php
3
4 //Secara otomatis menghasilkan kunci dengan panjang $len
5 fungsi generate_key($len)
6 {
7 $batas bawah = 35;
8 $batas atas = 96;
9 $strKeySaya = "";
10
11 untuk($i=1;$i<=$len;$i++)
12 {
13 $rnd=rand(0,100); //Hasilkan angka acak
14 $k = (($batas atas - $batas bawah) + 1) * $rnd + $batas bawah;
15 $strMyKey=$strMyKey.$k;
16}
17 kembalikan $strMyKey;
18}
19
20 //Tulis kunci ke file $file_name
21 fungsi write_key($kunci,$nama_file)
dua puluh dua {
23 $namafile="C:key.txt";
24 $kunci=hasilkan_kunci($kunci,512);
25
26 //Buka $filename menggunakan mode tambah, penunjuk file akan berada di akhir file
27 if(!$handle=fopen($namafile,'w'))
28 {
29 print "Tidak dapat membuka file $namafile";
30 keluar;
31}
32
33 //Tulis $key ke file yang kita buka.
34 if(!fwrite($handle,$key))
35 {
36 print "Tidak dapat menulis ke file $namafile";
37 pintu keluar;
38 }
39 fclose($pegangan);
40}
41
42 //Baca kunci di file kunci
43 fungsi get_key($nama_file)
44 {
45 //Buka berkas
46 $fp = fopen ($nama_file, "r");
47 $hasil="";
48 //Baca baris demi baris
49 sementara (!feof($fp))
50 {
51 $buffer = kesalahan($fp, 4096);
52 $hasil=$hasil.$buffer;
53}
54 mengembalikan $hasil;
55 }
56
57 ///*
58 $KeyLocation = "C:key.txt"; //File untuk menyimpan kunci
59 $kunci="123456";
60 write_key($kunci,$KeyLocation);
61 echo get_key($KeyLocation);
62 //*/
63 ?>
Kode tersebut mencakup 3 fungsi.
·generate_key($len): secara otomatis menghasilkan kunci dengan panjang $len
·write_key($key,$file_name): menulis kunci ke file $file_name
·get_key($file_name): membaca file kunci $file_name Ketika nilai kunci
digunakan, ketika pengguna masuk ke sistem untuk pertama kalinya, nilai kunci secara otomatis dibuat untuk pengguna.
(1) Menyimpannya di bidang database tertentu. Kerugian dari metode ini adalah keamanan kunci dalam database tidak dapat dijamin;
(2) Menyimpan kunci di file lokal pengguna, sehingga Hal ini mencegah kunci tersebut agar tidak diperoleh orang lain, namun kelemahan dari cara ini adalah ketika pengguna menggunakan mesin lain untuk mengakses sistem, mereka tidak dapat login.
Dalam contoh ini, metode 2 akan digunakan.
Secara khusus, baris 11 hingga 18 dari kode di atas terus-menerus menghasilkan kunci dengan menghasilkan angka acak, dan meningkatkan kompleksitasnya melalui penghitungan. Nilai batas bawah dan batas atas sebenarnya adalah rentang karakter ASCII yang ingin Anda gunakan untuk enkripsi. Di bawah ini adalah contoh file kunci yang dihasilkan.
208123915925183361116049369344372701567721435181102718332639307390344373445407
524316475863232913993383189547474747394154915312639841226741894189965623523913
011164730113445201935692839710274127251577929493941487145611337531549110895367
593586318332391170941272701152344371709270125776235313540032267139933835677407
617384135696111239130732949469623520815987524358635491542913374933524334454251
400327015367133759324537171709152357391089524342514685239122673135531363151191
833412771743139654…
最后,需要把密钥保存在服务器上一个安全的地方,然后就可以利用其和诸如XOR这样的加密算法来对用户信息进行加密/解密了。 Cara menggunakan kunci ini pada XOR yang diperkenalkan pada bagian sebelumnya sangat sederhana dan tidak akan dijelaskan secara detail. totalnya 2 halaman. 9 7 1 2