chore: update dependency
This commit is contained in:
49
CLAUDE.md
Normal file
49
CLAUDE.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# CLAUDE.md
|
||||||
|
|
||||||
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||||
|
|
||||||
|
## Project Overview
|
||||||
|
|
||||||
|
This is a Rust implementation of the Cryptopal challenges - a collection of cryptography exercises. The codebase follows a workspace structure with individual problem solutions and shared utilities.
|
||||||
|
|
||||||
|
## Workspace Structure
|
||||||
|
|
||||||
|
- **Root workspace**: Defined in `Cargo.toml` with `edition = "2024"`
|
||||||
|
- **Individual problems**: Located in `problems/p1/`, `problems/p2/`, etc. Each has its own `Cargo.toml` and `src/main.rs`
|
||||||
|
- **Common utilities**: Located in `common/` crate with shared cryptographic functions like `is_valid_english()` and `xor_with_key()`
|
||||||
|
- **Documentation**: `cryptopal_book/` contains mdBook documentation for each challenge
|
||||||
|
|
||||||
|
## Key Commands
|
||||||
|
|
||||||
|
### Building and Running
|
||||||
|
- `cargo build` - Build the entire workspace
|
||||||
|
- `cargo run -p p1` - Run a specific problem (e.g., problem 1)
|
||||||
|
- `cargo build -p p1` - Build a specific problem
|
||||||
|
- `cargo test` - Run tests across the workspace
|
||||||
|
- `cargo check` - Quick syntax check without full compilation
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
- `mdbook build cryptopal_book/` - Build the challenge documentation
|
||||||
|
- `mdbook serve cryptopal_book/` - Serve documentation locally
|
||||||
|
|
||||||
|
## Architecture Notes
|
||||||
|
|
||||||
|
- Each problem is isolated in its own binary crate under `problems/`
|
||||||
|
- Common cryptographic utilities are shared via the `common` crate
|
||||||
|
- Problems use dependencies like `hex`, `base64`, and `anyhow` for encoding/error handling
|
||||||
|
- Code includes Chinese comments for educational purposes
|
||||||
|
- The `common` crate provides utilities for English text validation and XOR operations
|
||||||
|
|
||||||
|
## Dependencies Pattern
|
||||||
|
|
||||||
|
Individual problems typically use:
|
||||||
|
- `hex` for hexadecimal encoding/decoding
|
||||||
|
- `base64` for Base64 operations
|
||||||
|
- `anyhow` for error handling (via common crate)
|
||||||
|
- Local `common` crate for shared utilities
|
||||||
|
|
||||||
|
## Development Notes
|
||||||
|
|
||||||
|
- Each challenge solution should be self-contained in its respective `problems/pN/` directory
|
||||||
|
- Use the `common` crate for shared cryptographic functions
|
||||||
|
- Follow the existing pattern of having a simple `main.rs` that demonstrates the solution
|
||||||
37
Cargo.lock
generated
37
Cargo.lock
generated
@@ -215,6 +215,12 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "p19"
|
name = "p19"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"anyhow",
|
||||||
|
"base64",
|
||||||
|
"common",
|
||||||
|
"rayon",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "p2"
|
name = "p2"
|
||||||
@@ -223,6 +229,37 @@ dependencies = [
|
|||||||
"hex",
|
"hex",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "p20"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "p21"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "p22"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"common",
|
||||||
|
"rand 0.9.2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "p23"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"rand 0.9.2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "p24"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "p28"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "p3"
|
name = "p3"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|||||||
@@ -502,3 +502,47 @@ pub fn aes_ctr_enc(input: &[u8], key: &[u8; 16], nonce: u64) -> Result<Vec<u8>>
|
|||||||
pub fn aes_ctr_dec(input: &[u8], key: &[u8; 16], nonce: u64) -> Result<Vec<u8>> {
|
pub fn aes_ctr_dec(input: &[u8], key: &[u8; 16], nonce: u64) -> Result<Vec<u8>> {
|
||||||
aes_ctr_enc(input, key, nonce)
|
aes_ctr_enc(input, key, nonce)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct MT19937 {
|
||||||
|
mt: [u32; 624],
|
||||||
|
index: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MT19937 {
|
||||||
|
pub fn new(seed: u32) -> Self {
|
||||||
|
let mut mt = [0; 624];
|
||||||
|
mt[0] = seed;
|
||||||
|
for i in 1..624 {
|
||||||
|
mt[i] = 0x6c078965u32
|
||||||
|
.wrapping_mul(mt[i - 1] ^ (mt[i - 1] >> 30))
|
||||||
|
.wrapping_add(i as u32)
|
||||||
|
}
|
||||||
|
let index = 0;
|
||||||
|
MT19937 { mt, index }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn extract_number(&mut self) -> u32 {
|
||||||
|
if self.index == 0 {
|
||||||
|
self.generate_numbers();
|
||||||
|
}
|
||||||
|
let mut result = self.mt[self.index];
|
||||||
|
|
||||||
|
result ^= result >> 11;
|
||||||
|
result ^= (result << 7) & 0x9d2c5680;
|
||||||
|
result ^= (result << 15) & 0xefc60000;
|
||||||
|
result ^= result >> 18;
|
||||||
|
self.index = (self.index + 1) % 624;
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate_numbers(&mut self) {
|
||||||
|
for i in 0..624 {
|
||||||
|
let y: u32 = (self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff);
|
||||||
|
self.mt[i] = self.mt[(i + 397) % 624] ^ (y >> 1);
|
||||||
|
if y % 2 != 0 {
|
||||||
|
self.mt[i] ^= 0x9908b0df;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user