11use crate :: structuri:: * ;
22
33
4- pub fn cripteaza_studenti ( _secretariat : & mut Secretariat , _key : & str , _iv : & str , _cale_output : & str ) {
5- todo ! ( "" ) ;
4+ const NR_BLOCKS : usize = 4 ;
5+
6+ fn xor ( block : & [ u8 ] , key : & [ u8 ] ) -> Vec < u8 > {
7+ block
8+ . iter ( )
9+ . zip ( key. iter ( ) . cycle ( ) ) // repeta cheia daca e mai scurta
10+ . map ( |( & b, & k) | b ^ k)
11+ . collect ( )
12+
13+ }
14+
15+ fn p_box ( block : & [ u8 ] ) -> Vec < u8 > {
16+ let block_len: usize = block. len ( ) ;
17+ let mut array: Vec < u8 > = vec ! [ 0 ; block_len] ;
18+
19+
20+ for i in 0 ..block. len ( ) {
21+ let j: usize =
22+ ( i * ( block_len - 1 ) + 2 ) % block_len;
23+ array[ j] = block[ i] ;
24+ }
25+
26+ array
27+ }
28+
29+
30+ fn split_into_blocks ( secretariat : & Secretariat ) -> Vec < Vec < u8 > > {
31+ let mut bytes_studenti: Vec < u8 > = Vec :: new ( ) ;
32+
33+ for student in secretariat. studenti . iter ( ) {
34+ // id
35+ bytes_studenti. extend_from_slice ( & student. id . to_be_bytes ( ) ) ;
36+
37+ // an_studiu
38+ bytes_studenti. extend_from_slice ( & student. an_studiu . to_be_bytes ( ) ) ;
39+
40+ // statut (char -> u32 -> bytes)
41+ bytes_studenti. extend_from_slice ( & ( student. statut as u32 ) . to_be_bytes ( ) ) ;
42+
43+ // medie_generala
44+ bytes_studenti. extend_from_slice ( & student. medie_generala . to_be_bytes ( ) ) ;
45+
46+ // nume (trebuie serializat separat ca string)
47+ bytes_studenti. extend_from_slice ( student. nume . as_bytes ( ) ) ;
48+ }
49+
50+ // Adaugare padding (daca este cazul):
51+ while bytes_studenti. len ( ) % 4 != 0 {
52+ bytes_studenti. push ( 0 as u8 ) ;
53+ }
54+
55+
56+ // Impartire in blocuri de aceasi dimensiune
57+ let mut blocks: Vec < Vec < u8 > > = Vec :: new ( ) ;
58+ let block_length: usize = bytes_studenti. len ( ) / NR_BLOCKS ;
59+ for i in 0 ..NR_BLOCKS {
60+ let start = i * block_length;
61+ let end = start + block_length;
62+ blocks. push ( bytes_studenti[ start..end] . to_vec ( ) ) ;
63+ }
64+
65+ blocks
66+ }
67+
68+
69+ pub fn cripteaza_studenti ( secretariat : & Secretariat , key : & str , iv : & str , _cale_output : & str ) {
70+ let mut blocks: Vec < Vec < u8 > > = split_into_blocks ( secretariat) ;
71+
72+ let bytes_key: Vec < u8 > = key. as_bytes ( ) . to_vec ( ) ;
73+ let bytes_iv: Vec < u8 > = iv. as_bytes ( ) . to_vec ( ) ;
74+
75+ blocks[ 0 ] = xor ( & blocks[ 0 ] , & bytes_iv) ;
76+ blocks[ 0 ] = xor ( & blocks[ 0 ] , & bytes_key) ;
77+ blocks[ 0 ] = p_box ( & blocks[ 0 ] ) ;
78+
79+ for i in 1 ..NR_BLOCKS {
80+ blocks[ i] = xor ( & blocks[ i] , & blocks[ i - 1 ] ) ;
81+ blocks[ i] = xor ( & blocks[ i] , & bytes_key) ;
82+ blocks[ i] = p_box ( & blocks[ i] ) ;
83+ }
684}
0 commit comments