@@ -78,14 +78,10 @@ fn pre_transform(data: &[u8], key: &[u8; 16]) -> Vec<u8> {
7878 result. push ( byte ^ key[ i % 16 ] ) ;
7979 }
8080
81- // 字节重排(简单的置换)
82- let mut permuted = vec ! [ 0u8 ; result. len( ) ] ;
83- for ( i, & byte) in result. iter ( ) . enumerate ( ) {
84- let new_pos = ( i. wrapping_mul ( 7 ) . wrapping_add ( 13 ) ) % result. len ( ) ;
85- permuted[ new_pos] = byte;
86- }
87-
88- permuted
81+ result. reverse ( ) ;
82+ let shift = transform_shift ( result. len ( ) , key) ;
83+ result. rotate_left ( shift) ;
84+ result
8985}
9086
9187/// 数据预变换的逆操作
@@ -94,12 +90,10 @@ fn pre_transform_reverse(data: &[u8], key: &[u8; 16]) -> Vec<u8> {
9490 return Vec :: new ( ) ;
9591 }
9692
97- // 逆置换:对于每个原始位置 i,找到它在加密后的位置
98- let mut unpermuted = vec ! [ 0u8 ; data. len( ) ] ;
99- for i in 0 ..data. len ( ) {
100- let encrypted_pos = ( i. wrapping_mul ( 7 ) . wrapping_add ( 13 ) ) % data. len ( ) ;
101- unpermuted[ i] = data[ encrypted_pos] ;
102- }
93+ let mut unpermuted = data. to_vec ( ) ;
94+ let shift = transform_shift ( unpermuted. len ( ) , key) ;
95+ unpermuted. rotate_right ( shift) ;
96+ unpermuted. reverse ( ) ;
10397
10498 // 逆 XOR
10599 let mut result = Vec :: with_capacity ( unpermuted. len ( ) ) ;
@@ -243,3 +237,44 @@ fn post_transform(data: &[u8], key: &[u8; 16]) -> Vec<u8> {
243237fn post_transform_reverse ( data : & [ u8 ] , key : & [ u8 ; 16 ] ) -> Vec < u8 > {
244238 data. iter ( ) . enumerate ( ) . map ( |( i, & b) | b. wrapping_sub ( key[ i % 16 ] ) ) . collect ( )
245239}
240+
241+ fn transform_shift ( len : usize , key : & [ u8 ; 16 ] ) -> usize {
242+ if len <= 1 {
243+ return 0 ;
244+ }
245+
246+ let seed = key
247+ . iter ( )
248+ . take ( 4 )
249+ . fold ( 0usize , |acc, byte| ( acc << 8 ) | ( * byte as usize ) ) ;
250+ ( seed. wrapping_add ( len) . wrapping_add ( 13 ) ) % len
251+ }
252+
253+ #[ cfg( test) ]
254+ mod tests {
255+ use super :: { decrypt, encrypt} ;
256+
257+ #[ test]
258+ fn roundtrip_preserves_all_lengths_up_to_1024 ( ) {
259+ for len in 0 ..=1024usize {
260+ let input = ( 0 ..len)
261+ . map ( |index| ( ( index * 31 + 17 ) % 256 ) as u8 )
262+ . collect :: < Vec < _ > > ( ) ;
263+ let encrypted = encrypt ( & input) . expect ( "encrypt should succeed" ) ;
264+ let decrypted = decrypt ( & encrypted) . expect ( "decrypt should succeed" ) ;
265+ assert_eq ! ( decrypted, input, "roundtrip mismatch for len={len}" ) ;
266+ }
267+ }
268+
269+ #[ test]
270+ fn roundtrip_preserves_lengths_that_are_multiples_of_seven ( ) {
271+ for len in [ 7usize , 14 , 497 , 504 , 4095 , 4096 , 4097 ] {
272+ let input = ( 0 ..len)
273+ . map ( |index| ( ( index * 13 + 29 ) % 256 ) as u8 )
274+ . collect :: < Vec < _ > > ( ) ;
275+ let encrypted = encrypt ( & input) . expect ( "encrypt should succeed" ) ;
276+ let decrypted = decrypt ( & encrypted) . expect ( "decrypt should succeed" ) ;
277+ assert_eq ! ( decrypted, input, "roundtrip mismatch for len={len}" ) ;
278+ }
279+ }
280+ }
0 commit comments