# Keycodes Overview When defining a [keymap](keymap.md) each key needs a valid key definition. This page documents the symbols that correspond to keycodes that are available to you in QMK. This is a reference only. Each group of keys links to the page documenting their functionality in more detail. ## [Basic Keycodes](keycodes_basic.md) |Key |Aliases |Description | |-----------------------|------------------------------|-----------------------------------------------| |`KC_NO` |`XXXXXXX` |Ignore this key (NOOP) | |`KC_TRANSPARENT` |`KC_TRNS`, `_______` |Use the next lowest non-transparent key | |`KC_A` | |`a` and `A` | |`KC_B` | |`b` and `B` | |`KC_C` | |`c` and `C` | |`KC_D` | |`d` and `D` | |`KC_E` | |`e` and `E` | |`KC_F` | |`f` and `F` | |`KC_G` | |`g` and `G` | |`KC_H` | |`h` and `H` | |`KC_I` | |`i` and `I` | |`KC_J` | |`j` and `J` | |`KC_K` | |`k` and `K` | |`KC_L` | |`l` and `L` | |`KC_M` | |`m` and `M` | |`KC_N` | |`n` and `N` | |`KC_O` | |`o` and `O` | |`KC_P` | |`p` and `P` | |`KC_Q` | |`q` and `Q` | |`KC_R` | |`r` and `R` | |`KC_S` | |`s` and `S` | |`KC_T` | |`t` and `T` | |`KC_U` | |`u` and `U` | |`KC_V` | |`v` and `V` | |`KC_W` | |`w` and `W` | |`KC_X` | |`x` and `X` | |`KC_Y` | |`y` and `Y` | |`KC_Z` | |`z` and `Z` | |`KC_1` | |`1` and `!` | |`KC_2` | |`2` and `@` | |`KC_3` | |`3` and `#` | |`KC_4` | |
Random number generation
========================
When generating random data for use in cryptographic operations, such as an
initialization vector for encryption in
:class:`~cryptography.hazmat.primitives.ciphers.modes.CBC` mode, you do not
want to use the standard :mod:`random` module APIs. This is because they do not
provide a cryptographically secure random number generator, which can result in
major security issues depending on the algorithms in use.
Therefore, it is our recommendation to `always use your operating system's
provided random number generator`_, which is available as ``os.urandom()``. For
example, if you need 16 bytes of random data for an initialization vector, you
can obtain them with:
.. doctest::
>>> import os
>>> iv = os.urandom(16)
.. _`always use your operating system's provided random number generator`: http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers/