From 0611f1c786f8f0294dd2a461f90585fe558daeab Mon Sep 17 00:00:00 2001 From: Maciej Lebiest Date: Sun, 8 Dec 2024 16:40:29 +0100 Subject: [PATCH] fixes, save results, visualizations --- 3des192_decryption.csv | 5 +++++ 3des192_encryption.csv | 5 +++++ 3des_keygen_benchmark.csv | 5 +++++ aes128_decryption.csv | 5 +++++ aes128_encryption.csv | 5 +++++ aes192_decryption.csv | 5 +++++ aes192_encryption.csv | 5 +++++ aes256_decryption.csv | 5 +++++ aes256_encryption.csv | 5 +++++ aes_keygen_benchmark.csv | 13 +++++++++++++ rsa1024_decryption.csv | 5 +++++ rsa1024_encryption.csv | 5 +++++ rsa2048_decryption.csv | 5 +++++ rsa2048_encryption.csv | 5 +++++ rsa3072_decryption.csv | 5 +++++ rsa3072_encryption.csv | 5 +++++ rsa512_decryption.csv | 5 +++++ rsa512_encryption.csv | 5 +++++ rsa_keygen_benchmark.csv | 13 +++++++++++++ src/main.rs | 20 ++++++++++---------- visualize.ods | Bin 0 -> 36911 bytes 21 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 3des192_decryption.csv create mode 100644 3des192_encryption.csv create mode 100644 3des_keygen_benchmark.csv create mode 100644 aes128_decryption.csv create mode 100644 aes128_encryption.csv create mode 100644 aes192_decryption.csv create mode 100644 aes192_encryption.csv create mode 100644 aes256_decryption.csv create mode 100644 aes256_encryption.csv create mode 100644 aes_keygen_benchmark.csv create mode 100644 rsa1024_decryption.csv create mode 100644 rsa1024_encryption.csv create mode 100644 rsa2048_decryption.csv create mode 100644 rsa2048_encryption.csv create mode 100644 rsa3072_decryption.csv create mode 100644 rsa3072_encryption.csv create mode 100644 rsa512_decryption.csv create mode 100644 rsa512_encryption.csv create mode 100644 rsa_keygen_benchmark.csv create mode 100644 visualize.ods diff --git a/3des192_decryption.csv b/3des192_decryption.csv new file mode 100644 index 0000000..359cb50 --- /dev/null +++ b/3des192_decryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +192,10,0.001 +192,1000,0.062 +192,100000,6.207 +192,10000000,621.734 diff --git a/3des192_encryption.csv b/3des192_encryption.csv new file mode 100644 index 0000000..2eb9ad5 --- /dev/null +++ b/3des192_encryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +192,10,0.002 +192,1000,0.067 +192,100000,6.249 +192,10000000,627.943 diff --git a/3des_keygen_benchmark.csv b/3des_keygen_benchmark.csv new file mode 100644 index 0000000..cbfeb7a --- /dev/null +++ b/3des_keygen_benchmark.csv @@ -0,0 +1,5 @@ +count,key_size,time_ms +1,192,0.001 +10,192,0.06 +100,192,0.062 +1000,192,0.103 diff --git a/aes128_decryption.csv b/aes128_decryption.csv new file mode 100644 index 0000000..2156961 --- /dev/null +++ b/aes128_decryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +128,10,0 +128,1000,0 +128,100000,0.008 +128,10000000,4.272 diff --git a/aes128_encryption.csv b/aes128_encryption.csv new file mode 100644 index 0000000..c6d8dba --- /dev/null +++ b/aes128_encryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +128,10,0 +128,1000,0 +128,100000,0.068 +128,10000000,11.043 diff --git a/aes192_decryption.csv b/aes192_decryption.csv new file mode 100644 index 0000000..36b90fa --- /dev/null +++ b/aes192_decryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +192,10,0 +192,1000,0 +192,100000,0.012 +192,10000000,3.884 diff --git a/aes192_encryption.csv b/aes192_encryption.csv new file mode 100644 index 0000000..f2bd018 --- /dev/null +++ b/aes192_encryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +192,10,0 +192,1000,0.001 +192,100000,0.082 +192,10000000,11.771 diff --git a/aes256_decryption.csv b/aes256_decryption.csv new file mode 100644 index 0000000..039bc3f --- /dev/null +++ b/aes256_decryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +256,10,0 +256,1000,0 +256,100000,0.014 +256,10000000,4.184 diff --git a/aes256_encryption.csv b/aes256_encryption.csv new file mode 100644 index 0000000..94a3c71 --- /dev/null +++ b/aes256_encryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +256,10,0.001 +256,1000,0.001 +256,100000,0.091 +256,10000000,11.563 diff --git a/aes_keygen_benchmark.csv b/aes_keygen_benchmark.csv new file mode 100644 index 0000000..9921427 --- /dev/null +++ b/aes_keygen_benchmark.csv @@ -0,0 +1,13 @@ +count,key_size,time_ms +1,128,0 +1,192,0 +1,256,0 +10,128,0.04 +10,192,0.061 +10,256,0.08 +100,128,0.042 +100,192,0.06 +100,256,0.08 +1000,128,0.069 +1000,192,0.101 +1000,256,0.134 diff --git a/rsa1024_decryption.csv b/rsa1024_decryption.csv new file mode 100644 index 0000000..c2ad8f4 --- /dev/null +++ b/rsa1024_decryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +1024,10,0.233 +1024,1000,1.974 +1024,100000,189.815 +1024,10000000,18984.256 diff --git a/rsa1024_encryption.csv b/rsa1024_encryption.csv new file mode 100644 index 0000000..dbfb0cd --- /dev/null +++ b/rsa1024_encryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +1024,10,0.051 +1024,1000,0.403 +1024,100000,37.897 +1024,10000000,3776.197 diff --git a/rsa2048_decryption.csv b/rsa2048_decryption.csv new file mode 100644 index 0000000..c2cf44e --- /dev/null +++ b/rsa2048_decryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +2048,10,1.307 +2048,1000,6.474 +2048,100000,529.126 +2048,10000000,52808.375 diff --git a/rsa2048_encryption.csv b/rsa2048_encryption.csv new file mode 100644 index 0000000..dacaf1f --- /dev/null +++ b/rsa2048_encryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +2048,10,0.165 +2048,1000,0.784 +2048,100000,63.955 +2048,10000000,6372.035 diff --git a/rsa3072_decryption.csv b/rsa3072_decryption.csv new file mode 100644 index 0000000..c72a4d3 --- /dev/null +++ b/rsa3072_decryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +3072,10,3.928 +3072,1000,11.809 +3072,100000,1054.251 +3072,10000000,105256.87 diff --git a/rsa3072_encryption.csv b/rsa3072_encryption.csv new file mode 100644 index 0000000..aaf04ed --- /dev/null +++ b/rsa3072_encryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +3072,10,0.351 +3072,1000,1.018 +3072,100000,90.893 +3072,10000000,9050.934 diff --git a/rsa512_decryption.csv b/rsa512_decryption.csv new file mode 100644 index 0000000..544e941 --- /dev/null +++ b/rsa512_decryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +512,10,0.059 +512,1000,0.966 +512,100000,96.361 +512,10000000,9568.021 diff --git a/rsa512_encryption.csv b/rsa512_encryption.csv new file mode 100644 index 0000000..8ec2a2a --- /dev/null +++ b/rsa512_encryption.csv @@ -0,0 +1,5 @@ +key_size,data_size,time_ms +512,10,0.018 +512,1000,0.287 +512,100000,27.48 +512,10000000,2790.804 diff --git a/rsa_keygen_benchmark.csv b/rsa_keygen_benchmark.csv new file mode 100644 index 0000000..6810114 --- /dev/null +++ b/rsa_keygen_benchmark.csv @@ -0,0 +1,13 @@ +count,key_size,time_ms +1,512,4.11 +1,1024,22.783 +1,2048,128.464 +10,512,26.444 +10,1024,153.001 +10,2048,1658.256 +100,512,241.216 +100,1024,1492.256 +100,2048,15214.671 +1000,512,2526.931 +1000,1024,15952.701 +1000,2048,148078.44 diff --git a/src/main.rs b/src/main.rs index 68fcde2..3f40a5b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -181,7 +181,7 @@ fn measure_aes_performance( iv: &[u8], sizes: &[usize] ) -> Result<(), Box> { - println!("Measuting aes{} performance", key.len().to_string()); + println!("Measuting aes{} performance", (key.len()*8).to_string()); let mut encryption_results = vec![]; let mut decryption_results = vec![]; @@ -210,7 +210,7 @@ fn measure_aes_performance( let mut wtr = csv::Writer::from_writer(encrypt_file); wtr.write_record(&["key_size", "data_size", "time_ms"])?; for (size, time) in encryption_results { - wtr.write_record(&[key.len().to_string(), size.to_string(), time.to_string()])?; + wtr.write_record(&[(key.len()*8).to_string(), size.to_string(), time.to_string()])?; } // Save decryption results to CSV @@ -218,7 +218,7 @@ fn measure_aes_performance( let mut wtr = csv::Writer::from_writer(decrypt_file); wtr.write_record(&["key_size", "data_size", "time_ms"])?; for (size, time) in decryption_results { - wtr.write_record(&[key.len().to_string(), size.to_string(), time.to_string()])?; + wtr.write_record(&[(key.len()*8).to_string(), size.to_string(), time.to_string()])?; } Ok(()) } @@ -259,7 +259,7 @@ fn measure_3des_performance( let mut wtr = csv::Writer::from_writer(encrypt_file); wtr.write_record(&["key_size", "data_size", "time_ms"])?; for (size, time) in encryption_results { - wtr.write_record(&[key.len().to_string(), size.to_string(), time.to_string()])?; + wtr.write_record(&[(key.len()*8).to_string(), size.to_string(), time.to_string()])?; } // Save decryption results to CSV @@ -267,15 +267,15 @@ fn measure_3des_performance( let mut wtr = csv::Writer::from_writer(decrypt_file); wtr.write_record(&["key_size", "data_size", "time_ms"])?; for (size, time) in decryption_results { - wtr.write_record(&[key.len().to_string(), size.to_string(), time.to_string()])?; + wtr.write_record(&[(key.len()*8).to_string(), size.to_string(), time.to_string()])?; } Ok(()) } fn test_rsa_key_gen(rng: OsRng) -> Result<(), Box> { - let counts = [1, 10, 100 ]; - let key_sizes = [1024, 2048 ]; + let counts = [1, 10, 100, 1000 ]; + let key_sizes = [512, 1024, 2048 ]; let file = File::create("rsa_keygen_benchmark.csv")?; let mut wtr = csv::Writer::from_writer(file); @@ -304,7 +304,7 @@ fn test_rsa_key_gen(rng: OsRng) -> Result<(), Box> { fn test_3des_key_gen(rng: OsRng) -> Result<(), Box> { let counts = [1, 10, 100, 1000 ]; - let key_sizes = [112, 168 ]; + let key_sizes = [192 ]; let file = File::create("3des_keygen_benchmark.csv")?; let mut wtr = csv::Writer::from_writer(file); @@ -367,7 +367,7 @@ fn main() { let _result = test_aes_key_gen(rng); let iv = [0x8; 16]; - let data_sizes = [10, 1000, 10000, 100000 ]; + let data_sizes = [10, 1000, 100000, 10000000 ]; let _result = measure_aes_performance(&generate_aes_keys(128, 1, rng)[0], &iv, &data_sizes); let _result = measure_aes_performance(&generate_aes_keys(192, 1, rng)[0], &iv, &data_sizes); @@ -376,7 +376,7 @@ fn main() { let iv = [0x8; 8]; let _result = measure_3des_performance(&generate_3des_keys(192, 1, rng)[0], &iv, &data_sizes); - for size in [512, 1024, 2048] { + for size in [512, 1024, 2048, 3072] { let keys = generate_rsa_keys(1, size, rng); let (privkey, pubkey) = &keys[0]; match measure_rsa_performance(&privkey, &pubkey, size, &data_sizes) { diff --git a/visualize.ods b/visualize.ods new file mode 100644 index 0000000000000000000000000000000000000000..888ea22133f6eef66b986920e7dc136dbf9101a6 GIT binary patch literal 36911 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 XD**{Qw+#%81oRgL(ljXW`Q85kH7p;J literal 0 HcmV?d00001