1
0

feat: 实现多个挑战并改进测试

- 重写p1实现纯Rust的hex到base64转换
- 完成p13 ECB剪切粘贴攻击和破解脚本
- 实现p33 Diffie-Hellman密钥交换算法
- 修复p9的PKCS#7测试用例
- 在common库添加gen_random_key和pkcs7_unpadding函数
- 更新workspace依赖管理
This commit is contained in:
2025-08-01 16:00:16 +08:00
parent 23d016407c
commit e400b87e9f
17 changed files with 664 additions and 68 deletions

View File

@@ -4,3 +4,4 @@ version = "0.1.0"
edition = "2024"
[dependencies]
anyhow = { workspace = true }

View File

@@ -1,3 +1,6 @@
use anyhow::{Result, anyhow};
use core::panic;
fn pkcs7_padding(data: &mut Vec<u8>, block_size: usize) {
if block_size == 0 {
panic!("Block size must be greater than zero");
@@ -12,6 +15,22 @@ fn pkcs7_padding(data: &mut Vec<u8>, block_size: usize) {
data.extend(vec![padding_length as u8; padding_length]);
}
fn pkcs7_unpadding(input: &[u8]) -> Result<Vec<u8>> {
if input.is_empty() {
return Err(anyhow!("Input cannot be empty"));
}
let padding_length = *input.last().unwrap();
if padding_length == 0 || padding_length > input.len() as u8 {
return Err(anyhow!("Invalid PKCS#7 padding"));
}
for &byte in input.iter().rev().take(padding_length as usize) {
if byte != padding_length {
return Err(anyhow!("Invalid PKCS#7 padding"));
}
}
Ok(input[..input.len() - padding_length as usize].to_vec())
}
fn main() {
let mut plain_text = b"YELLOW SUBMARINE".to_vec();
pkcs7_padding(&mut plain_text, 20);
@@ -76,4 +95,43 @@ mod tests {
assert_eq!(data.len(), 255);
assert_eq!(&data[1..], vec![254; 254]);
}
#[test]
fn test_pkcs7_unpadding_valid() {
let result = pkcs7_unpadding(&[65, 66, 67, 4, 4, 4, 4]).unwrap();
assert_eq!(result, vec![65, 66, 67]);
}
#[test]
fn test_pkcs7_unpadding_single_byte() {
let result = pkcs7_unpadding(&[65, 66, 67, 68, 69, 70, 1]).unwrap();
assert_eq!(result, vec![65, 66, 67, 68, 69, 70]);
}
#[test]
fn test_pkcs7_unpadding_full_padding_block() {
let result = pkcs7_unpadding(&[8, 8, 8, 8, 8, 8, 8, 8]).unwrap();
assert_eq!(result, vec![]);
}
#[test]
fn test_pkcs7_unpadding_invalid_padding_byte_zero() {
assert!(pkcs7_unpadding(&[65, 66, 67, 0]).is_err());
}
#[test]
fn test_pkcs7_unpadding_invalid_padding_too_large() {
assert!(pkcs7_unpadding(&[65, 66, 67, 5]).is_err());
}
#[test]
fn test_pkcs7_unpadding_inconsistent_padding() {
assert!(pkcs7_unpadding(&[65, 66, 67, 3, 3, 2]).is_err());
}
#[test]
#[should_panic(expected = "Input cannot be empty")]
fn test_pkcs7_unpadding_empty_data() {
pkcs7_unpadding(&[]).unwrap();
}
}