blob: fffad6e87c2bd48a879dee7433b92add4766f39a [file] [log] [blame]
Alex Gaynor2724ff62013-12-20 13:51:42 -08001.. hazmat:: /fernet
Donald Stufftd8f01182013-10-27 16:59:56 -04002
3
Alex Stapletonc5fffd32014-03-18 15:29:00 +00004Symmetric encryption
Donald Stuffte51fb932013-10-27 17:26:17 -04005====================
6
Paul Kehrer051099e2013-11-06 15:53:40 +08007.. currentmodule:: cryptography.hazmat.primitives.ciphers
David Reid1f3d7182013-10-22 16:55:18 -07008
Donald Stufft173de982013-08-12 07:34:39 -04009.. testsetup::
10
11 import binascii
12 key = binascii.unhexlify(b"0" * 32)
13 iv = binascii.unhexlify(b"0" * 32)
14
15
Alex Stapleton092351d2014-03-09 17:44:43 +000016Symmetric encryption is a way to `encrypt`_ or hide the contents of material
17where the sender and receiver both use the same secret key. Note that symmetric
18encryption is **not** sufficient for most applications because it only
19provides secrecy but not authenticity. That means an attacker can't see the
20message but an attacker can create bogus messages and force the application to
21decrypt them.
22
Paul Kehrer006670c2014-05-09 11:12:43 -050023For this reason it is **strongly** recommended to combine encryption with a
Alex Gaynor969f18e2014-05-17 20:07:35 -070024message authentication code, such as :doc:`HMAC </hazmat/primitives/mac/hmac>`,
25in an "encrypt-then-MAC" formulation as `described by Colin Percival`_.
Alex Gaynorf6c47e92013-08-08 07:16:01 -070026
David Reidef0fcf22013-11-06 11:12:45 -080027.. class:: Cipher(algorithm, mode, backend)
Alex Gaynorf6c47e92013-08-08 07:16:01 -070028
Alex Stapleton092351d2014-03-09 17:44:43 +000029 Cipher objects combine an algorithm such as
30 :class:`~cryptography.hazmat.primitives.ciphers.algorithms.AES` with a
31 mode like
Alex Gaynorab5f0112013-11-08 10:34:00 -080032 :class:`~cryptography.hazmat.primitives.ciphers.modes.CBC` or
Alex Stapleton092351d2014-03-09 17:44:43 +000033 :class:`~cryptography.hazmat.primitives.ciphers.modes.CTR`. A simple
34 example of encrypting and then decrypting content with AES is:
Alex Gaynorf6c47e92013-08-08 07:16:01 -070035
Donald Stufft173de982013-08-12 07:34:39 -040036 .. doctest::
Alex Gaynorf6c47e92013-08-08 07:16:01 -070037
Paul Kehrer051099e2013-11-06 15:53:40 +080038 >>> from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
Alex Gaynorf8796b12013-12-13 20:28:55 -080039 >>> from cryptography.hazmat.backends import default_backend
Alex Gaynorf56444d2013-12-13 15:19:22 -080040 >>> backend = default_backend()
David Reid63fa19a2013-11-20 10:49:13 -080041 >>> cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
Paul Kehrer3e0895c2013-10-21 22:19:29 -050042 >>> encryptor = cipher.encryptor()
43 >>> ct = encryptor.update(b"a secret message") + encryptor.finalize()
44 >>> decryptor = cipher.decryptor()
45 >>> decryptor.update(ct) + decryptor.finalize()
Paul Kehrerf6cf9562013-10-22 10:36:00 -050046 'a secret message'
Alex Gaynorf6c47e92013-08-08 07:16:01 -070047
David Reid663295d2013-11-20 13:55:08 -080048 :param algorithms: A
49 :class:`~cryptography.hazmat.primitives.interfaces.CipherAlgorithm`
50 provider such as those described
51 :ref:`below <symmetric-encryption-algorithms>`.
52 :param mode: A :class:`~cryptography.hazmat.primitives.interfaces.Mode`
53 provider such as those described
54 :ref:`below <symmetric-encryption-modes>`.
55 :param backend: A
Alex Gaynorf8796b12013-12-13 20:28:55 -080056 :class:`~cryptography.hazmat.backends.interfaces.CipherBackend`
David Reid663295d2013-11-20 13:55:08 -080057 provider.
Alex Gaynor0ca7fdb2013-08-08 07:35:26 -070058
Alex Gaynor7a489db2014-03-22 15:09:34 -070059 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
Ayrxf56c54e2014-03-16 14:36:17 +080060 provided ``backend`` does not implement
61 :class:`~cryptography.hazmat.backends.interfaces.CipherBackend`
62
Paul Kehrer5399fd02013-10-21 23:48:25 -050063 .. method:: encryptor()
Alex Gaynor09515f02013-08-08 15:26:55 -070064
David Reid63ba6652013-10-22 14:09:19 -070065 :return: An encrypting
Donald Stufftf04317a2013-10-27 16:44:30 -040066 :class:`~cryptography.hazmat.primitives.interfaces.CipherContext`
David Reid63ba6652013-10-22 14:09:19 -070067 provider.
Alex Gaynore62aa402013-08-08 15:23:11 -070068
Alex Gaynorf1a3fc02013-11-02 14:03:34 -070069 If the backend doesn't support the requested combination of ``cipher``
Alex Gaynor7a489db2014-03-22 15:09:34 -070070 and ``mode`` an :class:`~cryptography.exceptions.UnsupportedAlgorithm`
Alex Stapleton092351d2014-03-09 17:44:43 +000071 exception will be raised.
Alex Gaynorf1a3fc02013-11-02 14:03:34 -070072
Paul Kehrer5399fd02013-10-21 23:48:25 -050073 .. method:: decryptor()
74
David Reid63ba6652013-10-22 14:09:19 -070075 :return: A decrypting
Donald Stufftf04317a2013-10-27 16:44:30 -040076 :class:`~cryptography.hazmat.primitives.interfaces.CipherContext`
David Reid63ba6652013-10-22 14:09:19 -070077 provider.
Paul Kehrer5399fd02013-10-21 23:48:25 -050078
Alex Gaynorf1a3fc02013-11-02 14:03:34 -070079 If the backend doesn't support the requested combination of ``cipher``
Alex Gaynorfdf63302014-04-29 18:26:11 -070080 and ``mode`` an :class:`~cryptography.exceptions.UnsupportedAlgorithm`
Alex Stapleton092351d2014-03-09 17:44:43 +000081 exception will be raised.
Alex Gaynorf1a3fc02013-11-02 14:03:34 -070082
David Reid663295d2013-11-20 13:55:08 -080083.. _symmetric-encryption-algorithms:
84
Paul Kehrer051099e2013-11-06 15:53:40 +080085Algorithms
86~~~~~~~~~~
Alex Gaynord96d1002013-08-08 07:37:26 -070087
Paul Kehrer051099e2013-11-06 15:53:40 +080088.. currentmodule:: cryptography.hazmat.primitives.ciphers.algorithms
David Reid1f3d7182013-10-22 16:55:18 -070089
90.. class:: AES(key)
Alex Gaynor5ba2dfa2013-08-08 11:04:44 -070091
Alex Gaynor1e3f81f2013-08-08 11:31:43 -070092 AES (Advanced Encryption Standard) is a block cipher standardized by NIST.
Alex Gaynor5ba2dfa2013-08-08 11:04:44 -070093 AES is both fast, and cryptographically strong. It is a good default
94 choice for encryption.
95
Alex Stapleton092351d2014-03-09 17:44:43 +000096 :param bytes key: The secret key. This must be kept secret. Either ``128``,
97 ``192``, or ``256`` bits long.
Alex Gaynor5ba2dfa2013-08-08 11:04:44 -070098
David Reid1f3d7182013-10-22 16:55:18 -070099.. class:: Camellia(key)
Paul Kehrerdff22d42013-09-27 13:43:06 -0500100
Alex Stapleton092351d2014-03-09 17:44:43 +0000101 Camellia is a block cipher approved for use by `CRYPTREC`_ and ISO/IEC.
102 It is considered to have comparable security and performance to AES but
Paul Kehrerdff22d42013-09-27 13:43:06 -0500103 is not as widely studied or deployed.
104
Alex Stapleton092351d2014-03-09 17:44:43 +0000105 :param bytes key: The secret key. This must be kept secret. Either ``128``,
106 ``192``, or ``256`` bits long.
Paul Kehrerdff22d42013-09-27 13:43:06 -0500107
David Reid1f3d7182013-10-22 16:55:18 -0700108.. class:: TripleDES(key)
Alex Gaynoraeb714c2013-09-09 18:06:14 -0700109
Alex Gaynor9316f4c2013-11-15 16:38:42 -0800110 Triple DES (Data Encryption Standard), sometimes referred to as 3DES, is a
111 block cipher standardized by NIST. Triple DES has known crypto-analytic
Alex Gaynor17adce62013-10-16 17:04:40 -0700112 flaws, however none of them currently enable a practical attack.
Alex Gaynor9316f4c2013-11-15 16:38:42 -0800113 Nonetheless, Triples DES is not recommended for new applications because it
Alex Gaynorfbcc5642013-10-22 08:26:00 -0700114 is incredibly slow; old applications should consider moving away from it.
Alex Gaynoraeb714c2013-09-09 18:06:14 -0700115
Alex Stapleton092351d2014-03-09 17:44:43 +0000116 :param bytes key: The secret key. This must be kept secret. Either ``64``,
117 ``128``, or ``192`` bits long. DES only uses ``56``, ``112``, or ``168``
118 bits of the key as there is a parity byte in each component of the key.
119 Some writing refers to there being up to three separate keys that are each
120 ``56`` bits long, they can simply be concatenated to produce the full key.
Alex Gaynoraeb714c2013-09-09 18:06:14 -0700121
Paul Kehrerbab0e1a2014-02-09 10:51:59 -0600122.. class:: CAST5(key)
123
Paul Kehrera5011ec2014-02-13 12:33:34 -0600124 .. versionadded:: 0.2
125
Paul Kehrerbab0e1a2014-02-09 10:51:59 -0600126 CAST5 (also known as CAST-128) is a block cipher approved for use in the
127 Canadian government by the `Communications Security Establishment`_. It is
128 a variable key length cipher and supports keys from 40-128 bits in length.
129
Alex Stapleton092351d2014-03-09 17:44:43 +0000130 :param bytes key: The secret key, This must be kept secret. 40 to 128 bits
131 in length in increments of 8 bits.
Paul Kehrerbab0e1a2014-02-09 10:51:59 -0600132
Paul Kehrer7e914c92014-04-09 09:12:29 -0500133.. class:: SEED(key)
134
135 .. versionadded:: 0.4
136
Alex Stapleton19e97bd2014-05-02 21:57:59 +0100137 SEED is a block cipher developed by the Korea Information Security Agency
138 (KISA). It is defined in :rfc:`4269` and is used broadly throughout South
Paul Kehrer7e914c92014-04-09 09:12:29 -0500139 Korean industry, but rarely found elsewhere.
140
141 :param bytes key: The secret key. This must be kept secret. ``128`` bits in
142 length.
143
Alex Stapletonc5fffd32014-03-18 15:29:00 +0000144Weak ciphers
Paul Kehrer3446d812013-10-31 17:15:03 -0500145------------
146
147.. warning::
148
149 These ciphers are considered weak for a variety of reasons. New
150 applications should avoid their use and existing applications should
151 strongly consider migrating away.
152
Paul Kehrer5df0abe2013-10-30 16:57:04 -0500153.. class:: Blowfish(key)
154
155 Blowfish is a block cipher developed by Bruce Schneier. It is known to be
156 susceptible to attacks when using weak keys. The author has recommended
Alex Stapleton092351d2014-03-09 17:44:43 +0000157 that users of Blowfish move to newer algorithms such as :class:`AES`.
Paul Kehrer5df0abe2013-10-30 16:57:04 -0500158
Alex Stapleton092351d2014-03-09 17:44:43 +0000159 :param bytes key: The secret key. This must be kept secret. 32 to 448 bits
160 in length in increments of 8 bits.
Paul Kehrer5df0abe2013-10-30 16:57:04 -0500161
Paul Kehrer4da28c32013-11-07 07:50:17 +0800162.. class:: ARC4(key)
163
164 ARC4 (Alleged RC4) is a stream cipher with serious weaknesses in its
165 initial stream output. Its use is strongly discouraged. ARC4 does not use
166 mode constructions.
167
Alex Stapleton092351d2014-03-09 17:44:43 +0000168 :param bytes key: The secret key. This must be kept secret. Either ``40``,
169 ``56``, ``64``, ``80``, ``128``, ``192``, or ``256`` bits in length.
Paul Kehrer4da28c32013-11-07 07:50:17 +0800170
Paul Kehrer0994c562013-11-10 03:19:14 +0800171 .. doctest::
172
173 >>> from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
Alex Gaynorf8796b12013-12-13 20:28:55 -0800174 >>> from cryptography.hazmat.backends import default_backend
Paul Kehrer0994c562013-11-10 03:19:14 +0800175 >>> algorithm = algorithms.ARC4(key)
Alex Gaynorf56444d2013-12-13 15:19:22 -0800176 >>> cipher = Cipher(algorithm, mode=None, backend=default_backend())
Paul Kehrer0994c562013-11-10 03:19:14 +0800177 >>> encryptor = cipher.encryptor()
178 >>> ct = encryptor.update(b"a secret message")
179 >>> decryptor = cipher.decryptor()
180 >>> decryptor.update(ct)
181 'a secret message'
182
Paul Kehrere5dc1222014-02-20 16:19:32 -0600183.. class:: IDEA(key)
184
185 IDEA (`International Data Encryption Algorithm`_) is a block cipher created
186 in 1991. It is an optional component of the `OpenPGP`_ standard. This cipher
187 is susceptible to attacks when using weak keys. It is recommended that you
188 do not use this cipher for new applications.
189
Paul Kehrer7e914c92014-04-09 09:12:29 -0500190 :param bytes key: The secret key. This must be kept secret. ``128`` bits in
Paul Kehrer7ba0c012014-03-08 11:33:35 -0400191 length.
Paul Kehrere5dc1222014-02-20 16:19:32 -0600192
David Reid30722b92013-11-07 13:03:39 -0800193
194.. _symmetric-encryption-modes:
195
Alex Gaynord96d1002013-08-08 07:37:26 -0700196Modes
197~~~~~
198
Paul Kehrer051099e2013-11-06 15:53:40 +0800199.. currentmodule:: cryptography.hazmat.primitives.ciphers.modes
David Reid1f3d7182013-10-22 16:55:18 -0700200
201.. class:: CBC(initialization_vector)
Alex Gaynor48ec9a32013-08-08 11:13:46 -0700202
Alex Stapleton092351d2014-03-09 17:44:43 +0000203 CBC (Cipher Block Chaining) is a mode of operation for block ciphers. It is
Alex Gaynor48ec9a32013-08-08 11:13:46 -0700204 considered cryptographically strong.
205
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600206 **Padding is required when using this mode.**
207
Alex Gaynor48ec9a32013-08-08 11:13:46 -0700208 :param bytes initialization_vector: Must be random bytes. They do not need
Alex Stapleton092351d2014-03-09 17:44:43 +0000209 to be kept secret and they can be included in a transmitted message.
210 Must be the same number of bytes as the ``block_size`` of the cipher.
211 Each time something is encrypted a new ``initialization_vector`` should
212 be generated. Do not reuse an ``initialization_vector`` with a given
Alex Gaynorfb843aa2014-02-25 11:37:36 -0800213 ``key``, and particularly do not use a constant
214 ``initialization_vector``.
Alex Gaynor8ed651e2013-11-07 13:24:31 -0800215
216 A good construction looks like:
217
Alex Gaynor989061d2013-12-13 20:22:14 -0800218 .. doctest::
Alex Gaynor8ed651e2013-11-07 13:24:31 -0800219
220 >>> import os
Alex Gaynord83c5902013-12-13 20:43:54 -0800221 >>> from cryptography.hazmat.primitives.ciphers.modes import CBC
Alex Gaynor8ed651e2013-11-07 13:24:31 -0800222 >>> iv = os.urandom(16)
223 >>> mode = CBC(iv)
224
225 While the following is bad and will leak information:
226
Alex Gaynor989061d2013-12-13 20:22:14 -0800227 .. doctest::
Alex Gaynor8ed651e2013-11-07 13:24:31 -0800228
Alex Gaynord83c5902013-12-13 20:43:54 -0800229 >>> from cryptography.hazmat.primitives.ciphers.modes import CBC
Alex Gaynor8ed651e2013-11-07 13:24:31 -0800230 >>> iv = "a" * 16
231 >>> mode = CBC(iv)
Paul Kehrer13f108f2013-09-09 21:41:03 -0500232
Paul Kehrer45064282013-10-17 13:41:53 -0500233
David Reid1f3d7182013-10-22 16:55:18 -0700234.. class:: CTR(nonce)
Paul Kehrerd0ec60e2013-10-16 08:46:50 -0500235
Paul Kehrer45064282013-10-17 13:41:53 -0500236 .. warning::
237
238 Counter mode is not recommended for use with block ciphers that have a
239 block size of less than 128-bits.
240
Paul Kehrerd0ec60e2013-10-16 08:46:50 -0500241 CTR (Counter) is a mode of operation for block ciphers. It is considered
Alex Gaynord1f02012013-11-01 14:12:35 -0700242 cryptographically strong. It transforms a block cipher into a stream
243 cipher.
Paul Kehrerd0ec60e2013-10-16 08:46:50 -0500244
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600245 **This mode does not require padding.**
246
Paul Kehrer89b3dd32013-10-17 14:02:45 -0500247 :param bytes nonce: Should be random bytes. It is critical to never reuse a
Alex Gaynorfb843aa2014-02-25 11:37:36 -0800248 ``nonce`` with a given key. Any reuse of a nonce with the same key
249 compromises the security of every message encrypted with that key. Must
250 be the same number of bytes as the ``block_size`` of the cipher with a
251 given key. The nonce does not need to be kept secret and may be
Alex Stapleton092351d2014-03-09 17:44:43 +0000252 included with the ciphertext.
Paul Kehrerd0ec60e2013-10-16 08:46:50 -0500253
David Reid1f3d7182013-10-22 16:55:18 -0700254.. class:: OFB(initialization_vector)
Paul Kehrer6f412a02013-09-10 21:30:50 -0500255
256 OFB (Output Feedback) is a mode of operation for block ciphers. It
257 transforms a block cipher into a stream cipher.
258
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600259 **This mode does not require padding.**
260
David Reidf1a39bd2013-09-11 16:28:42 -0700261 :param bytes initialization_vector: Must be random bytes. They do not need
Alex Stapleton092351d2014-03-09 17:44:43 +0000262 to be kept secret and they can be included in a transmitted message.
263 Must be the same number of bytes as the ``block_size`` of the cipher.
264 Do not reuse an ``initialization_vector`` with a given ``key``.
Paul Kehrer6f412a02013-09-10 21:30:50 -0500265
David Reid1f3d7182013-10-22 16:55:18 -0700266.. class:: CFB(initialization_vector)
Paul Kehrer4223df72013-09-11 09:48:04 -0500267
268 CFB (Cipher Feedback) is a mode of operation for block ciphers. It
269 transforms a block cipher into a stream cipher.
270
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600271 **This mode does not require padding.**
272
Paul Kehrer4223df72013-09-11 09:48:04 -0500273 :param bytes initialization_vector: Must be random bytes. They do not need
Alex Stapleton092351d2014-03-09 17:44:43 +0000274 to be kept secret and they can be included in a transmitted message.
275 Must be the same number of bytes as the ``block_size`` of the cipher.
276 Do not reuse an ``initialization_vector`` with a given ``key``.
Paul Kehrer4223df72013-09-11 09:48:04 -0500277
Paul Kehrer2a947c42014-05-15 17:22:08 -0400278.. class:: CFB8(initialization_vector)
279
280 CFB (Cipher Feedback) is a mode of operation for block ciphers. It
281 transforms a block cipher into a stream cipher. The CFB8 variant uses an
282 8-bit shift register.
283
284 **This mode does not require padding.**
285
286 :param bytes initialization_vector: Must be random bytes. They do not need
287 to be kept secret and they can be included in a transmitted message.
288 Must be the same number of bytes as the ``block_size`` of the cipher.
289 Do not reuse an ``initialization_vector`` with a given ``key``.
290
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600291.. class:: GCM(initialization_vector, tag=None)
292
Paul Kehrer5b828b12013-11-29 17:32:08 -0600293 .. danger::
Paul Kehrer26c8c6a2013-11-29 16:24:56 -0600294
Alex Stapleton092351d2014-03-09 17:44:43 +0000295 When using this mode you **must** not use the decrypted data until
Alex Gaynor0d23e942013-12-04 17:28:24 -0600296 :meth:`~cryptography.hazmat.primitives.interfaces.CipherContext.finalize`
Alex Stapleton092351d2014-03-09 17:44:43 +0000297 has been called. GCM provides **no** guarantees of ciphertext integrity
Alex Gaynord4f93832013-12-04 16:31:59 -0600298 until decryption is complete.
Paul Kehrer26c8c6a2013-11-29 16:24:56 -0600299
Paul Kehrer5578c662013-12-03 17:37:42 -0600300 GCM (Galois Counter Mode) is a mode of operation for block ciphers. An
301 AEAD (authenticated encryption with additional data) mode is a type of
Alex Stapleton092351d2014-03-09 17:44:43 +0000302 block cipher mode that simultaneously encrypts the message as well as
303 authenticating it. Additional unencrypted data may also be authenticated.
304 Additional means of verifying integrity such as
Ayrxfa4a6b22014-04-16 23:03:14 +0800305 :doc:`HMAC </hazmat/primitives/mac/hmac>` are not necessary.
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600306
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600307 **This mode does not require padding.**
308
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600309 :param bytes initialization_vector: Must be random bytes. They do not need
Alex Stapleton092351d2014-03-09 17:44:43 +0000310 to be kept secret and they can be included in a transmitted message.
311 NIST `recommends a 96-bit IV length`_ for performance critical
312 situations but it can be up to 2\ :sup:`64` - 1 bits. Do not reuse an
Alex Gaynorfb843aa2014-02-25 11:37:36 -0800313 ``initialization_vector`` with a given ``key``.
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600314
Paul Kehrerca735042013-12-21 17:31:48 -0600315 .. note::
316
Alex Stapleton092351d2014-03-09 17:44:43 +0000317 Cryptography will generate a 128-bit tag when finalizing encryption.
318 You can shorten a tag by truncating it to the desired length but this
Paul Kehrerfc73e2d2013-12-21 18:41:38 -0600319 is **not recommended** as it lowers the security margins of the
Alex Gaynor8f1b8e82014-06-29 20:43:29 -0700320 authentication (`NIST SP-800-38D`_ recommends 96-bits or greater). If
321 you must shorten the tag the minimum allowed length is 4 bytes
322 (32-bits). Applications wishing to allow truncation must pass the
323 ``min_tag_length`` parameter.
324
325 .. versionchanged:: 0.5
326
327 The ``min_tag_length`` parameter was added in ``0.5``, previously
328 truncation up to ``4`` bytes was always allowed.
Paul Kehrerca735042013-12-21 17:31:48 -0600329
Alex Gaynorfb843aa2014-02-25 11:37:36 -0800330 :param bytes tag: The tag bytes to verify during decryption. When
331 encrypting this must be ``None``.
Paul Kehrer67abc862013-11-25 14:29:35 -0600332
Alex Gaynor8f1b8e82014-06-29 20:43:29 -0700333 :param bytes min_tag_length: The minimum length ``tag`` must be. By default
334 this is ``16``, meaning tag truncation is not allowed.
335
David Reidabb72d22014-01-07 16:06:18 -0800336 .. testcode::
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600337
David Reidabb72d22014-01-07 16:06:18 -0800338 import os
339
340 from cryptography.hazmat.primitives.ciphers import (
341 Cipher, algorithms, modes
342 )
343
David Reid78569d62014-01-07 15:42:17 -0800344 def encrypt(key, plaintext, associated_data):
David Reidabb72d22014-01-07 16:06:18 -0800345 # Generate a random 96-bit IV.
David Reid78569d62014-01-07 15:42:17 -0800346 iv = os.urandom(12)
David Reidabb72d22014-01-07 16:06:18 -0800347
Alex Gaynorebb1cb92014-06-10 09:36:39 -0700348 # Construct an AES-GCM Cipher object with the given key and a
Alex Stapleton092351d2014-03-09 17:44:43 +0000349 # randomly generated IV.
David Reidabb72d22014-01-07 16:06:18 -0800350 encryptor = Cipher(
David Reid78569d62014-01-07 15:42:17 -0800351 algorithms.AES(key),
352 modes.GCM(iv),
353 backend=default_backend()
David Reidabb72d22014-01-07 16:06:18 -0800354 ).encryptor()
David Reid78569d62014-01-07 15:42:17 -0800355
David Reidabb72d22014-01-07 16:06:18 -0800356 # associated_data will be authenticated but not encrypted,
357 # it must also be passed in on decryption.
David Reid78569d62014-01-07 15:42:17 -0800358 encryptor.authenticate_additional_data(associated_data)
David Reid78569d62014-01-07 15:42:17 -0800359
David Reidabb72d22014-01-07 16:06:18 -0800360 # Encrypt the plaintext and get the associated ciphertext.
Paul Kehreraf0b9f52014-01-07 19:21:49 -0600361 # GCM does not require padding.
362 ciphertext = encryptor.update(plaintext) + encryptor.finalize()
David Reidabb72d22014-01-07 16:06:18 -0800363
364 return (iv, ciphertext, encryptor.tag)
David Reid78569d62014-01-07 15:42:17 -0800365
366 def decrypt(key, associated_data, iv, ciphertext, tag):
David Reidabb72d22014-01-07 16:06:18 -0800367 # Construct a Cipher object, with the key, iv, and additionally the
368 # GCM tag used for authenticating the message.
369 decryptor = Cipher(
David Reid78569d62014-01-07 15:42:17 -0800370 algorithms.AES(key),
371 modes.GCM(iv, tag),
372 backend=default_backend()
David Reidabb72d22014-01-07 16:06:18 -0800373 ).decryptor()
David Reid78569d62014-01-07 15:42:17 -0800374
David Reidabb72d22014-01-07 16:06:18 -0800375 # We put associated_data back in or the tag will fail to verify
376 # when we finalize the decryptor.
David Reid78569d62014-01-07 15:42:17 -0800377 decryptor.authenticate_additional_data(associated_data)
378
Paul Kehreraf0b9f52014-01-07 19:21:49 -0600379 # Decryption gets us the authenticated plaintext.
380 # If the tag does not match an InvalidTag exception will be raised.
381 return decryptor.update(ciphertext) + decryptor.finalize()
David Reidabb72d22014-01-07 16:06:18 -0800382
383 iv, ciphertext, tag = encrypt(
David Reid78569d62014-01-07 15:42:17 -0800384 key,
David Reidabb72d22014-01-07 16:06:18 -0800385 b"a secret message!",
David Reid78569d62014-01-07 15:42:17 -0800386 b"authenticated but not encrypted payload"
387 )
388
David Reidabb72d22014-01-07 16:06:18 -0800389 print(decrypt(
390 key,
391 b"authenticated but not encrypted payload",
392 iv,
393 ciphertext,
394 tag
395 ))
David Reid78569d62014-01-07 15:42:17 -0800396
397 .. testoutput::
398
David Reidabb72d22014-01-07 16:06:18 -0800399 a secret message!
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600400
Paul Kehrer13f108f2013-09-09 21:41:03 -0500401
Alex Stapletonc5fffd32014-03-18 15:29:00 +0000402Insecure modes
Paul Kehrer13f108f2013-09-09 21:41:03 -0500403--------------
404
Alex Gaynorcd413a32013-09-10 18:59:43 -0700405.. warning::
406
407 These modes are insecure. New applications should never make use of them,
408 and existing applications should strongly consider migrating away.
409
410
David Reid1f3d7182013-10-22 16:55:18 -0700411.. class:: ECB()
Paul Kehrer13f108f2013-09-09 21:41:03 -0500412
413 ECB (Electronic Code Book) is the simplest mode of operation for block
Alex Gaynorcd413a32013-09-10 18:59:43 -0700414 ciphers. Each block of data is encrypted in the same way. This means
415 identical plaintext blocks will always result in identical ciphertext
Alex Stapleton092351d2014-03-09 17:44:43 +0000416 blocks, which can leave `significant patterns in the output`_.
Alex Gaynorab5f0112013-11-08 10:34:00 -0800417
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600418 **Padding is required when using this mode.**
419
Paul Kehrerad6d1642014-01-07 19:10:12 -0600420Interfaces
421----------
422
423.. class:: CipherContext
424
425 When calling ``encryptor()`` or ``decryptor()`` on a ``Cipher`` object
Alex Gaynorb4818892014-02-06 10:58:50 -0800426 the result will conform to the ``CipherContext`` interface. You can then
427 call ``update(data)`` with data until you have fed everything into the
428 context. Once that is done call ``finalize()`` to finish the operation and
429 obtain the remainder of the data.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600430
Alex Stapleton092351d2014-03-09 17:44:43 +0000431 Block ciphers require that the plaintext or ciphertext always be a multiple
432 of their block size. Because of that **padding** is sometimes required to
433 make a message the correct size. ``CipherContext`` will not automatically
434 apply any padding; you'll need to add your own. For block ciphers the
435 recommended padding is
Alex Gaynord99fc652014-06-25 10:24:03 -0700436 :class:`~cryptography.hazmat.primitives.padding.PKCS7`. If you are using a
Alex Stapleton092351d2014-03-09 17:44:43 +0000437 stream cipher mode (such as
Alex Gaynord99fc652014-06-25 10:24:03 -0700438 :class:`~cryptography.hazmat.primitives.modes.CTR`) you don't have to worry
Paul Kehrerad6d1642014-01-07 19:10:12 -0600439 about this.
440
441 .. method:: update(data)
442
443 :param bytes data: The data you wish to pass into the context.
444 :return bytes: Returns the data that was encrypted or decrypted.
445 :raises cryptography.exceptions.AlreadyFinalized: See :meth:`finalize`
446
447 When the ``Cipher`` was constructed in a mode that turns it into a
448 stream cipher (e.g.
Alex Gaynord99fc652014-06-25 10:24:03 -0700449 :class:`~cryptography.hazmat.primitives.ciphers.modes.CTR`), this will
Alex Stapleton092351d2014-03-09 17:44:43 +0000450 return bytes immediately, however in other modes it will return chunks
Paul Kehrerad6d1642014-01-07 19:10:12 -0600451 whose size is determined by the cipher's block size.
452
453 .. method:: finalize()
454
455 :return bytes: Returns the remainder of the data.
456 :raises ValueError: This is raised when the data provided isn't
Alex Stapleton092351d2014-03-09 17:44:43 +0000457 a multiple of the algorithm's block size.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600458
459 Once ``finalize`` is called this object can no longer be used and
Alex Stapleton092351d2014-03-09 17:44:43 +0000460 :meth:`update` and :meth:`finalize` will raise an
461 :class:`~cryptography.exceptions.AlreadyFinalized` exception.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600462
463.. class:: AEADCipherContext
464
Alex Stapleton092351d2014-03-09 17:44:43 +0000465 When calling ``encryptor`` or ``decryptor`` on a ``Cipher`` object
Paul Kehrerad6d1642014-01-07 19:10:12 -0600466 with an AEAD mode (e.g.
Alex Gaynorb4818892014-02-06 10:58:50 -0800467 :class:`~cryptography.hazmat.primitives.ciphers.modes.GCM`) the result will
468 conform to the ``AEADCipherContext`` and ``CipherContext`` interfaces. If
469 it is an encryption context it will additionally be an
Alex Stapleton092351d2014-03-09 17:44:43 +0000470 ``AEADEncryptionContext`` provider. ``AEADCipherContext`` contains an
471 additional method :meth:`authenticate_additional_data` for adding
472 additional authenticated but unencrypted data (see note below). You should
473 call this before calls to ``update``. When you are done call `finalize``
474 to finish the operation.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600475
476 .. note::
477
478 In AEAD modes all data passed to ``update()`` will be both encrypted
479 and authenticated. Do not pass encrypted data to the
480 ``authenticate_additional_data()`` method. It is meant solely for
481 additional data you may want to authenticate but leave unencrypted.
482
483 .. method:: authenticate_additional_data(data)
484
485 :param bytes data: Any data you wish to authenticate but not encrypt.
486 :raises: :class:`~cryptography.exceptions.AlreadyFinalized`
487
488.. class:: AEADEncryptionContext
489
Alex Stapleton092351d2014-03-09 17:44:43 +0000490 When creating an encryption context using ``encryptor`` on a ``Cipher``
491 object with an AEAD mode such as
492 :class:`~cryptography.hazmat.primitives.ciphers.modes.GCM` an object
493 conforming to both the ``AEADEncryptionContext`` and ``AEADCipherContext``
494 interfaces will be returned. This interface provides one
495 additional attribute ``tag``. ``tag`` can only be obtained after
496 ``finalize`` has been called.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600497
498 .. attribute:: tag
499
500 :return bytes: Returns the tag value as bytes.
501 :raises: :class:`~cryptography.exceptions.NotYetFinalized` if called
Alex Gaynorfb843aa2014-02-25 11:37:36 -0800502 before the context is finalized.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600503
Alex Gaynorab5f0112013-11-08 10:34:00 -0800504
505.. _`described by Colin Percival`: http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html
Alex Stapleton092351d2014-03-09 17:44:43 +0000506.. _`recommends a 96-bit IV length`: http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf
Paul Kehrera7fbf072013-12-21 18:12:25 -0600507.. _`NIST SP-800-38D`: http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf
Paul Kehrerbab0e1a2014-02-09 10:51:59 -0600508.. _`Communications Security Establishment`: http://www.cse-cst.gc.ca
Alex Stapleton092351d2014-03-09 17:44:43 +0000509.. _`encrypt`: https://ssd.eff.org/tech/encryption
510.. _`CRYPTREC`: http://www.cryptrec.go.jp/english/
511.. _`significant patterns in the output`: http://en.wikipedia.org/wiki/Cipher_block_chaining#Electronic_codebook_.28ECB.29
Paul Kehrere5dc1222014-02-20 16:19:32 -0600512.. _`International Data Encryption Algorithm`: https://en.wikipedia.org/wiki/International_Data_Encryption_Algorithm
513.. _`OpenPGP`: http://www.openpgp.org