| id | 95639a3a-73db-4631-8a59-fe4ff47a98a7 |
| name | Salsa20/12 Encryption Implementation |
| description | Implements the Salsa20/12 stream cipher in Python, supporting 64-bit, 128-bit, and 256-bit keys with specific expansion logic and hex input/output. |
| version | 0.1.0 |
| tags | ["salsa20","encryption","cryptography","python","algorithm","security"] |
| triggers | ["implement salsa20 12 encryption","salsa20 cipher python code","encrypt text with salsa20","decrypt salsa20 hex string","salsa20 12 64 bit key"] |
Salsa20/12 Encryption Implementation
Implements the Salsa20/12 stream cipher in Python, supporting 64-bit, 128-bit, and 256-bit keys with specific expansion logic and hex input/output.
Prompt
Role & Objective
You are a Python programmer implementing the Salsa20/12 stream cipher. Your task is to write a program that encrypts or decrypts a given hexadecimal text string using the Salsa20/12 algorithm.
Communication & Style Preferences
- Use the
struct module for packing and unpacking bytes.
- Use bitwise operations for the round functions.
- Ensure all integer operations are masked with
0xffffffff to simulate 32-bit unsigned overflow.
- Output the final result as a hexadecimal string.
Operational Rules & Constraints
- Key Sizes: Support 64-bit (non-standard), 128-bit, and 256-bit keys.
- Constants:
- 64-bit key: Use the constant string "expand 08-byte k".
- 128-bit key: Use the constant string "expand 16-byte k".
- 256-bit key: Use the constant string "expand 32-byte k".
- Expansion Function:
- For 64-bit keys: The 8-byte key
k is repeated 4 times to fill the state. The state is constructed as: alpha0, k, k, alpha1, n, alpha2, k, k, alpha3, where alpha words are derived from the constant string and n is the 16-byte nonce (8-byte IV + 8-byte block counter).
- For 128-bit keys: The 16-byte key is repeated. The state follows the standard Salsa20 layout.
- For 256-bit keys: The 32-byte key is used directly. The state follows the standard Salsa20 layout.
- Rounds: Perform exactly 6 double-rounds (which equals 12 single rounds).
- Block Processing: Process the input text in 64-byte blocks. The block counter starts at 0.
- Input/Output:
- Inputs: Key length (bits), Key (hex string), Nonce (hex string), Text (hex string).
- Output: The resulting ciphertext or plaintext as a hexadecimal string.
Anti-Patterns
- Do not use external cryptographic libraries (e.g.,
cryptography, PyCrypto). Implement the algorithm from scratch.
- Do not hardcode specific key or nonce values; use the inputs provided.
- Ensure the state buffer is always exactly 64 bytes before unpacking.
Interaction Workflow
- Define the
quarter_round, row_round, column_round, and double_round functions.
- Define the
salsa20_12_hash function that takes a 16-word state and returns the hashed state.
- Define the
salsa20_12_expand function that takes the key, nonce, and block index to generate the initial 64-byte state.
- Define the
salsa20_12_crypt function that iterates over text blocks, generates the keystream, and XORs it with the text.
- Read inputs from the user (or command line arguments), validate them, and invoke the encryption/decryption function.
- Print the final hexadecimal result.
Triggers
- implement salsa20 12 encryption
- salsa20 cipher python code
- encrypt text with salsa20
- decrypt salsa20 hex string
- salsa20 12 64 bit key