Saya mencoba membangun dua fungsi menggunakan PyCrypto yang menerima dua parameter: pesan dan kunci, dan kemudian mengenkripsi / mendekripsi pesan.
Saya menemukan beberapa tautan di web untuk membantu saya, tetapi masing-masing memiliki kekurangan:
Yang ini di codekoala menggunakan os.urandom, yang tidak disarankan oleh PyCrypto.
Selain itu, kunci yang saya berikan ke fungsi tidak dijamin memiliki panjang yang tepat yang diharapkan. Apa yang bisa saya lakukan untuk mewujudkannya?
Juga, ada beberapa mode, yang mana yang direkomendasikan? Saya tidak tahu harus menggunakan apa: /
Akhirnya, apa sebenarnya IV itu? Dapatkah saya memberikan IV berbeda untuk mengenkripsi dan mendekripsi, atau akankah ini menghasilkan hasil yang berbeda?
Sunting : Menghapus bagian kode karena tidak aman.
/dev/urandom
di UnixJawaban:
Berikut ini adalah implementasi dan berfungsi untuk saya dengan beberapa perbaikan dan meningkatkan keselarasan frasa kunci dan rahasia dengan 32 byte dan iv hingga 16 byte:
sumber
Anda mungkin memerlukan dua fungsi berikut:
pad
- untuk membalut (saat melakukan enkripsi) danunpad
- untuk membatalkan (ketika melakukan dekripsi) ketika panjang input bukan kelipatan dari BLOCK_SIZE.Jadi Anda menanyakan panjang kunci? Anda dapat menggunakan md5sum dari kunci daripada menggunakannya secara langsung.
Lebih lanjut, menurut sedikit pengalaman saya menggunakan PyCrypto, IV digunakan untuk mencampur output dari sebuah enkripsi ketika input sama, sehingga IV dipilih sebagai string acak, dan menggunakannya sebagai bagian dari output enkripsi, dan kemudian gunakan untuk mendekripsi pesan.
Dan ini implementasi saya, semoga bermanfaat bagi Anda:
sumber
pad
fungsinya rusak (setidaknya di Py3), ganti dengans[:-ord(s[len(s)-1:])]
agar berfungsi di seluruh versi.Biarkan saya menjawab pertanyaan Anda tentang "mode." AES256 adalah sejenis cipher blok . Dibutuhkan sebagai input kunci 32-byte dan string 16-byte, yang disebut blok dan output blok. Kami menggunakan AES dalam mode operasi untuk mengenkripsi. Solusi di atas menyarankan menggunakan CBC, yang merupakan salah satu contoh. Lain disebut CTR, dan itu agak lebih mudah digunakan:
Ini sering disebut sebagai AES-CTR. Saya akan menyarankan agar berhati-hati dalam menggunakan AES-CBC dengan PyCrypto . Alasannya adalah itu mengharuskan Anda untuk menentukan skema padding , sebagaimana dicontohkan oleh solusi lain yang diberikan. Secara umum, jika Anda tidak terlalu berhati-hati dengan padding, ada serangan yang benar-benar merusak enkripsi!
Sekarang, penting untuk dicatat bahwa kunci tersebut harus berupa string 32 byte acak ; kata sandi tidak cukup. Biasanya, kunci dibuat seperti ini:
Kunci juga dapat diturunkan dari kata sandi :
Beberapa solusi di atas menyarankan menggunakan SHA256 untuk mendapatkan kunci, tetapi ini umumnya dianggap praktik kriptografi yang buruk . Lihat wikipedia untuk informasi lebih lanjut tentang mode operasi.
sumber
Untuk seseorang yang ingin menggunakan urlsafe_b64encode dan urlsafe_b64decode, berikut adalah versi yang berfungsi untuk saya (setelah menghabiskan waktu dengan masalah unicode)
sumber
Anda bisa mendapatkan frasa sandi dari kata sandi sewenang-wenang dengan menggunakan fungsi hash kriptografis ( BUKAN builtin Python
hash
) seperti SHA-1 atau SHA-256. Python menyertakan dukungan untuk keduanya di pustaka standarnya:Anda dapat memotong nilai hash kriptografis hanya dengan menggunakan
[:16]
atau[:24]
dan itu akan mempertahankan keamanannya selama Anda tentukan.sumber
Bersyukur atas jawaban-jawaban lain yang mengilhami tetapi tidak berhasil bagi saya.
Setelah menghabiskan berjam-jam mencoba mencari cara kerjanya, saya datang dengan implementasi di bawah ini dengan perpustakaan PyCryptodomex terbaru (ini adalah cerita lain bagaimana saya mengaturnya di belakang proxy, pada Windows, dalam virtualenv .. phew)
Mengerjakan implementasi Anda, ingatlah untuk menulis padding, encoding, mengenkripsi langkah-langkah (dan sebaliknya). Anda harus berkemas dan membongkar dengan mengingat pesanan.
sumber
Demi kepentingan orang lain, inilah implementasi dekripsi saya yang saya dapat dengan menggabungkan jawaban dari @Cyril dan @Marcus. Ini mengasumsikan bahwa ini datang melalui Permintaan HTTP dengan kutipan dienkripsi dan base64 disandikan.
sumber
Lain mengambil ini (sangat berasal dari solusi di atas) tetapi
diuji dengan python 2.7 dan 3.6.5
sumber
Saya telah menggunakan keduanya
Crypto
danPyCryptodomex
perpustakaan dan sangat cepat ...sumber
Ini sedikit terlambat tetapi saya pikir ini akan sangat membantu. Tidak ada yang menyebutkan tentang skema penggunaan seperti padding PKCS # 7. Anda dapat menggunakannya sebagai ganti fungsi sebelumnya untuk pad (saat melakukan enkripsi) dan membatalkan (ketika melakukan dekripsi) .i akan memberikan Kode Sumber lengkap di bawah ini.
sumber
pengkodean utf-8 yang kompatibel
sumber
sumber