From 551209d4f148d2da2c981e3a6617bbeaef2db518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Sun, 2 Jul 2023 17:56:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(crypt):=E5=AE=8C=E6=88=903DES=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E7=AE=97=E6=B3=95=E7=9A=84=E5=B7=A5=E5=85=B7=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +-- src/encryption/des.rs | 2 +- src/encryption/mod.rs | 1 + src/encryption/tdes.rs | 128 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 src/encryption/tdes.rs diff --git a/README.md b/README.md index 2974944..a7968f1 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,10 @@ Rust 中可以使用的常用辅助功能工具箱。主要配备以下功能: - [x] No Padding - [x] ZerosPadding - [x] Pkcs7Padding - - [ ] 3DES-CBC 便捷加解密算法 - - [ ] No Padding - - [ ] ZerosPadding - - [ ] Pkcs7Padding + - [x] 3DES-CBC 便捷加解密算法 + - [x] No Padding + - [x] ZerosPadding + - [x] Pkcs7Padding - [ ] RSA 加解密算法 - [ ] 1024 位长 - [ ] 2048 位长 diff --git a/src/encryption/des.rs b/src/encryption/des.rs index 11f675c..e640ebc 100644 --- a/src/encryption/des.rs +++ b/src/encryption/des.rs @@ -4,7 +4,7 @@ use des::Des; type DesEncryptor = cbc::Encryptor; type DesDecryptor = cbc::Decryptor; -/// 利用Sha512生成24字节的密钥 +/// 利用Sha512生成8字节的密钥 /// /// - `key` 原始密钥 fn generate_key>(key: T) -> [u8; 8] { diff --git a/src/encryption/mod.rs b/src/encryption/mod.rs index b2b3e5f..be43d67 100644 --- a/src/encryption/mod.rs +++ b/src/encryption/mod.rs @@ -2,6 +2,7 @@ use thiserror::Error; pub mod aes; pub mod des; +pub mod tdes; pub enum Padding { NoPadding, diff --git a/src/encryption/tdes.rs b/src/encryption/tdes.rs new file mode 100644 index 0000000..6615635 --- /dev/null +++ b/src/encryption/tdes.rs @@ -0,0 +1,128 @@ +use cipher::{BlockDecryptMut, BlockEncryptMut, KeyIvInit}; +use des::TdesEde3; + +type TripleDesEncryptor = cbc::Encryptor; +type TripleDesDecryptor = cbc::Decryptor; + +/// 利用Sha512生成8字节的密钥 +/// +/// - `key` 原始密钥 +fn generate_key>(key: T) -> [u8; 8] { + let mut hasher = hmac_sha256::Hash::new(); + hasher.update(key); + let result = hasher.finalize(); + let mut compressed_key = [0u8; 8]; + for i in 0..8 { + compressed_key[i] = result[i]; + for j in 1..4 { + compressed_key[i] ^= result[i + j * 8]; + } + } + compressed_key +} + +/// 使用指定的密钥和填充方式对数据进行加密。 +/// 如果需要字符串形式的密文,可以配合使用`hex`或者`base64`等函数。 +/// +/// - `key` 密钥 +/// - `padding` 填充方式 +/// - `plain_data` 明文数据 +pub fn encrypt, D: AsRef<[u8]>>( + key: T, + padding: super::Padding, + plain_data: D, +) -> Vec { + let key = generate_key(key); + let encryptor = TripleDesEncryptor::new(key.as_slice().into(), &key.into()); + let result = match padding { + super::Padding::NoPadding => encryptor + .encrypt_padded_vec_mut::(plain_data.as_ref()), + super::Padding::ZeroPadding => encryptor + .encrypt_padded_vec_mut::(plain_data.as_ref()), + super::Padding::Pkcs7Padding => { + encryptor.encrypt_padded_vec_mut::(plain_data.as_ref()) + } + }; + result +} + +/// 使用指定的密钥和填充方式对数据进行解密。 +/// +/// - `key` 密钥 +/// - `padding` 填充方式 +/// - `cipher_data` 密文数据 +pub fn decrypt, D: AsRef<[u8]>>( + key: T, + padding: super::Padding, + cipher_data: D, +) -> Result, super::DecryptFailedError> { + let key = generate_key(key); + let decryptor = TripleDesDecryptor::new(key.as_slice().into(), &key.into()); + let result = match padding { + super::Padding::NoPadding => decryptor + .decrypt_padded_vec_mut::(cipher_data.as_ref()), + super::Padding::ZeroPadding => decryptor + .decrypt_padded_vec_mut::(cipher_data.as_ref()), + super::Padding::Pkcs7Padding => { + decryptor.decrypt_padded_vec_mut::(cipher_data.as_ref()) + } + }; + result.map_err(|_| super::DecryptFailedError {}) +} + +/// 快捷无填充加密函数 +/// +/// - `key` 密钥 +/// - `plain_data` 明文数据 +pub fn encrypt_no_padding, D: AsRef<[u8]>>(key: T, plain_data: D) -> Vec { + encrypt(key, super::Padding::NoPadding, plain_data) +} + +/// 快捷无填充解密函数 +/// +/// - `key` 密钥 +/// - `cipher_data` 密文数据 +pub fn decrypt_no_padding, D: AsRef<[u8]>>( + key: T, + cipher_data: D, +) -> Result, super::DecryptFailedError> { + decrypt(key, super::Padding::NoPadding, cipher_data) +} + +/// 快捷零填充加密函数 +/// +/// - `key` 密钥 +/// - `plain_data` 明文数据 +pub fn encrypt_zero_padding, D: AsRef<[u8]>>(key: T, plain_data: D) -> Vec { + encrypt(key, super::Padding::ZeroPadding, plain_data) +} + +/// 快捷零填充解密函数 +/// +/// - `key` 密钥 +/// - `cipher_data` 密文数据 +pub fn decrypt_zero_padding, D: AsRef<[u8]>>( + key: T, + cipher_data: D, +) -> Result, super::DecryptFailedError> { + decrypt(key, super::Padding::ZeroPadding, cipher_data) +} + +/// 快捷Pkcs7填充加密函数 +/// +/// - `key` 密钥 +/// - `plain_data` 明文数据 +pub fn encrypt_pkcs7_padding, D: AsRef<[u8]>>(key: T, plain_data: D) -> Vec { + encrypt(key, super::Padding::Pkcs7Padding, plain_data) +} + +/// 快捷Pkcs7填充解密函数 +/// +/// - `key` 密钥 +/// - `cipher_data` 密文数据 +pub fn decrypt_pkcs7_padding, D: AsRef<[u8]>>( + key: T, + cipher_data: D, +) -> Result, super::DecryptFailedError> { + decrypt(key, super::Padding::Pkcs7Padding, cipher_data) +}