Suatu ketika, beberapa tahun yang lalu, saya mendapat kesempatan untuk melakukan tugas tes untuk pekerjaan di satu perusahaan, di mana tugasnya adalah mengembangkan algoritma enkripsi simetris non-standar pada yap tingkat tinggi, yang secara konseptual agak berbeda dari genre klasik - operasi xor dari pesan asli dan kunci rahasia ... Tugas itu dilakukan dengan buruk, tetapi gagasan untuk membuat algoritma non-sepele yang menarik terjebak di kepala saya untuk waktu yang lama.
Dan, saat ini, apa yang saya sebut GenCoder ternyata berasal darinya .
Mengantisipasi komentar tentang organ khusus dan aspek hubungan dengan mereka, jika kegiatan itu terkait dengan kriptografi, ke depan, saya akan mengatakan bahwa pekerjaan itu dilakukan secara eksklusif untuk tujuan eksperimental dan penelitian (non-komersial).
Sebenarnya, kode sumber kelas dapat dilihat di sini , dan Anda dapat mengujinya di sini .
Jadi, tugas (dari eksperimen penelitian ini, demikian kami menyebutnya) adalah sebagai berikut:
Kembangkan algoritme enkripsi reversibel Anda sendiri, sementara:
- Setiap kali pesan yang sama akan dienkripsi dengan cara yang unik dan tidak akan terulang.
- Perkenalkan apa yang disebut " pengacakan " dari kunci rahasia - untuk menemukan cara mengenkripsi pesan tidak selalu dengan kunci rahasia yang sama, tetapi dengan string rahasia tertentu, yang merupakan fungsi dari kunci rahasia dan pesan asli.
- Sebagai tambahan yang tidak penting, buat panjang variabel kunci rahasia sambil mempertahankan kekuatan kriptografi algoritme yang tinggi (dalam versi saat ini, dari 64 hingga 100 karakter).
- , , , , .
.
.
, , . , , , . , .
, .
, , , . , , , , , .
, , , (pathKeySignature ), . — sha-512 , , uniqid, .
? , . , , 14-, 22-, 37-, 49- .. — ( pathKeySignature).
, ( , - , ). , " " xor-.
"" , (pass1 pass2, 4 ), , , , - .
. , , (, ) .
.
private function attachKey($message, $salt)
{
return md5(hash('sha512', $message . uniqid() . $salt) . hash('sha512', $salt));
}
private function pathKeySignature($user_code_1, $user_code_2, $attach_key)
{
return hash('sha512', $user_code_1 . $attach_key . $user_code_2);
}
, md5 - , , ( sha512) attachKey. uniqid , , . ? , . — , . ? , , "!", " ", "", " ", " ?". , , . , 1 2 "0372985dee", 2 5 "0372985dee" . ? .
uniqid, .
. , cipher $path_key_signature, byteShifting .
private function cipher($path_key_signature, $message, $generateKey)
{
...
for ($i = 0; $i < count($message); $i++) {
if ($sign_key >= self::hash_length) $sign_key = 0;
$key_code_pos = hexdec($path_key_signature[$sign_key]);
$cur_key_pos = $cur_key_pos + $key_code_pos;
if ($cur_key_pos >= $key_length) {
$cur_key_pos = $cur_key_pos - $key_length;
}
$shifted_key_symbol = $generateKey[$cur_key_pos];
// byte shifting
$shifted_key_symbol = $this->byteShifting($i, $shifted_key_symbol);
$shifter = $this->mb_ord($message{$i}) ^ $this->mb_ord($shifted_key_symbol);
$cipher_message .= $this->mb_chr($shifter);
$sign_key++;
}
return $cipher_message;
}
, attachKey pathKeySignature . , , $attach_key
public function codeMessage($message, $generateKey, $user1_pass, $receiver_hashcode)
{
$sender_hashcode = $this->sender_hashcode($user1_pass);
$attach_key = $this->attachKey($message, $this->salt);
$path_key_signature = $this->pathKeySignature($sender_hashcode, $receiver_hashcode, $attach_key);
$result_cipher = $this->cipher($path_key_signature, $message, $generateKey) . $attach_key;
$result_cipher = base64_encode($result_cipher);
return gzencode($result_cipher, 9);
}
, . attachKey, ? , "" — attachKey , , . , , , "" . , , . . .
decodeMessage , , .
, .
:
- / ( )
- ,
:
- ( , ) , .
.
Dalam hal kecepatan algoritme, ini relatif cepat (tentu saja, semuanya relatif dan dipelajari sebagai perbandingan, kita berbicara tentang kecepatan enkripsi dalam kerangka yap tingkat tinggi secara umum dan dalam kerangka php pada khususnya). 2 megabyte teks acak dienkripsi dan didekripsi dalam 4 detik menggunakan php 7.2. Sistem: Intel Core i7-8700 CPU @ 3.20GHz × 12, browser dengan banyak tab dan mesin virtual masih berjalan. Ringkasan - kecepatan enkripsi ~ 1 mb / s pada rata-rata perangkat keras dengan php7.0 dan yang lebih tinggi.