|  | =pod | 
|  |  | 
|  | =for comment openssl_manual_section:7 | 
|  |  | 
|  | =head1 NAME | 
|  |  | 
|  | des_modes - the variants of DES and other crypto algorithms of OpenSSL | 
|  |  | 
|  | =head1 DESCRIPTION | 
|  |  | 
|  | Several crypto algorithms for OpenSSL can be used in a number of modes.  Those | 
|  | are used for using block ciphers in a way similar to stream ciphers, among | 
|  | other things. | 
|  |  | 
|  | =head1 OVERVIEW | 
|  |  | 
|  | =head2 Electronic Codebook Mode (ECB) | 
|  |  | 
|  | Normally, this is found as the function I<algorithm>_ecb_encrypt(). | 
|  |  | 
|  | =over 2 | 
|  |  | 
|  | =item * | 
|  |  | 
|  | 64 bits are enciphered at a time. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The order of the blocks can be rearranged without detection. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The same plaintext block always produces the same ciphertext block | 
|  | (for the same key) making it vulnerable to a 'dictionary attack'. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | An error will only affect one ciphertext block. | 
|  |  | 
|  | =back | 
|  |  | 
|  | =head2 Cipher Block Chaining Mode (CBC) | 
|  |  | 
|  | Normally, this is found as the function I<algorithm>_cbc_encrypt(). | 
|  | Be aware that des_cbc_encrypt() is not really DES CBC (it does | 
|  | not update the IV); use des_ncbc_encrypt() instead. | 
|  |  | 
|  | =over 2 | 
|  |  | 
|  | =item * | 
|  |  | 
|  | a multiple of 64 bits are enciphered at a time. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The CBC mode produces the same ciphertext whenever the same | 
|  | plaintext is encrypted using the same key and starting variable. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The chaining operation makes the ciphertext blocks dependent on the | 
|  | current and all preceding plaintext blocks and therefore blocks can not | 
|  | be rearranged. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The use of different starting variables prevents the same plaintext | 
|  | enciphering to the same ciphertext. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | An error will affect the current and the following ciphertext blocks. | 
|  |  | 
|  | =back | 
|  |  | 
|  | =head2 Cipher Feedback Mode (CFB) | 
|  |  | 
|  | Normally, this is found as the function I<algorithm>_cfb_encrypt(). | 
|  |  | 
|  | =over 2 | 
|  |  | 
|  | =item * | 
|  |  | 
|  | a number of bits (j) <= 64 are enciphered at a time. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The CFB mode produces the same ciphertext whenever the same | 
|  | plaintext is encrypted using the same key and starting variable. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The chaining operation makes the ciphertext variables dependent on the | 
|  | current and all preceding variables and therefore j-bit variables are | 
|  | chained together and can not be rearranged. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The use of different starting variables prevents the same plaintext | 
|  | enciphering to the same ciphertext. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The strength of the CFB mode depends on the size of k (maximal if | 
|  | j == k).  In my implementation this is always the case. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | Selection of a small value for j will require more cycles through | 
|  | the encipherment algorithm per unit of plaintext and thus cause | 
|  | greater processing overheads. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | Only multiples of j bits can be enciphered. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | An error will affect the current and the following ciphertext variables. | 
|  |  | 
|  | =back | 
|  |  | 
|  | =head2 Output Feedback Mode (OFB) | 
|  |  | 
|  | Normally, this is found as the function I<algorithm>_ofb_encrypt(). | 
|  |  | 
|  | =over 2 | 
|  |  | 
|  |  | 
|  | =item * | 
|  |  | 
|  | a number of bits (j) <= 64 are enciphered at a time. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The OFB mode produces the same ciphertext whenever the same | 
|  | plaintext enciphered using the same key and starting variable.  More | 
|  | over, in the OFB mode the same key stream is produced when the same | 
|  | key and start variable are used.  Consequently, for security reasons | 
|  | a specific start variable should be used only once for a given key. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The absence of chaining makes the OFB more vulnerable to specific attacks. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | The use of different start variables values prevents the same | 
|  | plaintext enciphering to the same ciphertext, by producing different | 
|  | key streams. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | Selection of a small value for j will require more cycles through | 
|  | the encipherment algorithm per unit of plaintext and thus cause | 
|  | greater processing overheads. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | Only multiples of j bits can be enciphered. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | OFB mode of operation does not extend ciphertext errors in the | 
|  | resultant plaintext output.  Every bit error in the ciphertext causes | 
|  | only one bit to be in error in the deciphered plaintext. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | OFB mode is not self-synchronizing.  If the two operation of | 
|  | encipherment and decipherment get out of synchronism, the system needs | 
|  | to be re-initialized. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | Each re-initialization should use a value of the start variable | 
|  | different from the start variable values used before with the same | 
|  | key.  The reason for this is that an identical bit stream would be | 
|  | produced each time from the same parameters.  This would be | 
|  | susceptible to a 'known plaintext' attack. | 
|  |  | 
|  | =back | 
|  |  | 
|  | =head2 Triple ECB Mode | 
|  |  | 
|  | Normally, this is found as the function I<algorithm>_ecb3_encrypt(). | 
|  |  | 
|  | =over 2 | 
|  |  | 
|  | =item * | 
|  |  | 
|  | Encrypt with key1, decrypt with key2 and encrypt with key3 again. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | As for ECB encryption but increases the key length to 168 bits. | 
|  | There are theoretic attacks that can be used that make the effective | 
|  | key length 112 bits, but this attack also requires 2^56 blocks of | 
|  | memory, not very likely, even for the NSA. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | If both keys are the same it is equivalent to encrypting once with | 
|  | just one key. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | If the first and last key are the same, the key length is 112 bits. | 
|  | There are attacks that could reduce the effective key strength | 
|  | to only slightly more than 56 bits, but these require a lot of memory. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | If all 3 keys are the same, this is effectively the same as normal | 
|  | ecb mode. | 
|  |  | 
|  | =back | 
|  |  | 
|  | =head2 Triple CBC Mode | 
|  |  | 
|  | Normally, this is found as the function I<algorithm>_ede3_cbc_encrypt(). | 
|  |  | 
|  | =over 2 | 
|  |  | 
|  |  | 
|  | =item * | 
|  |  | 
|  | Encrypt with key1, decrypt with key2 and then encrypt with key3. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | As for CBC encryption but increases the key length to 168 bits with | 
|  | the same restrictions as for triple ecb mode. | 
|  |  | 
|  | =back | 
|  |  | 
|  | =head1 NOTES | 
|  |  | 
|  | This text was been written in large parts by Eric Young in his original | 
|  | documentation for SSLeay, the predecessor of OpenSSL.  In turn, he attributed | 
|  | it to: | 
|  |  | 
|  | AS 2805.5.2 | 
|  | Australian Standard | 
|  | Electronic funds transfer - Requirements for interfaces, | 
|  | Part 5.2: Modes of operation for an n-bit block cipher algorithm | 
|  | Appendix A | 
|  |  | 
|  | =head1 SEE ALSO | 
|  |  | 
|  | L<blowfish(3)|blowfish(3)>, L<des(3)|des(3)>, L<idea(3)|idea(3)>, | 
|  | L<rc2(3)|rc2(3)> | 
|  |  | 
|  | =cut | 
|  |  |