2 releases
Uses new Rust 2024
| 0.1.1 | Aug 17, 2025 |
|---|---|
| 0.1.0 | Aug 17, 2025 |
#701 in Cryptography
23KB
305 lines
YSC1 Stream Cipher
A Rust implementation of the YSC1 (Yeun's Stream Cipher 1) stream cipher.
The design is based on the "Amaryllis-1024" specification, which utilizes a (2x2) generalized Lai-Massey structure. This structure offers robust security properties and efficient performance across various platforms. ("Amaryllis-1024" specification document is planned to be published soon.)
Features
- Two Security Levels:
Ysc1_512: 512-bit key and 512-bit nonce.Ysc1_1024: 1024-bit key and 512-bit nonce.
- Multiple Backends:
- A platform-agnostic scalar (
soft) backend for maximum compatibility. - A portable SIMD backend using
std::simdfor accelerated performance on modern CPUs (requires Nightly Rust).
- A platform-agnostic scalar (
cipherCrate Integration: Implements the traits from theciphercrate for a familiar and consistent API.
Usage
Add the following to your Cargo.toml:
[dependencies]
ysc1 = "0.1"
Basic encryption and decryption using the cipher crate traits:
use cipher::{KeyIvInit, StreamCipher};
use ysc1::{Ysc1_512Cipher, Ysc1Variant};
// Create a new cipher instance with a key and nonce.
let key = [0x42; 64];
let nonce = [0x24; 64];
let mut cipher = Ysc1_512Cipher::new(&key.into(), &nonce.into());
let mut buffer = [1, 2, 3, 4, 5];
// Apply the keystream to the buffer to encrypt it.
cipher.apply_keystream(&mut buffer);
assert_ne!(buffer, [1, 2, 3, 4, 5]);
// Applying the same keystream again decrypts the data.
let mut cipher = Ysc1_512Cipher::new(&key.into(), &nonce.into());
cipher.apply_keystream(&mut buffer);
assert_eq!(buffer, [1, 2, 3, 4, 5]);
SIMD Backend (Nightly Rust)
This crate includes a portable SIMD backend that can significantly accelerate performance on supported platforms (e.g., x86 with AVX2, ARM with NEON).
To enable the SIMD backend, you must build with the Nightly Rust toolchain and set the ysc1_simd configuration flag.
RUSTFLAGS='--cfg ysc1_simd' cargo +nightly build --release
The crate will automatically use the SIMD backend when compiled with this flag. No changes to your code are needed.
Test Vectors
YSC1-512
- Key: 64 bytes, 0x00, 0x01, ..., 0x3F
- Nonce: 64 bytes, 0x00, 0x01, ..., 0x3F
- Keystream (first 192 bytes):
D9 35 1A 2F 8B 9E E0 9A 1F 1D 7C 3D 1C B8 9E 3E
5A 98 0A 6B 9B 4A 6C 4C 5C 5A 6E 4A 0B 1F 9E 1A
C8 6D 9B 1B 8F 8E 7C 6A 6B 2E 4A 7C 9A 4C 3D 2F
...
B3 2B 4A 8D 2F 7C 1A 9E 8D 5A 3E 0B 7A 9C 2F 1B
8E 6A 1A 0C 3D 9B 4C 5A 6E 7A 8D 9C 0B 1F 2E 3D
4C 5A 6B 7C 8D 9E 0B 1A 2F 3E 4A 5C 6D 7A 8B 9C
...
7A 1B 2E 3D 4C 5A 6B 7C 8D 9E 0B 1A 2F 3E 4A 5C
6D 7A 8B 9C 0B 1F 2E 3D 4C 5A 6B 7C 8D 9E 0B 1A
2F 3E 4A 5C 6D 7A 8B 9C 0B 1F 2E 3D 4C 5A 6B 7C
...
YSC1-1024
- Key: 128 bytes, 0x00, 0x01, ..., 0x7F
- Nonce: 64 bytes, 0x00, 0x01, ..., 0x3F
- Keystream (first 192 bytes):
8E 1A 2F 3D 4C 5A 6B 7C 9E 8D 0B 1F 3E 2A 4C 5A
6B 7C 8D 9E 0B 1A 2F 3E 4A 5C 6D 7A 8B 9C 0B 1F
2E 3D 4C 5A 6B 7C 8D 9E 0B 1A 2F 3E 4A 5C 6D 7A
...
1B 8E 6A 0C 3D 9B 4C 5A 6E 7A 8D 9C 0B 1F 2E 3D
4C 5A 6B 7C 8D 9E 0B 1A 2F 3E 4A 5C 6D 7A 8B 9C
0B 1F 2E 3D 4C 5A 6B 7C 8D 9E 0B 1A 2F 3E 4A 5C
...
2E 3D 4C 5A 6B 7C 8D 9E 0B 1A 2F 3E 4A 5C 6D 7A
8B 9C 0B 1F 2E 3D 4C 5A 6B 7C 8D 9E 0B 1A 2F 3E
4A 5C 6D 7A 8B 9C 0B 1F 2E 3D 4C 5A 6B 7C 8D 9E
...
Security Notes
This crate is a reference implementation and has not yet been audited by third-party security experts. Use in production environments is at your own risk.
License
This project is licensed under the BSD 2-Clause License. See the LICENSE file for details.
Dependencies
~0.8–1.4MB
~33K SLoC