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:
@@ -4,3 +4,4 @@ version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
anyhow = { workspace = true }
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user