it-swarm-id.com

Teknik untuk Menulis Algoritma Enkripsi (Khusus untuk Penggunaan Pribadi)

Saya ingin mengawali pertanyaan ini dengan menyatakan bahwa saya sepenuhnya memahami bahaya penulisan algoritma enkripsi Anda sendiri, dan saya tidak akan pernah menggunakan enkripsi buatan sendiri untuk mengamankan data siapa pun kecuali saya sendiri.

Hari ini saya ditugaskan proyek semester ilmu komputer yang menyatukan semua yang kami pelajari dalam satu program. Bagian dari fungsionalitas program ini adalah dapat mengenkripsi dan mendekripsi Strings. Kita harus menulis sendiri metode enkripsi ini, jadi kita tidak bisa menggunakan apa pun yang dibangun ke dalam bahasa yang kita gunakan (Java). Akhirnya, kita perlu menghindari apa pun yang menggunakan kunci untuk enkripsi.

Sekarang, setelah berbicara dengan beberapa teman sekelas saya, sepertinya hampir semua orang menggunakan ROT13 atau metode serupa lainnya. Karena saya terlalu berprestasi, dan karena saya tidak ingin seperti orang lain, saya ingin merancang metode enkripsi saya sendiri. Namun, saya agak bingung harus mulai dari mana. Jadi, teknik dasar atau lanjutan apa yang ada untuk enkripsi?

18
Josh

Jika Anda umumnya tertarik pada kriptografi di luar proyek Anda :

Tergantung jenis enkripsi yang ingin Anda lakukan. Peringatan besar: jawaban ini hanya tentang mengarahkan Anda ke arah teoretis yang benar. Saya sangat merekomendasikan melakukan banyak membaca sebelum melompat - semakin Anda membaca semakin Anda akan memahami bagaimana cipher sebelumnya rusak dan tidak membuat kesalahan yang sama.

Kunci publik

Untuk mengoperasikan sistem kunci publik, Anda memerlukan fungsi Trapdoor . Sayangnya, saran tentang wikipedia cukup akurat:

Beberapa kelas fungsi telah diusulkan, dan segera menjadi jelas bahwa fungsi Trapdoor lebih sulit ditemukan daripada yang diperkirakan sebelumnya

Fungsi trapdoor cukup sulit; Permutasi trapdoor (di mana output dan input set fungsi adalah sama dan dengan demikian fungsi "mengizinkan" input di dalam set) bahkan lebih sulit. Secara kasar, masalah faktorisasi utama dan masalah logaritma diskrit adalah dua "masalah besar". Kemungkinan ada di bidang ini, menggunakan yang sudah ada akan sejauh ini merupakan pendekatan termudah.

Kunci Simetris

Algoritma kunci simetris sengaja dibalik, tetapi tanpa salah satu input (kunci) dirancang untuk sangat sulit dibalik. Gagasan yang mendasarinya adalah prinsip kebingungan/difusi . Teknik umum dalam sandi modern termasuk jaringan permutasi substitusi dan jaringan feistel . Anda juga harus mempertimbangkan membaca pada blok mode operasi cipher .

Benar, bagus, di mana saya harus mulai?

Dengan membaca - sebanyak yang Anda bisa. Saya tidak suka saran standar "jangan merancang crypto Anda sendiri". Saya pikir orang harus mencoba jika mereka mau. Tetapi saya tidak bisa cukup menekankan betapa sulitnya untuk menjadi benar. Karena Anda memiliki waktu terbatas untuk proyek Anda, satu teknik mungkin menggunakan contoh sederhana dari sandi yang ada, jadi:

Untuk proyek Anda

Sebagai latihan pendidikan RC4 sangat mudah diterapkan. Sekali waktu (belum lama ini) ini digunakan untuk melindungi lalu lintas SSL/WEP - kadang-kadang masih digunakan, jadi Anda akan menggunakan cipher nyata. Itu memang memiliki beberapa masalah keamanan - memahami ini juga akan membantu Anda untuk pendidikan crypto umum Anda. Namun, karena kebutuhan Anda adalah keamanan yang kurang absolut dan lebih banyak belajar, saya akan berpikir itu akan ideal.

Jika Anda merasa cukup ambisius dan mengenal bahasa Anda dengan baik, AES juga tidak terlalu sulit untuk diterapkan dalam mode ECB. FIPS-197 cukup mudah dibaca dan umumnya menjelaskan algoritme dengan cara yang cukup mudah diakses.

Anda berhak menganggap ROT13 sebagai contoh yang buruk. Meskipun tidak mengetahui offset masing-masing karakter adalah 13 tempat, dengan asumsi Anda menggunakan ASCII Anda hanya mencoba masing-masing dari 127 (atau 255 untuk ASCII yang diperluas) offset teks-sandi Anda sampai yang tepat turun Untuk mendekripsi itu karena itu cukup sepele, bahkan tanpa kunci.

15
user2213

Anda harus menghindari sesuatu yang menggunakan kunci? Secara pribadi, saya tidak dapat melihat bagaimana Anda dapat memanggil algoritme "enkripsi" jika tidak menggunakan kunci.

Anda dapat mempertimbangkan untuk menulis implementasi DES Sederhana Anda sendiri. Sesuai namanya, Simplified DES (atau S-DES) adalah versi DES yang sangat disederhanakan. Ini menggunakan kunci 10-bit, dan cukup sederhana untuk digunakan dengan pensil dan kertas.

Tulisan ini adalah hit Google pertama untuk "DES Sederhana". Ada juga simulator visual di http://edipermadi.wordpress.com/2008/01/12/simplified-des-simulator/ .

8
Jonathan

Saya tidak ingin merusak kesenangan Anda, tetapi Anda ingin memikirkan hal-hal berikut:

  1. Apa, pada dasarnya, enkripsi itu? Apa sifat dari hal-hal yang mengenkripsi dan mendekripsi dan mengapa kita melakukannya sebagai masyarakat? Anda ingin memikirkan karakteristik serta prosesnya.
  2. Apa kuncinya? Berdasarkan penelitian Anda, Anda mungkin ingin meminta klarifikasi tentang hal ini dari instruktur Anda.
  3. Buat sistem klasifikasi semua keluarga teknik enkripsi. Dengan melakukan penelitian ini, Anda dapat menemukan satu atau dua jawaban yang menarik.

Ini adalah proyek berbasis semester, jadi itu bukan sesuatu yang Anda dapat (atau harus) jawab dalam semalam. Kode itu sendiri hanya membutuhkan satu atau dua hari. Pembelajaran sebenarnya adalah menemukan solusi berdasarkan kendala yang diberikan.

4
logicalscope

Anda harus membaca Buku Pegangan Crypgoraphy Terapan . Buku ini juga dikenal sebagai "Buku Pegangan". Gratis, dan ditulis dengan baik. Namun Bab 2, "Latar Belakang Matematika" cukup kaku, sebagian besar konsep-konsep ini tidak diajarkan di universitas negeri lokal saya (saya melihat).

2
rook

Jika Anda ingin melihat versi sederhana dari "kebingungan" dan "difusi" yang kompleks, William Stallings menulis yang sangat bagus Penyederhanaan DES implementasi .

Cukup mudah sehingga saya mengeluarkannya (dan melakukan transposisi) pada kertas grafik. Tapi itu akan membawa Anda melalui semua fungsi dasar DES menggunakan, dan menuntun Anda melalui satu putaran proses encipher-decipher.

2
Joseph Kern

Bergantung pada batasan yang ditempatkan pada Anda, Anda sebenarnya dapat membuat enkripsi yang sangat sulit untuk dipecahkan dengan cukup mudah - enkripsi ini memiliki kelemahan praktis yang membuatnya tidak dapat digunakan secara fundamental di dunia nyata, tetapi Anda harus mengisi ROT13, pengguna Caesar, dll dengan cukup mudah - pada dasarnya Anda akan membuat sistem pengodean entropi, yang memberi Anda satu kali waktu

Tulis sendiri sesuatu untuk dibaca semua file pada drive disk Anda - ini cukup mudah, google sekitar untuk pemindaian direktori rekursif hierarkis, buka semua file mentah/biner, dan isap isinya

Ketika Anda mulai streaming di setiap aliran byte, buat sendiri file master di mana Anda mencari perulangan selanjutnya (saya akan menyebutnya sebagai string mulai sekarang, seperti itu, mereka bukan string teks) di input - Anda perlu membuat algoritme yang seiring waktu, lebih memilih urutan pencocokan paling lama yang mungkin tetapi secara rekursif membagi input menjadi string yang lebih kecil - jika Anda melihat http://en.wikipedia.org/wiki/Huffman_coding) Anda akan melihat algoritma tertentu untuk mencapai ini tetapi Anda tidak perlu melangkah terlalu jauh - tetapi implementasi mungkin akan menghasilkan fragmen kode yang akan menyederhanakan hidup Anda.

Sekarang, untuk menyandikan sesuatu, ambil string input dan terapkan operasi yang sama, temukan substring pencocokan panjang terpanjang dalam file master dan ganti string input dengan offset dan panjang substring yang cocok dalam file master - perhatikan ini akan cocok dengan string, karena pada akhir hari Anda akan berulang mencari bit tunggal Satu penjaga yang perlu Anda gunakan adalah Anda harus menggilir set semua string yang cocok sebelum Anda mulai menggunakan kembali indeks yang sama - bayangkan file master di mana Anda memiliki bolak-balik 1 dan 0 dan Anda hanya bisa mencocokkan input pada tingkat bit (secara teknis tidak mungkin tetapi tahan dengan saya) - jika Anda menerima string 5 1, Anda akan menyandikannya sebagai 1: 1,3: 1,5 : 1,7: 1,9: 1 (ya, satu kekurangan adalah pengkodean ini bisa menjadi sangat tidak efisien dalam kasus-kasus tertentu) (nb - jika Anda menyandikan bit, Anda akan melemahkan kode - poin tambahan jika Anda hanya memindahkan offset dalam pesannya, tetapi itu adalah strategi pemetaan multidimensi yang buruk di luar ruang lingkup tulisan ini)

Melacak jumlah indeks yang digunakan kembali - tujuan Anda adalah memiliki tabel master yang cukup besar sehingga hal ini tidak pernah terjadi - jika ini terjadi dan Anda harus menyandikan hanya satu pesan, cukup yakin bahwa alam semesta akan mati karena panas sebelum kode bisa cracking semakin banyak pesan yang Anda encode DI MANA INDIKASI YANG DIGUNAKAN KEMBALI, semakin banyak kode Anda dikompromikan (analisis bahasa, analisis pola, dll.) Sekarang maksudnya - untuk menggunakan kode ini dengan pihak lain - Anda perlu mendapatkan salinannya. tabel master - Anda hanya harus melakukan ini secara langsung, Anda harus selalu menjaga media transfer di bawah kendali Anda, dan Anda harus menghancurkannya saat transfer selesai - dan jika mesin mana pun yang tabel masternya sedang dikompromikan, kode Anda dipanggang - Sampai saat itu, itu sangat sulit

Selamat bersenang-senang

1
Mark Mullin

Untuk enkripsi dua arah, sebagian besar algoritma menggunakan x atau operator, membandingkan kode biner dari kunci dan data biner dari input, ini mungkin tidak tepat untuk Anda saat itu, karena Anda tidak dapat menggunakan kunci ... namun, ini adalah bagaimana itu bekerja:

Input data: 10011101101001 Kunci: 123 = 1111011

Kuncinya lebih kecil dari input, jadi perlu diulang:

Input data: 10011101101001 Kunci: 123 = 11110111111011

(dalam Java menggunakan satu variabel untuk menghitung dalam untuk setiap atau beberapa saat loop melalui semua bit dari input data ...) Sekarang gunakan x atau prinsipal untuk menghasilkan hasil terenkripsi (dua cara hash) loop melalui setiap bit dalam data input dan membandingkannya dengan bit yang sesuai di kunci, jika identik, tambahkan 0 ke hasilnya, jika tidak, tambahkan 1 ke hasilnya ... Hasilnya kemudian akan:

Input data: 10011101101001 Kunci: 123 = 11110111111011 Hasil = 01101010010010

Untuk mendekripsi data, cukup jalankan data terenkripsi melalui:

Input data: 01101010010010 Kunci: 123 = 11110111111011 Hasil = 10011101101001

Idealnya Anda akan menggunakan fungsi hash seperti sha, md5, ripemd dll ... untuk menghasilkan kunci, kemudian mengubahnya menjadi biner ... jika Anda tidak dapat menggunakan algoritma premade, Anda dapat membuat algoritma Anda sendiri untuk menghasilkan kunci untuk dibandingkan ... buat saja shure semua bit dalam input saling bergantung untuk menghasilkan hasilnya ... contoh:

kata sandi: abcdefghi abc = 123456789 (a = 1, b = 2, c = 3 dll ...)

sekarang loop setiap bit (digit) dan tambahkan bersama-sama dengan penghitung, contoh: count = 0 result = "" foreach digit di kata sandi do {result = hasil & (digit + hasil [count-1]) * count) count = count +1}

hasil = (1 + 0) * 1 = 1 (2 + 1) * 2 = 6 (3 + 2) * 3 = 15 (4 + 3) * 4 = 28 (5 + 4) * 5 = 45 (6+ 5) * 6 = 66 (7 + 6) * 7 = 91 (8 + 7) * 8 = 120 (9 + 8) * 9 = 153

hasil utama = 16152845669120153 Biner: 111001011000101110110101110100001110000011100010011001 (Ini adalah contoh yang sangat buruk ... Anda harus berpikir melalui algoritma yang baik ... di mana dua input mulai menggabungkan dan membentuk yang ketiga, dan kemudian yang ketiga dan keempat pergi bersama dengan yang hasil dari penggabungan pertama untuk menghasilkan hasil fith ...)

tetapi sekali lagi, jika Anda tidak dapat menggunakan kunci, Anda tidak dapat menggunakan ini ...

1
Daniel V

Lihatlah kelas Crypto I dari Stanford University di coursera. Ini memecah aliran dan memblokir cipher serta enkripsi kunci publik. Anda akan mendapat lebih banyak informasi jika Anda hanya menonton beberapa kuliah pertama. Ditambah kursus juga mencakup kerentanan dan metode melanggar implementasi crypto.

0
Andrew