Adakah yang bisa mengarahkan saya ke arah yang benar untuk dapat mengenkripsi string, mengembalikan string lain dengan data terenkripsi? (Saya sudah mencoba dengan enkripsi AES256.) Saya ingin menulis metode yang membutuhkan dua contoh NSString, satu adalah pesan untuk dienkripsi dan yang lainnya adalah 'kode sandi' untuk mengenkripsinya - saya kira saya harus membuat kunci enkripsi dengan kode sandi, dengan cara yang dapat dibalik jika kode sandi disertakan dengan data terenkripsi. Metode ini kemudian harus mengembalikan NSString yang dibuat dari data yang dienkripsi.
Saya sudah mencoba teknik rinci dalam komentar pertama di posting ini , tetapi sejauh ini saya tidak berhasil. CryptoExercise Apple pasti memiliki sesuatu, tetapi saya tidak dapat memahaminya ... Saya telah melihat banyak referensi ke CCCrypt , tetapi gagal dalam setiap kasus yang saya gunakan.
Saya juga harus bisa mendekripsi string terenkripsi, tapi saya harap itu sesederhana kCCEncrypt / kCCDecrypt.
Jawaban:
Karena Anda belum memposting kode apa pun, sulit untuk mengetahui dengan tepat masalah yang Anda hadapi. Namun, posting blog yang Anda tautkan tampaknya berfungsi dengan cukup baik ... selain dari koma tambahan di setiap panggilan
CCCrypt()
yang menyebabkan kesalahan kompilasi.Komentar selanjutnya pada posting itu menyertakan kode yang disesuaikan ini , yang berfungsi untuk saya, dan tampaknya sedikit lebih mudah. Jika Anda menyertakan kode mereka untuk kategori NSData, Anda dapat menulis sesuatu seperti ini: (Catatan:
printf()
Panggilan hanya untuk mendemonstrasikan status data di berbagai titik - dalam aplikasi nyata, tidak masuk akal untuk mencetak nilai seperti itu .)Dengan kode ini, dan fakta bahwa data terenkripsi tidak akan selalu diterjemahkan dengan baik ke dalam NSString, mungkin lebih mudah untuk menulis dua metode yang membungkus fungsionalitas yang Anda butuhkan, maju dan mundur ...
Ini pasti berfungsi pada Snow Leopard, dan @Boz melaporkan bahwa CommonCrypto adalah bagian dari Core OS di iPhone. Baik 10.4 dan 10.5 memiliki
/usr/include/CommonCrypto
, meskipun 10.5 memiliki halaman manualCCCryptor.3cc
dan 10.4 tidak, jadi YMMV.EDIT: Lihat pertanyaan tindak lanjut ini tentang menggunakan pengkodean Base64 untuk mewakili byte data terenkripsi sebagai string (jika diinginkan) menggunakan konversi yang aman dan tanpa kehilangan.
sumber
autorelease
.Saya telah mengumpulkan koleksi kategori untuk NSData dan NSString yang menggunakan solusi yang ditemukan di blog Jeff LaMarche dan beberapa petunjuk oleh Quinn Taylor di sini di Stack Overflow.
Ini menggunakan kategori untuk memperluas NSData untuk menyediakan enkripsi AES256 dan juga menawarkan ekstensi NSString ke data terenkripsi BASE64 dengan aman ke string.
Berikut adalah contoh untuk menunjukkan penggunaan untuk mengenkripsi string:
Dapatkan kode sumber lengkapnya di sini:
Terima kasih atas semua petunjuk yang berguna!
- Michael
sumber
@owlead, terkait permintaan Anda untuk "varian yang aman secara kriptografis dari salah satu jawaban yang diberikan," silakan lihat RNCryptor . Itu dirancang untuk melakukan persis apa yang Anda minta (dan dibangun sebagai tanggapan atas masalah dengan kode yang tercantum di sini).
RNCryptor menggunakan PBKDF2 dengan garam, memberikan IV acak, dan memasang HMAC (juga dihasilkan dari PBKDF2 dengan garamnya sendiri. Ini mendukung operasi sinkron dan asinkron.
sumber
Saya menunggu sedikit di @QuinnTaylor untuk memperbarui jawabannya, tetapi karena dia tidak melakukannya, inilah jawabannya sedikit lebih jelas dan dengan cara yang akan dimuat di XCode7 (dan mungkin lebih besar). Saya menggunakan ini di aplikasi Cocoa, tetapi kemungkinan akan berfungsi dengan baik dengan aplikasi iOS juga. Tidak memiliki kesalahan ARC.
Tempelkan sebelum bagian @implementation mana pun di file AppDelegate.m atau AppDelegate.mm Anda.
Tempelkan kedua fungsi ini di kelas @implementation yang Anda inginkan. Dalam kasus saya, saya memilih @implementation AppDelegate di file AppDelegate.mm atau AppDelegate.m saya.
sumber
dataWithBytesNoCopy
alokasikanNSMutableData
dengandataWithLength
dan gunakanmutableBytes
properti untuk pointer byte dan kemudian ubah ukurannya dengan menyetellength
propertinya. 3. Menggunakan string secara langsung untuk enkripsi sangat tidak aman, kunci turunan harus digunakan seperti yang dibuat oleh PBKDF2.keyData.length = kCCKeySizeAES256;
.https://github.com/muneebahmad/AESiOSObjC
sumber