Thank you very much!
I think I have all I need.

El miércoles, 21 de octubre de 2015, 23:10:34 (UTC+2), jean-pierre.muench 
escribió:
>
> Am 21.10.2015 um 22:50 schrieb lasl...@gmail.com <javascript:>:
>
> This is great! 
>  
>   I have finally create my function based on 
>  CTR_ModePolicy::SeekToIteration function. Here it is if anyone want to use 
> it:
>
> void SeekToIteration(unsigned long long iterationCount, char * 
> str_original_IV, int i_size_IV, char * str_new_IV )
> {
>     int carry=0;
>     for (int i=i_size_IV-1; i>=0; i--)
>     {
>         unsigned int sum = str_original_IV[i] + byte(iterationCount) + 
> carry;
>         str_new_IV[i] = (byte) sum;
>         carry = sum >> 8;
>         iterationCount >>= 8;
>     }
> }
>
>
> I'd suggest using byte* instead of char* but the rest is fine and maybe 
> use size_t for the size of the IV.
>
>    I have a question regarding the chunk or block size I have to divide 
> the whole file. Is there any recomentación about it? Is 1 KB valid? or 4KB 
> is better? Or 1 MB? Or there is not any limit or better value than other?
>
> I'd say there's a lower limit. You really don't want to go below the 
> sector size of your file system (and you want to align the chunks with the 
> sectors of your file system).
>
> The actual choice is really up to you and the needs of your application. 
> If you usually only read chunks of a few Megabytes, 1 tag per MB is fine. 
> If basically could run any tiny bit of the file, choose the sector size. 
> And of course I can't judge how much size increase you can afford.  The 
> size increase will be smaller with larger blocks, but if you only ever read 
> large blocks this may be just fine.
>
> From a security standpoint there's an upper bound. You don't want to use 
> the same IV/key pair for more than 2^39-256 bits (or 2^36-32 bytes which is 
> roughly 64GB), but I guess you won't hit that limit...
>
> BR
>
> JPM
>
>
>   Thank you very much to everyone who helped!
>
> El miércoles, 21 de octubre de 2015, 14:15:21 (UTC+2), jean-pierre.muench 
> escribió: 
>
> Am 21.10.2015 um 08:05 schrieb lasl...@gmail.com:
>
>
> OK, I see. 
> But what if I want to get the IV of 123th block? Do I have to do it 123 
> times or there is an IncrementCounterByX(byte*,unsigned int, unsignet int ) 
> function?
>
> The simplest solution is to just loop IncrementCounterByOne().
> The more advanced solution would be to use the function CTR uses for this 
> purpose (see below). You'd replace m_register[] with your input IV ad get 
> your input into m_counterArray[] (in practice you'd use two pointers here).
>
> BR
>
> JPM
>
> void CTR_ModePolicy::SeekToIteration(lword iterationCount)
>
> {
>
>     int carry=0;
>
>     for (int i=BlockSize()-1; i>=0; i--)
>
>     {
>
>         unsigned int sum = m_register[i] + byte(iterationCount) + carry;
>
>         m_counterArray[i] = (byte) sum;
>
>         carry = sum >> 8;
>
>         iterationCount >>= 8;
>
>     }
>
> }
>
> El martes, 20 de octubre de 2015, 23:11:10 (UTC+2), jean-pierre.muench 
> escribió: 
>
> Am 20.10.2015 um 19:11 schrieb lasl...@gmail.com: 
>
> Hi: 
>         I have obviously misunderstand how the TAG works. I've been 
> playing around with code and now I have it clear. Thank you for your help.
>        About the concept of  "blocking" or "chunking":  my question was 
> more focused to some sample code in which, starting an IV for the first 
> block, shows me how to create the following IV incremented by one the 
> previous IV.
>
> If your problem is only the change of the IV for the next chunk there's 
> always "IncrementCounterByOne(byte*,unsigned int)" in Crypto++. You input 
> your old IV IncrementCounterByOne(IV,12) and can feed IV directly into the 
> next call to GCM. The first IV may be all-0 or some random value 
> (AutoSeededRandomPool, AutoSeededX917RNG). BR JPM 
>
>        I'm reading the documentation and testing and thank you very much 
> for your help.
> Thank you very much!
> El lunes, 19 de octubre de 2015, 20:27:37 (UTC+2), jean-pierre.muench 
> escribió: 
>
> Am 19.10.2015 um 19:05 schrieb lasl...@gmail.com: 
>
> Hi Jean Pierre: 
>    Thank you very much for your answer!
>    First of all: yes, I need read and write at any place in the stored 
> file. I know this is a problem.
>    I was reading some doc about AES-GCM, and the way you propose to work, 
> and have some doubts/observations:
>
>    - I understand that using 256bit AES, the GCM mode, and size of TAG = 
>    96 bytes (the shortest recommended) will get a resulting file, 
>    37.5% larger  than the original (regardless of the header). 
>
> I think you're getting something wrong here. The longest standard tag for 
> GCM is 16 bytes (128 bits) and the shortest standard tag is 12 bytes (96 
> bits). 
>
> Some of the files we will encrypt are about 1 GB or even 2GB, so we are 
> speaking about 375MB for tags. This is correct?
>
> I don't know how you calculated those 375MB. Depending on how far you want 
> to chunk you can have 16 byte tag overhead (for the whole files, only one 
> chunk) or more if you want smaller chunks. Reasonable would be a 
> sector-size alignment, meaning Data||Tag would be as large as one sector of 
> your filesystem.  This would result in an increase of 3.2% (512-byte 
> sectors) to 0.09% (16,384-byte sectors). Or you could just use some 
> arbitrary unit like one Megabyte per chunk, resulting in a 0.0015% increase 
> in storage needed. 
>
>
>    -  You say *In your scenario I'd suggest dividing the file into 
>    several subsections*: Where can I find the info about how to handle 
>    the subsection concept  for AES-GCM? 
>
> Chunking and Blocking (see Jeffrey's answer) are standard concepts. What I 
> basically suggest is to divide the file into 
> Header||Chunk1||Chunk2||Chunk3... where each Chunk has it's own tag and is 
> fully independent from the others (besides the somewhat dependent IV). 
>
>
>    - As I can see here 
> https://groups.google.com/forum/#!topic/cryptopp-users/UHlnZ8r-0Gc 
>    there is not option to seek in GCM. It´s true? 
>
> Yes, you can't seek with AES-GCM and Crypto++, because you'd skip parts of 
> the enciphered data, which you can't because the authentication would fail 
> in this case. 
>
> By the way, what do you think about using XTS as shown in the link? I see 
> this option is not implemented in Crypto++...
>
> See Jeffrey's answer. 
>
>
>    - If I want *not *to have TAG overhead I have two options AES-CTR+HMAC 
>    or AES-CBC+HMAC: 
>
> CTR would be the better option here as it can be parallelized (supports 
> seek() in Crypto++) and has less severe IV requirements. 
>
>
>    - Pros: 
>          - File size will change only with header info. 
>       
> You can also get constant tag size "tag overhead" with AES-GCM by only 
> using one chunk. 
>
>
>    - Need to change HMAC every time file is changed.  A test to perform: 
>          how long it takes to compute HMAC of a 1GB file? 
>       
> With SHA-256, you'd roughly need 20 cycles / byte on such long messages 
> with a C implementation on an Intel Core 2 Duo [1]. Meaning you may get 
> something like 10 cycles / byte with ASM code on a modern CPU. HMAC is not 
> significantly slower than plain hashing. This would mean you'd need 10^10 
> cycles for this - or equivalently - 5 seconds on a 2GHz CPU. Reading the 
> whole file is likely to take longer. BR JPM [1]: 
> https://www.schneier.com/skein1.3.pdf 
>
>
>    - Cons:  
>    
>
>    - More slow encryption/decryption 
>       
> Thank you very much for your help! El domingo, 18 de octubre de 2015, 
> 21:06:59 (UTC+2), jean-pierre.muench escribió: 
>
> Am 18.10.2015 um 18:20 schrieb lasl...@gmail.com: 
>
> Hi all: 
>    Never before have I worked in cryptography. Excuse me if the question 
> is very long but i´m very lost.
>    We have a new project in my company related to cryptography and would 
> appreciate you give me advice. 
>    We have many customers who are going to save many files encrypted on 
> our servers. The files are now unencrypted. We'll encrypt files and, from 
> now on, read and change the content without completely decrypt. 
>    Each file can have its own password, but we believe that most customers 
> will always use the same password. 
>    I'm thinking about putting a header to the file, as is done in 
> https://www.aescrypt.com/aes_file_format.html. In this way we can have a 
> new Initialization Vector ( if necessary ) for each compressed file and the 
> hash of the password. 
>
> The header format is actually looking surprisingly good. However I'd 
> suggest only using 12 byte IVs (AES-GCM only needs a 12 byte IV) and 
> replacing the header's "HMAC" with an AES-GCM tag. And I'd suggest 
> authenticating the whole unencrypted header (extensions, version, ...) with 
> the header's tag (GCM can handle associated data). 
>
>    In the header we also will keep pointers to various sections of the 
> document in which we have to read for some encrypted information and write 
> some encrypted information on the fly. For this reason I need a semi-ramdom 
> access.
>
> This actually is really tricky. Just to make sure: You need to be able 
> securely read and write at any place in the stored file? This will force 
> you to re-authenticate the whole file (which can be done quite fast via 
> this trick[1]) or to pull off some other trick. In your scenario I'd 
> suggest dividing the file into several subsections. Each subsection will 
> have it's own IV which is just the IV of the previous subsection 
> incremented by one (this is safe with AES-GCM). And at the end of each 
> subsection there will be an authentication tag for said section. This will 
> give you a linear increase in size, but a linear decrease in computation 
> time as you only need to consider a specific subsection when 
> re-authenticating or verifying. 
>
>    We have quite clear that we must use AES to encrypt files. We're not 
> sure whether to use 128bit or 256bit. There  is really too much difference 
> in safety between them (we need to consider speed) ?
>
> You need to consider two points here. a) Marketing. AES-256 with a 2^256 
> key space will sound much more impressive than AES-128 with a tiny 2^128 
> key space. b) Security period. If you want to keep the data confidential 
> for a very long time (decades?) than you want to use AES-256. Otherwise 
> AES-128 is just fine (and NSA approved for secret information) and will be 
> a bit faster. 
>
>    And the most important question is what may be the most secure mode, 
> even assuming that an attacker could download all the files from the server?
>
> AES-GCM is the mode of choice in modern Cryptography. It is considered 
> good style to use AES-GCM and will be significantly faster than most other 
> modes (like AES-CTR+HMAC or AES-CBC+HMAC). Furthermore you may be able to 
> exploit the underlying construction to be faster by multi threading via 
> [1]. I hope this answered your questions, if there are any left you may ask 
> here or over at Crypto.SE[2] although you may not make it too broad there. 
> BR JPM [1]: https://crypto.stackexchange.com/a/27468/23623 [2]: 
> https://crypto.stackexchange.com/ 
>
> Thank you in advance!
> -- -- You received this message because you are subscribed to the 
> "Crypto++ Users" Google Group. To unsubscribe, send an email to 
> cryptopp-user...@googlegroups.com. More information about Crypto++ and 
> this group is available at http://www.cryptopp.com. --- You received this 
> message because you are subscribed to the Google Groups "Crypto++ Users" 
> group. To unsubscribe from this group and stop receiving emails from it, 
> send an email to cryptopp-user...@googlegroups.com. For more options, 
> visit https://groups.google.com/d/optout. 
>
> -- -- You received this message because you are subscribed to the 
> "Crypto++ Users" Google Group. To unsubscribe, send an email to 
> cryptopp-user...@googlegroups.com. More information about Crypto++ and 
> this group is available at http://www.cryptopp.com. --- You received this 
> message because you are subscribed to the Google Groups "Crypto++ Users" 
> group. To unsubscribe from this group and stop receiving emails from it, 
> send an email to cryptopp-user...@googlegroups.com. For more options, 
> visit https://groups.google.com/d/optout. 
>
> -- -- You received this message because you are subscribed to the 
> "Crypto++ Users" Google Group. To unsubscribe, send an email to 
> cryptopp-user...@googlegroups.com. More information about Crypto++ and 
> this group is available at http://www.cryptopp.com. --- You received this 
> message because you are subscribed to the Google Groups "Crypto++ Users" 
> group. To unsubscribe from this group and stop receiving emails from it, 
> send an email to cryptopp-user...@googlegroups.com. For more options, 
> visit https://groups.google.com/d/optout. 
>
> -- -- You received this message because you are subscribed to the 
> "Crypto++ Users" Google Group. To unsubscribe, send an email to 
> cryptopp-user...@googlegroups.com. More information about Crypto++ and 
> this group is available at http://www.cryptopp.com. --- You received this 
> message because you are subscribed to the Google Groups "Crypto++ Users" 
> group. To unsubscribe from this group and stop receiving emails from it, 
> send an email to 
>
> ...

-- 
-- 
You received this message because you are subscribed to the "Crypto++ Users" 
Google Group.
To unsubscribe, send an email to cryptopp-users-unsubscr...@googlegroups.com.
More information about Crypto++ and this group is available at 
http://www.cryptopp.com.
--- 
You received this message because you are subscribed to the Google Groups 
"Crypto++ Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to cryptopp-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to