On 24 Jun 2017, at 21:12, yu...@aim.com wrote:
> 
> I hope i am at the right place to ask for help on file encryption/decryption 
> for iOS.
> 
> I need to encrypt a pdf file during download and to decrypt it for display 
> later on.  Can i get some pointers about implementing the 
> decryption/encryption part ?  or if there is any existing 
> decryption/encryption package or code i can use ?

Step back a bit; what’s the use-case for this?  If you’re worried about 
protecting data at rest, iOS already does that automatically; see
  
<https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforImplementingYourApp/StrategiesforImplementingYourApp.html#//apple_ref/doc/uid/TP40007072-CH5-SW21>

Applications can’t directly access other applications’ files anyway, so the 
only remaining use-case would appear to be preventing someone else with 
physical access to the device *and* the ability to unlock it from downloading 
the data.  Additionally, if you use a crypto layer on top of that, you’re going 
to have a problem, namely where to store the key.  The only way you’re going to 
be *more* secure is if you derive the key from a passphrase using a Key 
Derivation Function (PBKDF2, for instance) and then ask the user for that every 
time - but it isn’t clear to me what the advantage of doing that is over 
getting the user to use a secure passcode for their device in the first place.

If you *really* must do this, well, it’s quite complicated.  You’ll want to use 
CommonCrypto (see “apropos 3cc” or “man CC_crypto” in a Terminal window) with 
AES, which is a block cipher, so you’ll need padding (see 
<https://en.wikipedia.org/wiki/Padding_(cryptography)>), which you’ll need to 
implement carefully and check when you’re reading the file - any errors with 
the padding should be a hard fail.  If you just want to read the entire file in 
as one blob, you could use the default mode (CBC mode), but if you need random 
access for any reason you’ll need to build an implementation of CTR mode on top 
of CommonCrypto’s ECB mode (see 
<https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation>).  You’ll also 
need to generate an IV (Initialization Vector) or nonce using a suitable random 
number source (/dev/random or SecRandomCopyBytes() are appropriate choices 
here; rand() or random() are not, nor is some dodgy function you came up with 
yourself, or *any* non-cryptographic RNG you looked up in a textbook); DO NOT 
USE ALL ZEROES FOR YOUR IV.  You’ll need to store the IV with the file (e.g. as 
the first chunk of data).  You’ll also need a nonce for your KDF, which also 
needs to be secure and also needs to be stored somewhere.  You’ll need to think 
about whether there’s a single passphrase that unlocks all the data in your 
application (in which case you then need to consider whether using a single AES 
key for everything is good enough, or whether you want per-file AES keys, and 
in *that* case you need to know either (a) how you’re going to derive all those 
keys from the one passphrase, or (b) if you’re going to store them encrypted 
with a key derived from the passphrase).  There’s a whole heap of complexity to 
think about here, and some of the answers may depend on exactly how your 
application works (e.g. whether an attacker could conceivably supply a PDF to 
it for encryption, or whether you can guarantee somehow - e.g. using SSL 
certificate pinning - that the PDFs only come from a trustworthy source).  This 
is tricky stuff and given the question you asked, I’m honestly not certain 
you’re the right person to be implementing it --- I’d tend to recommend that 
you find someone with expertise in this area to help you, or at least give you 
some advice --- and you’ll need to start by carefully examining the entire 
system you’re building and looking to see what threats you’re trying to protect 
against.

Personally, I strongly suspect that all of the above is unnecessary and that 
you can just let iOS protect your data for you.  On the plus side, you’re 
unlikely to make your data any less secure than it is by default, and the 
default level of security is, I suspect, already sufficient for your needs.  On 
the minus side, if you make a mistake anywhere in all of this, it might render 
the entire exercise totally pointless (i.e. you’ll have written an obfuscation 
layer, rather than something that genuinely provides extra security); in the 
very worst case, you might actually enable an attacker to cause your code to do 
something unexpected, though iOS does do various things (ASLR, non-executable 
memory) that make that harder.

TL;DR: You probably don’t need to do this; what iOS does already is probably 
good enough for you.  If you really *do* need to do this, given the question 
you asked, you should consider hiring an expert to help you to understand the 
threat model, to help you make appropriate choices, and perhaps even to 
implement the encryption layer for you.

Kind regards,

Alastair.

--
http://alastairs-place.net

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to