Rust常用加密算法

简介: Rust常用加密算法

哈希运算(以Sha256为例)


main.rs:

use crypto::digest::Digest;
use crypto::sha2::Sha256;
fn main() {
    let input = "dashen";
    let mut sha = Sha256::new();
    sha.input_str(input);
    println!("{}", sha.result_str());
}

Cargo.toml:

[package]
name = "crypto_test"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rustc-serialize = "0.3.24"
rust-crypto = "0.2.36"
rand = "0.8.5"

输出为:

6d65924d8e0580b9ac04d13da91c74c3ae28b08b4be4634ae06e647f42a88913

可以在线比对验证一下

微信截图_20230925142630.png

验证数据完整性(使用HMAC)


MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。 HMAC算法首先它是基于信息摘要算法的。目前主要集合了MD和SHA两大系列消息摘要算法。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。


HMAC算法除了需要信息摘要算法外,还需要一个密钥。HMAC的密钥可以是任何长度,如果密钥的长度超过了摘要算法信息分组的长度,则首先使用摘要算法计算密钥的摘要作为新的密钥。一般不建议使用太短的密钥,因为密钥的长度与安全强度是相关的。通常选取密钥长度不小于所选用摘要算法输出的信息摘要的长度。

use std::iter::repeat;
use crypto::hmac::Hmac;
use crypto::mac::Mac;
use crypto::sha2::Sha256;
use rand::{RngCore, rngs::OsRng};
use rustc_serialize::base64::{STANDARD, ToBase64};
use rustc_serialize::hex::ToHex;
use crypto::aes::{self,KeySize};
fn main() {
    let mut key: Vec<u8> = repeat(0u8).take(32).collect();
    println!("key1: {:?}", key);
    OsRng.fill_bytes(&mut key);
    println!("key2: {:?}", key);
    println!("key: {}", key.to_base64(STANDARD));
    let message = "dashen.tech";
    let mut hmac = Hmac::new(Sha256::new(), &key);
    hmac.input(message.as_bytes());
    println!("HMAC digest: {}", hmac.result().code().to_hex());
}

输出:

key1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
key2: [222, 156, 238, 1, 219, 222, 104, 217, 162, 90, 44, 240, 252, 125, 103, 47, 217, 104, 37, 81, 138, 15, 191, 43, 204, 182, 103, 51, 123, 148, 92, 255]
key: 3pzuAdveaNmiWizw/H1nL9loJVGKD78rzLZnM3uUXP8=
HMAC digest: 33f440b743d37078d428796c028f47237400f91bb638cc843508224f224f4407

可以在线比对验证一下:

微信截图_20230925142756.png

发现不一致...

用Go实现一下:

package main
import (
  "crypto/hmac"
  "crypto/sha256"
  "encoding/hex"
  "fmt"
)
func main() {
  rs := hmacSha256("dashen.tech", "3pzuAdveaNmiWizw/H1nL9loJVGKD78rzLZnM3uUXP8=")
  fmt.Println("结果为:", rs)
}
func hmacSha256(data string, secret string) string {
  h := hmac.New(sha256.New, []byte(secret))
  h.Write([]byte(data))
  return hex.EncodeToString(h.Sum(nil))
}

结果为: 019cb6bd005949a61eca8bd8900b03bb481803348a497340b65bfe9c3e4816e5


和在线工具计算出的结果一致,说明rust版的实现有问题...以后再研究下原因




加密内容(以AES为例)


高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES加密原理: 采用对称分组密码体制,密钥的长度最少支持为128、192、256位;加密分组长度128位,如果数据块及密钥长度不足时,会补齐进行加密。

aes加密中的iv是什么

关于AES加解密中CBC模式的IV初始化向量的安全性问题

use std::iter::repeat;
use rand::{RngCore, rngs::OsRng};
use rustc_serialize::base64::{STANDARD, ToBase64};
use crypto::aes::{self, KeySize};
use crypto::symmetriccipher::SynchronousStreamCipher;
fn main() {
    let mut key: Vec<u8> = repeat(0u8).take(16).collect();
    println!("key1: {:?}", key);
    OsRng.fill_bytes(&mut key);
    println!("key2: {:?}", key);
    println!("key: {}", key.to_base64(STANDARD));
    let mut iv: Vec<u8> = repeat(0u8).take(16).collect();
    println!("iv1:{:?}", iv);
    OsRng.fill_bytes(&mut iv);
    println!("iv2:{:?}", iv);
    println!("iv: {}", iv.to_base64(STANDARD));
    let mut cipher = aes::ctr(KeySize::KeySize128, &key, &iv);
    let secret = "dashen.tech";
    let mut output: Vec<u8> = repeat(0u8).take(secret.len()).collect();
    cipher.process(secret.as_bytes(), &mut output[..]);
    println!("最终结果为:{}", output.to_base64(STANDARD));
}

输出:

key1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
key2: [199, 203, 0, 244, 50, 50, 159, 132, 73, 176, 74, 56, 85, 31, 15, 218]
key: x8sA9DIyn4RJsEo4VR8P2g==
iv1:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
iv2:[74, 79, 85, 77, 17, 214, 64, 71, 35, 240, 34, 105, 42, 80, 40, 226]
iv: Sk9VTRHWQEcj8CJpKlAo4g==
最终结果为:b4NBF3CKKLfYuLg=
目录
相关文章
|
4天前
|
存储 Rust 监控
Rust代码编写高性能屏幕监控软件的核心算法
本文介绍了使用Rust编写的高性能屏幕监控软件的实现方法。核心算法包括:1) 使用`image`和`winit`库捕获并转换屏幕图像;2) 对图像进行处理,检测特定对象或活动;3) 利用Rust的并发性并行处理多个帧以提高效率;4) 提取数据后,通过`reqwest`库自动提交到网站进行分析或存储。通过结合Rust的高性能和丰富的库,可构建满足各种需求的高效屏幕监控工具。
88 5
|
5天前
|
数据采集 缓存 Rust
通过Rust实现公司电脑监控软件的性能优化算法
使用Rust语言开发高效的公司电脑监控软件,通过实时监测CPU、内存、网络等性能数据,确保企业环境的稳定性。文中通过代码示例展示了数据采集模块,如读取CPU使用率,并利用缓存机制减少文件系统访问,提升性能。此外,还介绍了如何将监控数据通过HTTP客户端提交到网站进行分析和管理,以优化运维流程。
58 3
|
5天前
|
缓存 Rust 算法
Rust中的数据结构与算法优化实践
在Rust编程语言中,优化数据结构与算法是提高程序性能的关键。本文首先介绍了Rust的特点,然后重点讨论了如何在Rust中优化数据结构和算法,包括使用标准库中的高效数据结构、自定义数据结构的优化技巧、算法选择与改进、以及Rust特性如所有权和借用检查器的应用。通过实际案例,我们将展示如何在Rust中实现更高效的数据结构与算法。
|
Rust 算法 安全
rust实现雪花算法
rust实现雪花算法
354 0
rust实现雪花算法
|
Rust 算法 安全
【算法学习】1773. 统计匹配检索规则的物品数量(java / c / c++ / python / go / rust)
给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i 件物品的类型、颜色以及名称。 另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。 如果第 i 件物品能满足下述条件之一,则认为该物品与给定的检索规则 匹配 : ruleKey == "type" 且 ruleValue == typei 。 ruleKey == "color" 且 ruleValue == colori 。 ruleKey == "name" 且 ruleValue == namei 。 统计并返回 匹配检索规则的物品数量
【算法学习】1773. 统计匹配检索规则的物品数量(java / c / c++ / python / go / rust)
|
Rust 算法 安全
【算法】1828. 统计一个圆中点的数目(java / c / c++ / python / go / rust)
给你一个数组 points ,其中 points[i] = [xi, yi] ,表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries ,其中 queries[j] = [xj, yj, rj] ,表示一个圆心在 (xj, yj) 且半径为 rj 的圆。 对于每一个查询 queries[j] ,计算在第 j 个圆 内 点的数目。如果一个点在圆的 边界上 ,我们同样认为它在圆 内 。 请你返回一个数组 answer ,其中 answer[j]是第 j 个查询的答案。
【算法】1828. 统计一个圆中点的数目(java / c / c++ / python / go / rust)
|
5天前
|
Rust 安全 网络协议
Rust 笔记:Rust 语言中的枚举 与 模式匹配
Rust 笔记:Rust 语言中的枚举 与 模式匹配
48 0
|
5天前
|
存储 Rust 安全
Rust 笔记:Rust 语言中的 所有权 与 生命周期
Rust 笔记:Rust 语言中的 所有权 与 生命周期
137 0
|
5天前
|
Rust 安全 程序员
开发语言漫谈-rust
if(){}else{}就是C家族的
|
4天前
|
Rust 监控 数据安全/隐私保护
Rust语言在员工屏幕监控系统中的应用指南
员工屏幕监控系统在现代企业管理中扮演着重要角色。它们能够帮助企业监控员工的活动,确保他们的工作效率和数据安全。在这篇文章中,我们将探讨如何使用Rust语言构建一个简单而高效的员工屏幕监控系统,并提供一些代码示例以帮助你入门。
144 0