rust学习(openssl rsa加解密文件)

rust的openssl中有支持RSA加解密的库。参考地址如下:

openssl::rsa - Rust

里面也有简单的示例代码:

use openssl::rsa::{Rsa, Padding};

let rsa = Rsa::generate(2048).unwrap();
let data = b"foobar";
let mut buf = vec![0; rsa.size() as usize];
let encrypted_len = rsa.public_encrypt(data, &mut buf, Padding::PKCS1).unwrap();

上述代码使用公钥加密数据。参考类似的代码,我们需要写一个加解密文件的操作,

加密代码:

let buff_size = pub_key.size() as usize;
            let mut buf = vec![0;buff_size];
            let mut start:usize = 0;

            //if use Padding::PKCS1 =>encrypt length = key length - 11
            //if use Padding::OAEP  =>encrypt length = key length - 42
            let mut encrypt_len = 0;
            if self.m_padding == Padding::PKCS1 {
                encrypt_len = buff_size - 11;
            } else if self.m_padding == Padding::PKCS1_OAEP{
                encrypt_len = buff_size - 42
            }
            
            let mut end = start + encrypt_len;

            if end > data.len() {
                end = data.len();
            }

            loop { //1
                let ret = pub_key.public_encrypt(&data[start..end], &mut buf, self.m_padding);//2
                match ret {
                    Ok(size)=> {
                        result.extend_from_slice(&buf[0..size]);
                        start += encrypt_len;
                        end += encrypt_len;
                        if start >= data.len() {
                            break;
                        }

                        if end > data.len() {
                            end = data.len();
                        }
                    },
                    Err(_) => {
                        break;
                    }
                }
            }

1.RSA加密也是类似AES这种逐个block加密,所以每个block的长度是多少呢?这个需要根据padding的类型来计算,具体的可以看上面encrypt_len的计算。所以这个循环实际上就是这个block加密,然后把加密的数据存放到一个Vec<u8>里面。

2.调用rsa的接口,貌似他支持公钥加解密,私钥加解密。使用也很方便,但是有一点注意public_encrypt这个函数每次返回的加密长度都是256.(我的key生成的时候是2048=256*4)

解密代码:

let buff_size = pub_key.size() as usize;
            let mut buf = vec![0;buff_size];
            let mut start:usize = 0;
            let mut end:usize = data.len();

            //if use Padding::PKCS1 =>encrypt length = key length - 11
            //if use Padding::OAEP  =>encrypt length = key length - 42
            let mut encrypt_len = 0;
            if self.m_padding == Padding::PKCS1 {
                encrypt_len = buff_size - 11;
            } else if self.m_padding == Padding::PKCS1_OAEP{
                encrypt_len = buff_size - 42
            }

            if end > buff_size {
                end = buff_size;
            }

            loop {//1
                let ret = pub_key.public_decrypt(&data[start..end], &mut buf, Padding::PKCS1);//2
                match ret {
                    Ok(size)=> {
                        result.extend_from_slice(&buf[0..size]);
                        if size < encrypt_len {
                            break;
                        }

                        start += buff_size;
                        end += buff_size;

                        if end > data.len() {
                            end = data.len();
                        }
                        
                    },
                    Err(_) => {
                        break;
                    }
                }
            }

1.解密的原理和加密类似,也是逐个block解密,每个block的长度就是rsa key的长度,这个比加密时候计算方便。哈哈。

2.注意public_decrypt返回的数字是实际解密后的数据长度,例如你传入解密的数据是256字节(正好是rsa key的长度),那你解密后的数据长度(如果padding是PCKS1)就是256-11 = 245.

关于RUST的学习,我把代码上传到了以下github:

GitHub - wangsun1983/Tarbo

Rust是一种系统级编程语言,具有高性能和内存安全的特性。DES3是一种对称加密算法,通过对数据进行三次DES加密来增强安全性。在Rust中,可以使用现有的DES3库来进行加解密操作。其中,rust-crypto库是一个常用的加密库,提供了DES3算法的支持。 使用rust-crypto库中的DES3算法进行加解密需要进行以下步骤: 1. 导入rust-crypto库: ```rust extern crate crypto; ``` 2. 使用DES3算法进行加密: ```rust use crypto::blockmodes::{BlockMode, Cbc}; use crypto::des::{self, BlockCipher}; use crypto::symmetriccipher::{Encryptor, Decryptor}; fn encrypt(plaintext: &[u8], key: &[u8], iv: &[u8]) -> Vec<u8> { let mut buffer = [0; 8]; let mut encryptor = des::EcbEncryptor::new(des::DesEde3, key, blockmodes::NoPadding); let mut cipher_text = Vec::new(); let mut previous_cipher_text = iv.to_vec(); for chunk in plaintext.chunks(8) { buffer.copy_from_slice(chunk); buffer = xor(&buffer, &previous_cipher_text); encryptor.encrypt_block(&mut buffer); previous_cipher_text = buffer.to_vec(); cipher_text.extend_from_slice(&buffer); } cipher_text } ``` 3. 使用DES3算法进行解密: ```rust fn decrypt(ciphertext: &[u8], key: &[u8], iv: &[u8]) -> Vec<u8> { let mut buffer = [0; 8]; let mut decryptor = des::EcbDecryptor::new(des::DesEde3, key, blockmodes::NoPadding); let mut plaintext = Vec::new(); let mut previous_cipher_text = iv.to_vec(); for chunk in ciphertext.chunks(8) { buffer.copy_from_slice(chunk); decryptor.decrypt_block(&mut buffer); buffer = xor(&buffer, &previous_cipher_text); previous_cipher_text.copy_from_slice(chunk); plaintext.extend_from_slice(&buffer); } plaintext } fn xor(lhs: &[u8], rhs: &[u8]) -> [u8; 8] { let mut result = [0; 8]; for i in 0..8 { result[i] = lhs[i] ^ rhs[i]; } result } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值