-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathencryption.rs
More file actions
296 lines (271 loc) · 12.7 KB
/
encryption.rs
File metadata and controls
296 lines (271 loc) · 12.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
use crypto::aes::{AesDecrypt, AesEncrypt};
use crypto::base64::{FromBase64, ToBase64};
use crypto::bytes::Bytes;
use crypto::des::{DesDecrypt, DesEncrypt, TripleDesDecrypt, TripleDesEncrypt};
use crypto::hex::{FromHex, ToHex};
use crypto::mode::{Cbc, Cfb, Ctr, Ecb, Gcm, Ofb};
use crypto::padding::{NoPadding, Pkcs7Padding, ZeroPadding};
use crypto::rc4::Rc4;
use crypto::recipe::Recipe;
use crypto::sm4::{Sm4Decrypt, Sm4Encrypt};
use crypto::tea::{XxteaDecrypt, XxteaEncrypt};
use crypto::types::Result;
fn main() -> Result<()> {
// RC4
println!("---- ---- RC4 ---- ----");
let rc4_input = Bytes::new(b"Hello".as_ref());
//let rc4_op = RC4::default();
let rc4_op = Rc4::new(&Bytes::new("CRYPTO".as_bytes()));
//println!("{:?}", rc4_op);
let recipe1 = Recipe::new(vec![Box::new(rc4_op)]);
let rc4_output1 = recipe1.bake(&rc4_input)?;
println!("{:?}", rc4_output1);
let rc4_output2 = recipe1.bake(&rc4_output1)?;
println!("{}", rc4_output2);
println!("---- ---- ---- ---- ----");
println!();
// DES
println!("---- ---- DES ---- ----");
let des_input = Bytes::new(b"Hello, World!Hello, World!Hello, World!".as_ref());
let des_ecb_key = Bytes::new("12345678".as_bytes());
let des_ecb_encrypt = DesEncrypt::<Ecb, ZeroPadding>::new(&des_ecb_key, Ecb);
let recipe2 = Recipe::new(vec![
Box::new(des_ecb_encrypt),
Box::new(ToBase64::default()),
]);
let des_ecb_encrypt_result = recipe2.bake(&des_input)?;
println!("{}", des_ecb_encrypt_result);
let des_ecb_decrypt = DesDecrypt::<Ecb, ZeroPadding>::new(&des_ecb_key, Ecb);
let recipe3 = Recipe::new(vec![
Box::new(FromBase64::default()),
Box::new(des_ecb_decrypt),
]);
let des_ecb_decrypt_result = recipe3.bake(&des_ecb_encrypt_result)?;
println!("{}", des_ecb_decrypt_result);
let des_cfb_iv = Bytes::new("87654321".as_bytes());
let des_cfb_encrypt = DesEncrypt::<_, NoPadding>::new(&des_ecb_key, Cfb::new(&des_cfb_iv));
let recipe_cfbencrypt =
Recipe::new(vec![Box::new(des_cfb_encrypt), Box::new(ToHex::default())]);
let des_cfb_encrypt_result = recipe_cfbencrypt.bake(&des_input)?;
println!("{}", des_cfb_encrypt_result);
let des_cfb_decrypt = DesDecrypt::<_, NoPadding>::new(&des_ecb_key, Cfb::new(&des_cfb_iv));
let recipe_cfbdecrypt = Recipe::new(vec![
Box::new(FromHex::default()),
Box::new(des_cfb_decrypt),
]);
let des_cfb_decrypt_result = recipe_cfbdecrypt.bake(&des_cfb_encrypt_result)?;
println!("{}", des_cfb_decrypt_result);
let des_cbc_key = Bytes::new("321".as_bytes());
let des_cbc_iv = Bytes::new("123".as_bytes());
let des_cbc_encrypt = DesEncrypt::<_, Pkcs7Padding>::new(&des_cbc_key, Cbc::new(&des_cbc_iv));
let recipe4 = Recipe::new(vec![
Box::new(des_cbc_encrypt),
Box::new(ToBase64::default()),
]);
let des_cbc_encrypt_result = recipe4.bake(&des_input)?;
println!("{}", des_cbc_encrypt_result);
let des_cbc_decrypt = DesDecrypt::<_, Pkcs7Padding>::new(&des_cbc_key, Cbc::new(&des_cbc_iv));
let recipe5 = Recipe::new(vec![
Box::new(FromBase64::default()),
Box::new(des_cbc_decrypt),
]);
let des_cbc_decrypt_result = recipe5.bake(&des_cbc_encrypt_result)?;
println!("{}", des_cbc_decrypt_result);
let triple_des_key = Bytes::new("1234567887654321".as_bytes());
let triple_des_iv = Bytes::new("00009999".as_bytes());
let triple_des_encrypt =
TripleDesEncrypt::<_, Pkcs7Padding>::new(&triple_des_key, Cbc::new(&triple_des_iv));
let recipe6 = Recipe::new(vec![
Box::new(triple_des_encrypt),
Box::new(ToBase64::default()),
]);
let triple_des_encrypt_result = recipe6.bake(&des_input)?;
println!("{}", triple_des_encrypt_result);
let triple_des_decrypt =
TripleDesDecrypt::<_, Pkcs7Padding>::new(&triple_des_key, Cbc::new(&triple_des_iv));
let recipe7 = Recipe::new(vec![
Box::new(FromBase64::default()),
Box::new(triple_des_decrypt),
]);
let triple_des_decrypt_result = recipe7.bake(&triple_des_encrypt_result)?;
println!("{}", triple_des_decrypt_result);
let triple_des_ofb_encrypt =
TripleDesEncrypt::<_, NoPadding>::new(&triple_des_key, Ofb::new(&triple_des_iv));
let recipe_ofb_3des_encrypt = Recipe::new(vec![
Box::new(triple_des_ofb_encrypt),
Box::new(ToHex::default()),
]);
let triple_des_ofb_encrypt_result = recipe_ofb_3des_encrypt.bake(&des_input)?;
println!("{}", triple_des_ofb_encrypt_result);
let triple_des_ofb_decrypt =
TripleDesDecrypt::<_, NoPadding>::new(&triple_des_key, Ofb::new(&triple_des_iv));
let recipe_ofb_3des_decrypt = Recipe::new(vec![
Box::new(FromHex::default()),
Box::new(triple_des_ofb_decrypt),
]);
let triple_des_ofb_decrypt_result =
recipe_ofb_3des_decrypt.bake(&triple_des_ofb_encrypt_result)?;
println!("{}", triple_des_ofb_decrypt_result);
let triple_des_ctr_encrypt =
TripleDesEncrypt::<_, NoPadding>::new(&triple_des_key, Ctr::new(&triple_des_iv));
let recipe_ctr_3des_encrypt = Recipe::new(vec![
Box::new(triple_des_ctr_encrypt),
Box::new(ToHex::default()),
]);
let triple_des_ctr_encrypt_result = recipe_ctr_3des_encrypt.bake(&des_input)?;
println!("{}", triple_des_ctr_encrypt_result);
let triple_des_ctr_decrypt =
TripleDesDecrypt::<_, NoPadding>::new(&triple_des_key, Ctr::new(&triple_des_iv));
let recipe_ctr_3des_decrypt = Recipe::new(vec![
Box::new(FromHex::default()),
Box::new(triple_des_ctr_decrypt),
]);
let triple_des_ctr_decrypt_result =
recipe_ctr_3des_decrypt.bake(&triple_des_ctr_encrypt_result)?;
println!("{}", triple_des_ctr_decrypt_result);
println!("---- ---- ---- ---- ----");
println!();
// AES
println!("---- ---- AES ---- ----");
let aes_input = Bytes::new(
"FooBar Lorem ipsum dolor sit amet ex cupidatat culpa ullamco et eiusmod eu".as_bytes(),
);
let aes_key = Bytes::new("01234567890123456789".as_bytes());
let aes_iv = Bytes::new("01234567".as_bytes());
let aes_op = AesEncrypt::<_, Pkcs7Padding>::new(&aes_key, Cbc::new(&aes_iv));
let recipe8 = Recipe::new(vec![Box::new(aes_op), Box::new(ToBase64::default())]);
let aes_output = recipe8.bake(&aes_input)?;
println!("{}", aes_output);
let aes_decrypt = AesDecrypt::<_, Pkcs7Padding>::new(&aes_key, Cbc::new(&aes_iv));
let recipe9 = Recipe::new(vec![Box::new(FromBase64::default()), Box::new(aes_decrypt)]);
let aes_decrypt_result = recipe9.bake(&aes_output)?;
println!("{}", aes_decrypt_result);
let aes_cfb_key = Bytes::new("FooBar Lorem ipsum dolor sit ame".as_bytes());
let aes_cfb_iv = Bytes::new("co et eiusmod eu".as_bytes());
let aes_cfb_encrypt = AesEncrypt::<_, NoPadding>::new(&aes_cfb_key, Cfb::new(&aes_cfb_iv));
let recipe_cfb_aes = Recipe::new(vec![Box::new(aes_cfb_encrypt), Box::new(ToHex::default())]);
let aes_cfb_output = recipe_cfb_aes.bake(&aes_input)?;
println!("{}", aes_cfb_output);
let aes_cfb_decrypt = AesDecrypt::<_, NoPadding>::new(&aes_cfb_key, Cfb::new(&aes_cfb_iv));
let recipe_cfb_aes_decrypt = Recipe::new(vec![
Box::new(FromHex::default()),
Box::new(aes_cfb_decrypt),
]);
let aes_cfb_decrypt_result = recipe_cfb_aes_decrypt.bake(&aes_cfb_output)?;
println!("{}", aes_cfb_decrypt_result);
let aes_ctr_encrypt = AesEncrypt::<_, NoPadding>::new(&aes_cfb_key, Ctr::new(&aes_cfb_iv));
let recipe_ctr_aes = Recipe::new(vec![Box::new(aes_ctr_encrypt), Box::new(ToHex::default())]);
let aes_ctr_output = recipe_ctr_aes.bake(&aes_input)?;
println!("{}", aes_ctr_output);
let aes_ctr_decrypt = AesDecrypt::<_, NoPadding>::new(&aes_cfb_key, Ctr::new(&aes_cfb_iv));
let recipe_ctr_aes_decrypt = Recipe::new(vec![
Box::new(FromHex::default()),
Box::new(aes_ctr_decrypt),
]);
let aes_ctr_decrypt_result = recipe_ctr_aes_decrypt.bake(&aes_ctr_output)?;
println!("{}", aes_ctr_decrypt_result);
let aes_gcm_iv = Bytes::new("co et eiusmod euABCD".as_bytes());
let aes_gcm_aad = Bytes::new(b"Additional Auth Data".as_ref());
let aes_gcm_encrypt =
AesEncrypt::<_, NoPadding>::new(&aes_cfb_key, Gcm::new(&aes_gcm_iv, Some(&aes_gcm_aad)));
let recipe_gcm_aes = Recipe::new(vec![Box::new(aes_gcm_encrypt), Box::new(ToHex::default())]);
let aes_gcm_output = recipe_gcm_aes.bake(&aes_input)?;
println!("{}", aes_gcm_output);
let aes_gcm_decrypt =
AesDecrypt::<_, NoPadding>::new(&aes_cfb_key, Gcm::new(&aes_gcm_iv, Some(&aes_gcm_aad)));
let recipe_gcm_aes_decrypt = Recipe::new(vec![
Box::new(FromHex::default()),
Box::new(aes_gcm_decrypt),
]);
/*
let mut fake_gcm_output = aes_gcm_output.to_vec();
// 篡改最后一个字节,模拟标签验证失败
let last_index = fake_gcm_output.len() - 1;
fake_gcm_output[last_index] ^= 0x01;
let aes_gcm_decrypt_result = recipe_gcm_aes_decrypt.bake(&fake_gcm_output)?;
*/
let aes_gcm_decrypt_result = recipe_gcm_aes_decrypt.bake(&aes_gcm_output)?;
println!("{}", aes_gcm_decrypt_result);
println!("---- ---- ---- ---- ----");
println!();
// TEA
println!("---- ---- TEA ---- ----");
let xxtea_input = Bytes::new([1, 0, 0, 0, 2, 0, 0].as_ref());
let xxtea_key = Bytes::new([2, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0].as_ref());
let xxtea_encrypt = XxteaEncrypt::new(&xxtea_key, false);
let recipe10 = Recipe::new(vec![Box::new(xxtea_encrypt)]);
let xxtea_output = recipe10.bake(&xxtea_input)?;
println!("{}", xxtea_output);
let xxtea_decrypt = XxteaDecrypt::new(&xxtea_key, false);
let recipe11 = Recipe::new(vec![Box::new(xxtea_decrypt)]);
let xxtea_decrypt_result = recipe11.bake(&xxtea_output)?;
println!("{:?}", xxtea_decrypt_result);
println!("---- ---- ---- ---- ----");
println!();
// SM4
println!("---- ---- SM4 ---- ----");
let sm4_input = Bytes::new(
[
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08,
]
.as_ref(),
);
let sm4_key = Bytes::new(
[
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd,
0xee, 0xff,
]
.as_ref(),
);
let sm4_iv = Bytes::new(
[
0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
0x11, 0x00,
]
.as_ref(),
);
let sm4_encrypt = Sm4Encrypt::<_, Pkcs7Padding>::new(&sm4_key, Cbc::new(&sm4_iv));
let recipe12 = Recipe::new(vec![Box::new(sm4_encrypt)]);
let sm4_output = recipe12.bake(&sm4_input)?;
println!("{}", sm4_output);
let sm4_decrypt = Sm4Decrypt::<_, Pkcs7Padding>::new(&sm4_key, Cbc::new(&sm4_iv));
let recipe13 = Recipe::new(vec![Box::new(sm4_decrypt)]);
let sm4_decrypt_result = recipe13.bake(&sm4_output)?;
println!("{:?}", sm4_decrypt_result);
let sm4_ofb_input = Bytes::new(b"Hello, SM4 More Mode!Hello, SM4 More Mode!".as_ref());
let sm4_ofb_key = Bytes::new(b"Sixteen byte key".as_ref());
let sm4_ofb_iv = Bytes::new(b"InitialVector123".as_ref());
let sm4_ofb_encrypt = Sm4Encrypt::<_, NoPadding>::new(&sm4_ofb_key, Ofb::new(&sm4_ofb_iv));
let recipe_sm4_ofb = Recipe::new(vec![Box::new(sm4_ofb_encrypt), Box::new(ToHex::default())]);
let sm4_ofb_output = recipe_sm4_ofb.bake(&sm4_ofb_input)?;
println!("{}", sm4_ofb_output);
let sm4_ofb_decrypt = Sm4Decrypt::<_, NoPadding>::new(&sm4_ofb_key, Ofb::new(&sm4_ofb_iv));
let recipe_sm4_ofb_decrypt = Recipe::new(vec![
Box::new(FromHex::default()),
Box::new(sm4_ofb_decrypt),
]);
let sm4_ofb_decrypt_result = recipe_sm4_ofb_decrypt.bake(&sm4_ofb_output)?;
println!("{}", sm4_ofb_decrypt_result);
let sm4_ctr_iv = Bytes::new(
[
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff,
]
.as_ref(),
);
let sm4_ctr_encrypt = Sm4Encrypt::<_, NoPadding>::new(&sm4_ofb_key, Ctr::new(&sm4_ctr_iv));
let recipe_sm4_ctr = Recipe::new(vec![Box::new(sm4_ctr_encrypt), Box::new(ToHex::default())]);
let sm4_ctr_output = recipe_sm4_ctr.bake(&sm4_ofb_input)?;
println!("{}", sm4_ctr_output);
let sm4_ctr_decrypt = Sm4Decrypt::<_, NoPadding>::new(&sm4_ofb_key, Ctr::new(&sm4_ctr_iv));
let recipe_sm4_ctr_decrypt = Recipe::new(vec![
Box::new(FromHex::default()),
Box::new(sm4_ctr_decrypt),
]);
let sm4_ctr_decrypt_result = recipe_sm4_ctr_decrypt.bake(&sm4_ctr_output)?;
println!("{}", sm4_ctr_decrypt_result);
println!("---- ---- ---- ---- ----");
println!();
Ok(())
}