Halo semua pembaca Habr! Belum lama ini saya memutuskan untuk berurusan dengan algoritma enkripsi dan prinsip-prinsip tanda tangan elektronik. Topiknya, saya pikir, menarik dan relevan. Dalam proses belajar, saya mencoba beberapa perpustakaan, tetapi perpustakaan
PyCrypto adalah yang paling nyaman dari sudut pandang saya. Dia memiliki dokumentasi yang sangat baik, disertai dengan contoh-contoh.
Setelah membaca materi, Anda akan mempelajari poin-poin berikut:- Apa itu enkripsi;
- Apa perbedaan antara enkripsi simetris dan asimetris;
- Dalam hal ini, lebih efisien untuk menggunakan simetris, dan di mana enkripsi asimetris;
- Apa hash data dan mengapa itu digunakan dalam enkripsi;
Relevansi topik terus berkembang. Penggunaan kriptografi telah lama tidak terbatas pada mengenkripsi informasi. Dalam satu atau lain bentuk, kami menggunakan algoritme enkripsi setiap hari ketika mengunjungi situs melalui protokol HTTPS, saat melakukan pembelian dengan kartu kredit, saat berkomunikasi dalam pesan instan. Selama beberapa tahun terakhir, teknologi blockchain, yang juga didasarkan pada kriptografi, telah menarik perhatian luas.
Tujuan artikel ini adalah untuk memperkenalkan pembaca pada algoritma enkripsi dasar. Ketika menulis artikel, saya mencoba untuk memperhatikan sebanyak mungkin masalah aplikasi praktis. Untuk pemrograman, Python 3.6 digunakan. Saat menulis kode, saya mencoba membaginya menjadi beberapa bagian dan mengomentari semua poin penting.
Pada artikel ini, saya tidak menganalisis tanda tangan digital, tetapi setelah memahami enkripsi asimetris, makna teknologi ini akan menjadi jelas.
Plot
Mari kita secara mental melakukan perjalanan ke alam semesta Star Wars sebelum peristiwa Episode 6, ketika pasukan perlawanan menjadi sadar akan awal pembangunan Bintang Kematian baru. Komando berencana untuk memperkenalkan kelompok intelijen dengan kedok pembangun. Operasi ini sangat berbahaya, komunikasi dengan kantor pusat akan sulit. Jika terjadi situasi darurat, setiap anggota grup dapat mengirim dan menerima pesan dari kantor pusat pada frekuensi yang tidak terlindungi.
Tujuan dari kelompok pengintaian adalah setiap data yang dapat menjelaskan konfigurasi, senjata, dan tujuan stasiun di masa depan. Untuk menyimpan data, direncanakan untuk mengembangkan peralatan dan perangkat lunak khusus.
Markas menyetujui dua opsi untuk operasi ini:Rencana A - Pengembalian agen dengan pasukan pemberontak yang diberikan;
Plan B - transmisi jarak jauh dari Death Star sendiri menggunakan peralatan stasiun.
Transfer informasi akan cepat, tetapi setelah transfer, agen kemungkinan besar akan dihitung dan ditangkap.Anda adalah seorang programmer dalam tim yang bertanggung jawab untuk pengembangan perangkat lunak.
Saat merencanakan operasi, beberapa kemungkinan skenario negatif dipertimbangkan:- Musuh akan mencegat sinyal, memahami isinya tentang perencanaan serangan, dan mengarahkan objek lebih dekat ke pasukan yang setia kepada Kekaisaran. Dalam hal ini, kerugian di antara resistensi akan lebih tinggi;
- Salah satu mata-mata akan ditangkap dan selama interogasi akan mengungkapkan rencana operasi, yang dapat menyebabkan kompromi kunci enkripsi (kita akan membicarakannya di bawah);
- Seorang mata-mata dengan data yang diunduh dapat dicegat oleh pasukan kekaisaran, yang akan membuat perubahan pada konten, salah memberi informasi tentang resistensi tentang kelemahan stasiun. Dalam hal ini, selama serangan, armada pemberontak akan dikirim ke arah yang salah dan secara bertahap dihancurkan;
Dari skenario ini tugas dirumuskan:- Konten harus dienkripsi dengan aman dan dilindungi dari perubahan;
- Jika kehilangan kunci enkripsi atau komprominya, harus dimungkinkan untuk mendapatkan kunci enkripsi baru dari jarak jauh pada frekuensi yang dapat disadap oleh musuh.
Enkripsi Informasi
Mari kita selesaikan masalah enkripsi informasi:
Kunci enkripsi digunakan untuk mengenkripsi dan mendekripsi informasi. Ini adalah kunci yang membuat enkripsi dapat dibalik. Setiap agen akan diberikan kunci enkripsi. Setelah mengunduh data, agen akan mengenkripsi mereka dan mengirimkannya ke markas perlawanan.
Deskripsi prinsip enkripsiMetode di mana pesan dienkripsi dan didekripsi menggunakan kunci tunggal disebut
enkripsi simetris .

Titik lemah enkripsi simetris adalah kunci enkripsi, atau lebih tepatnya, pengirimannya ke pihak yang dituju. Jika kunci terganggu selama pengiriman, pihak ketiga dapat dengan mudah men-decode pesan. Kekuatan enkripsi simetris adalah kecepatannya, yang memungkinkannya menyandikan data dalam jumlah besar.
Enkripsi asimetris menggunakan dua kunci yang terhubung satu sama lain: publik dan pribadi.
Mekanisme tindakannya adalah sebagai berikut:- penerima mengirim kunci OPEN ke pengirim;
- pengirim mengirim pesan dengan menggunakan kunci publik yang diterima. Pada saat yang sama, pesan sekarang dapat diterjemahkan hanya dengan kunci pribadi;
- setelah menerima pesan terenkripsi, penerima menerjemahkannya dengan kunci TUTUP (yang dihasilkan bersama-sama dengan publik).
Mari kita mulai pemrograman! Untuk mengembangkan perangkat lunak yang diperlukan, kita akan menggunakan pustaka Python yang disebut
pycrypto . Dia memiliki dokumentasi yang sangat baik dan menyajikan semua algoritma enkripsi umum.
Pertama, kami akan mengembangkan fitur untuk enkripsi simetris yang disebut
Advanced Encryption Standard (AES) . Ini adalah salah satu algoritma enkripsi simetris yang paling umum.
from Crypto.Cipher import AES
Mari kita periksa kinerja kode menggunakan contoh message = """ 120 120 / 120 10 30-5 (2) 4.0 """ key = 'Traveling through hyperspace ain't like dusting crops, farm boy.' encr_message = symmetric_encrypt(message, key, verbose = True) print('\n') print('DECRIPTION') decr_message = symmetric_decrypt(encr_message, key) print(decr_message)
Message was encrypted into: ed10e4c65358bb9e351c801c3b3200b21fa86a24021c317bb5c9d8b3f76bdf9f3a7d26781a22402f0e4f41ca831b6d2da9e1e6878c34c79ddc7959af3ae9fc2ba0cfff1c0180a7e0f637f1aa5b24507d552d5dfe7625e7b81d817b5882b2b19bb95f3988a03c78f850098dfc8e6089863deaa39b887eaea4c1d4ba006edaec90205d54b27ed4ac70ed75cdd01732e1176bf04218beb8ae742ff708a201a9d1cb57dd5f2e70dc3239208d23705f7a3aae3e315c4df6d73c871b66c4995cce5f19738f731cd58755d21ed92612c44197f875cddf3f7aa1d60e435ce1492679b9d60c4b8538f52408f321711ac1d2daa6dbbc33dc655abca10e2f5fd3ff27823995b9dcdb62c0bafc1963ab539ccb466f1c140479df34b0005f578f72fcdd76b17391332037b801f74f733a08 DECRIPTION Success! Encrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 Decrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 120 120 / 120 10 30-5 (2) 4.0
Seperti yang Anda lihat, kami berhasil mengenkripsi pesan menggunakan kunci publik.
Jalankan kode beberapa kali. Anda akan melihat bahwa setiap kali bagian terenkripsi berubah. Ini karena ketika mengenkripsi, kami menggunakan mode Cipher FeedBack (AES.MODECFB), di mana blok plaintext dicampur dengan blok ciphertext. iv - vektor inisialisasi (baca lebih lanjut tentang mode di sini ). Saat mendekripsi pesan, kita melihat bahwa hash dari pesan yang didekripsi cocok dengan hash yang kita tambahkan selama enkripsi. Ini berarti bahwa dekripsi itu benar.
Apa itu hashHash dokumen hanyalah serangkaian karakter yang unik untuk kumpulan data apa pun. Dengan perubahan data apa pun, hash berubah sangat banyak. Dengan kata lain, hash adalah semacam "sidik jari" untuk set data apa pun.

Tetapi bagaimana jika kunci enkripsi dikompromikan karena suatu alasan? Maka siapa pun dapat mendekripsi informasi tersebut.
Dalam hal ini, kita perlu mengubah kunci enkripsi dari jarak jauh pada frekuensi yang dapat disadap oleh musuh. Kami akan menganggap bahwa mereka sudah mendengarkannya. Jadi bagaimana kita melakukan ini? Di sini metode lain datang untuk menyelamatkan, yang disebut enkripsi asimetris (atau sistem kriptografi kunci publik). Tidak seperti enkripsi simetris, ia menggunakan dua kunci: publik dan pribadi. Pesan dienkripsi dengan kunci publik, setelah itu hanya dapat didekripsi dengan kunci pribadi. Kunci publik dekripsi tidak akan berguna. Namun, ada poin penting: kunci privat pastinya berasal dari pasangan publik yang dihasilkan. Kehadiran kunci publik adalah salah satu dari beberapa sifat penting dan menarik dari enkripsi asimetris. Artinya, kami dapat mengirimkan kunci publik dengan saluran apa pun dan tidak takut bahwa itu akan digunakan untuk mendekripsi pesan.
Pada saat yang sama, berkenaan dengan tugas kami, ada satu nuansa - enkripsi asimetris cocok untuk data kecil, misalnya, pesan singkat. Kami hanya bisa menebak tentang jumlah data yang diperoleh oleh intelijen. Tentu saja, kami dapat memecah semua data yang diterima menjadi fragmen kecil dan menyandikan masing-masing dengan kunci pribadi, tetapi ada solusi yang lebih baik. (Masalahnya beres di
sini ).
SolusiPengguna Akela_wolf dengan benar mengatakan bahwa siapa pun dapat membuat dan mengirim kunci publik. Saya membuat beberapa penyesuaian pada rencana tersebut.
Ini akan benar jika, sebelum mengirim agen, markas akan menghasilkan beberapa pasangan kunci dan menetapkan kunci pribadi untuk masing-masing agen. Lebih baik untuk menghasilkan hanya beberapa pasangan sehingga setiap agen memiliki kunci individual. Ini diperlukan untuk secara akurat mempersonifikasikan pemilik kunci.
Kemudian, jika kunci dikompromikan, pusat akan membuat kunci SYMMETRIC baru, menyandikannya ke setiap agen dengan kunci publik dan mengirimkannya melalui saluran terbuka.
Keputusan lama- Agen akan menghasilkan pasangan kunci (publik dan swasta) di tempat, kemudian mengirim kunci publik ke pasukan pemberontak;
- Di markas besar perlawanan mereka akan membuat kunci baru untuk enkripsi SYMMETRIC;
- Kunci simetris dikodekan menggunakan kunci publik yang dikirim agen;
- Kunci simetris terenkripsi akan dikirim ke agen, yang akan mendekode menggunakan kunci pribadi.
Perhatikan acara kami di saluran terbuka:
- Agen mengirim kunci OPEN dari pasangan, kunci TUTUP adalah miliknya;
- Markas resistansi mengirim kunci enkripsi simetris, dienkripsi dengan kunci publik yang dikirim oleh agen.
Pesan pertama maupun pesan kedua tidak ada nilainya dalam intersepsi.
Mari kita menulis kodenya:
Mari kita lihat seperti apa kunci-kunci itu. print(private_key.exportKey(format='PEM').decode()) print('\n') print('#'*65) print('\n') print(public_key.exportKey(format='PEM').decode())
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA4JDLu7Vtvg2yqbH6Y0eJPfoEsOlKzgmOodqhA1CqkEG4OpKi
sGW7ciGP4v37GE6edHBCEy4UNkVQtnpPBjzTHvKd1pO70B84vD5OSrS7uNw2EYkj
d/ZwhrJMrcQKRwPkkM4OiewaaAaK0vPWJIKwlW61DY9X7LfNz7aOKMTbKnm1vdR0
919AV98FUmNoQBgka6nXFGmNbi7D43MtLwxBZIXfFupEiANSvOs+57hgaCho7OWM
GUOjLkG6HBscPhJ2W1H5DU9GjwL24ynTvKifgo1/2ue61MV1Pzh5CVaicJKNaRtg
Pd99gFhBGINsXV2X6Jh/W5nNsCddU4EI0AlO8wIDAQABAoIBAARM4YnjrIlSK9Sy
EtBp40frjMFyhjsx1ahlzmWI2utORt/gRPtJx3AlEmNPZ8qMXt5t8+X4IOz1INmN
uAuviH90N++O/q66mlSIgOlPUrT0ipiFXseCUZ9StMMzGNtJSMw5FfAwNEU/stLd
VoF2ezkxWIg88XsX/fn3Tfub4XKLvu4raJGcJ+Fo2GI9hYEGKnHhSuHvDHekTLlQ
z46O+cIwtehbFGcKesyK3zDD1uP5YLPIWpiqt1TgKjJzRF0l4ZJLk+RT7kU2pGIQ
mosOnr+06WyMIg724yQyAIwtS9X0czKBGUESrtTTb1HCXLeTwnncOTxh6q2z42LF
tn34+DECgYEA6EEp4oTvjfTQfUQPMByuAjF1hpdFHQqRymygiFgoF+Mg3QmL0w8j
/84H/q7s8FSx+3th8MK87bFq4lrry+h/mYwmvF5zZbhxcnl2uaX+KUPgpT6TgvAo
WOv2wc4BSaoo9DrxrZId86vpO2qbopw6gkBsvw47HSoQ+FSqXtZ0p8kCgYEA94Zj
b1ulctUjybiszO93TAjkzx3lU3yL+B1eZiQXtJa3mgG+ka1R/uMfr0NlT+Jzo0My
wHV30YRJDxziCrDol9OgSSU0sXwEcUxUIBLBwXLCp1EmMsYG9PB/x4OTWve35a8F
O+rMxuvWaZeIOfVCfL8UEcWweYaVdWIonJN+ltsCgYEAjeSZ2UlMLZce9RjqioNL
EA31dlfeoqJ9dYUuAn6RaB6cSk51vWlnnfXazo9CNIYaAsFbkcL3t+QHn+jaXEZc
BowocjbmG4Q20zBAB6XRBJbynSIA7yMYE1N9+uOHx+CMisGkO12krOUfZex4zzzR
RhhkF8ly9htoKL9ZIv20YXkCgYBzH3UF6PkVZJ5lhtgP5Nx2Z7iLwBrV7ppnBrnO
BcFkw6iXH3KT7KmzQ82LxWvMcMVZzLpBGyFkOAOG3OchE9DKNKpa+sv8NHMYguip
li+5mneAPFTozoOTznuPvtl9OLO2RuXHTVh6uFub9tdsJW8L+A8MiQagLwE6fDHp
SQxaewKBgQDIyzL1THpW3+AMNrOZuI/d3Em5wpGJiZbDSBRosvsfGm/sHaz4Ik5E
nWnftgktmsAD60eORTTh9/ww/nm7f3q9kzT8Sv1MmqeRXq9VFIOeP/+8SSE/7LzD
izlb5xEtVD8LuY54jHyiOxiZC++TQswMnOKKi0Gx26MDoO7Tx9akVw==
-----END RSA PRIVATE KEY-----
#################################################################
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4JDLu7Vtvg2yqbH6Y0eJ
PfoEsOlKzgmOodqhA1CqkEG4OpKisGW7ciGP4v37GE6edHBCEy4UNkVQtnpPBjzT
HvKd1pO70B84vD5OSrS7uNw2EYkjd/ZwhrJMrcQKRwPkkM4OiewaaAaK0vPWJIKw
lW61DY9X7LfNz7aOKMTbKnm1vdR0919AV98FUmNoQBgka6nXFGmNbi7D43MtLwxB
ZIXfFupEiANSvOs+57hgaCho7OWMGUOjLkG6HBscPhJ2W1H5DU9GjwL24ynTvKif
go1/2ue61MV1Pzh5CVaicJKNaRtgPd99gFhBGINsXV2X6Jh/W5nNsCddU4EI0AlO
8wIDAQAB
-----END PUBLIC KEY-----
Seperti yang Anda lihat, kunci enkripsi asimetris adalah urutan karakter yang panjang secara matematis.
Jadi, kami membuat kunci. Sekarang mari kita menulis fungsi untuk menyandikan data:
from Crypto.PublicKey import RSA
Langkah-langkah alur kerja- Agen menghasilkan sepasang kunci:
private_key, public_key = generate_keys()
- Mengirim kunci OPEN ke markas;
- Di kantor pusat, menggunakan kunci publik, menyandikan kunci untuk enkripsi simetris:
new_symmetric_key = 'SOME_KEY_asdfasdfasdfasdfsdfgrtwhetynt' encr_msg = encrypt_message(new_symmetric_key, public_key)
KesimpulanMessage: SOME_KEY_asdfasdfasdfasdfsdfgrtwhetynt was encrypted to
41e940507c96397e3feb4a53390c982633bb1775a52957996a8069bd22063086a0e831bf775a17909276aba0d0478ee6c953837c8ea5d20d40e1c8eb463aaa1bc5c93c71677b1a85e90439c9dbda8a98ce168acb38368155437c66815b84aa2fbdda0eb909e4e6079b4410c720eddd955ed048193bf87f8f9976a17ee32a58a71dfddf3db116343d949d29c25f72c511a440a50a5d4f1e01c37b24a1cb4127e191d3231328b2f120c7dbd0cb5bf19823f0978b8ed17d25952de4b146ef9724fff359eb2af503fdfd72b91525a5503b076ba9aaaeac55af3f8d210c12d579d45dd70362123c0b4b36ef9c2f7705e6f884a25553eb0e11e5077f11fa986d0ff280
- Urutan panjang ini dikirim kembali ke agen;
- Agen mendekripsi pesan yang diterima menggunakan kunci pribadi:
recieved_symmetric_key = decrypt_message(encr_msg, private_key) print('\n') print(f"New symmetric key is: {recieved_symmetric_key}")
Kesimpulan Success! Encrypted hash is 42ad66445a05ac09e684bb21f9b487d95b9cfa11d02e0b459931321ee02f7c1c Decrypted hash is 42ad66445a05ac09e684bb21f9b487d95b9cfa11d02e0b459931321ee02f7c1c New symmetric key is: SOME_KEY_asdfasdfasdfasdfsdfgrtwhetynt
- Kemudian, menggunakan kunci simetris baru, agen mengenkripsi data yang diterima:
message = """ 120 120 / 120 10 30-5 (2) 4.0 """ encr_message = symmetric_encrypt(message, recieved_symmetric_key, verbose = True)
Kesimpulan Message was encrypted into:
- Kantor pusat mendekripsi:
print('DECRIPTION') decr_message = symmetric_decrypt(encr_message, new_symmetric_key) print(decr_message)
Kesimpulan DECRIPTION Success! Encrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 Decrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 120 120 / 120 10 30-5 (2) 4.0
Voila!Dalam contoh abstrak ini, kami melihat karya algoritma enkripsi umum. Enkripsi simetris dan asimetris, serta hashing, digunakan
dalam karya web ,
tanda tangan elektronik ,
blockchain dan cryptocurrency . Saya berharap materi ini bermanfaat untuk memahami pengoperasian teknologi ini.
Kata penutup
Akibatnya, intelijen pemberontak berhasil memperoleh informasi yang akurat tentang kerentanan stasiun dan cara menuju ke sana, keberadaan Kaisar untuk diperiksa, keberadaan perisai energi, dan sumbernya di Endor. Kekaisaran melihat mata-mata, memberi informasi yang salah tentang kapasitas tempur stasiun. Stasiun ini juga ditugaskan ke satelit Endor, dari mana ia dilindungi oleh perisai.
Tapi kita tahu bagaimana semuanya berakhir;)