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
可以在线比对验证一下
验证数据完整性(使用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
可以在线比对[1]验证一下:
发现不一致...
用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是什么[2]
关于AES加解密中CBC模式的IV初始化向量的安全性问题[3]
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=
参考资料
在线比对: http://www.metools.info/code/c25.html
[2]aes加密中的iv是什么: https://blog.csdn.net/weixin_39559119/article/details/111180758
[3]关于AES加解密中CBC模式的IV初始化向量的安全性问题: https://www.jianshu.com/p/45848dd484a9
本文由 mdnice 多平台发布
相关文章:
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]n…...
[管理与领导-55]:IT基层管理者 - 扩展技能 - 1 - 时间管理 -2- 自律与自身作则,管理者管好自己时间的五步法
前言: 管理好自己的时间,不仅仅是理念,也是方法和流程。 步骤1:理清各种待办事项 当提到工作事项时,这通常指的是要完成或处理的工作任务或事务。这些事项可以包括以下内容: 任务分配:根据工作…...
电子商务员考试题库及答案(中级)--判断题
电子商务员题库 一、判断题 1.EDI就是按照商定的协议,将商业文件分类,并通过计算机网络,在贸易伙伴的计算机网络系统之间进行数据交换和自动处理。〔〕 2.相互通信的EDI的用户必须使用相同类型的计算机。〔 〕 3.EDI采用共同…...
(WAF)Web应用程序防火墙介绍
(WAF)Web应用程序防火墙介绍 1. WAF概述 Web应用程序防火墙(WAF)是一种关键的网络安全解决方案,用于保护Web应用程序免受各种网络攻击和威胁。随着互联网的不断发展,Web应用程序变得越来越复杂&#x…...
SpringMVC拦截器常见应用场景
在Spring MVC中,拦截器是通过实现HandlerInterceptor接口来定义的。该接口包含了三个方法: preHandle:在请求到达处理器之前执行,可以进行一些预处理操作。如果返回false,则请求将被拦截,不再继续执行后续的…...
爬虫:绕过5秒盾Cloudflare和DDoS-GUARD
本文章仅供技术研究参考,勿做它用! 5秒盾的特点 <title>Just a moment...</title> 返回的页面中不是目标数据,而是包含上面的代码:Just a moment... 或者第一次打开网页的时候: 这几个特征就是被Cloud…...
数据仓库环境下的超市进销存系统结构
传统的进销存系统建立的以单一数据库为中心的数据组织模式,已经无 法满足决策分析对数据库系统的要求,而数据仓库技术的出现和发展,为上述问题 的解决提供了强有力的工具和手段。数据仓库是一种对多个分布式的、异构的数据 库提供统一查询…...
leetcode:2011. 执行操作后的变量值(python3解法)
难度:简单 存在一种仅支持 4 种操作和 1 个变量 X 的编程语言: X 和 X 使变量 X 的值 加 1--X 和 X-- 使变量 X 的值 减 1 最初,X 的值是 0 给你一个字符串数组 operations ,这是由操作组成的一个列表,返回执行所有操作…...
ubuntu下mysql
安装: sudo apt update sudo apt install my_sql 安装客户端: sudo apt-get install mysql-client sudo apt-get install libmysqlclient-dev 启动服务 启动方式之一: sudo service mysql start 检查服务器状态方式之一:sudo …...
大模型从入门到应用——LangChain:链(Chains)-[链与索引:检索式问答]
分类目录:《大模型从入门到应用》总目录 下面这个示例展示了如何在索引上进行问答: from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.text_splitter import CharacterTextSplitte…...
【LeetCode-中等题】142. 环形链表 II
文章目录 题目方法一:哈希表set去重方法二:快慢指针 题目 方法一:哈希表set去重 思路:我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。借助哈希…...
Android TV开发之VerticalGridView
Android TV应用开发和手机应用开发是一样的,只是多了焦点控制,即选中变色。 androidx.leanback.widget.VerticalGridView 继承 BaseGridView , BaseGridView 继承 RecyclerView 。 所以 VerticalGridView 就是 RecyclerView ,使…...
SpringBoot+Vue项目添加腾讯云人脸识别
一、引言 人脸识别是一种基于人脸特征进行身份认证和识别的技术。它使用计算机视觉和模式识别的方法,通过分析图像或视频中的人脸特征,例如脸部轮廓、眼睛、鼻子、嘴巴等,来验证一个人的身份或识别出他们是谁。 人脸识别可以应用在多个领域…...
什么是IPv4?什么又是IPv6?
IPv4网络IPv4地址 IPv6网络IPv6地址 路由总结感谢 💖 hello大家好😊 IPv4网络 IPv4(Internet Protocol Version 4)是当今互联网上使用的主要网络协议。 IPv4地址 IPv4 地址有32位,通常使用点号分隔的四个十进制八位…...
飞腾FT-2000/4、D2000 log报错指导(3)
在爱好者群中遇见了很多的固件问题,这里总结记录了大家的交流内容和调试心得。主要是飞腾桌面CPU FT-2000/4 D2000相关的,包含uboot和UEFI。希望对大家调试有所帮助。 这个专题会持续更新,凑够一些就发。 23 在s3 唤醒时报错如下 check suspend ,Platform exception report…...
基于安卓的考研助手系统app 微信小程序
,设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。HBuilder技术作为当前最流行的操作平台,自然也存在着大量的应用服务需求。 本课题研究的是基于HBuilder技术平台的安卓的考研助手APP,开发这款安卓的考研助手APP主要是为了…...
Leetcode:238. 除自身以外数组的乘积【题解超详细】
纯C语言实现(小白也能看明白) 题目 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数…...
基于单片机的智能数字电子秤proteus仿真设计
一、系统方案 1、当电子称开机时,单片机会进入一系列初始化,进入1602显示模式设定,如开关显示、光标有无设置、光标闪烁设置,定时器初始化,进入定时器模式,如初始值赋值。之后液晶会显示Welcome To Use Ele…...
大数据(二)大数据行业相关统计数据
大数据(二)大数据行业相关统计数据 目录 一、大数据相关的各种资讯 二、转载自网络的大数据统计数据 2.1、国家大数据政策 2.2、产业结构分析 2.3、应用结构分析 2.4、数据中心 2.5、云计算 一、大数据相关的各种资讯 1. 据IDC预测࿰…...
Ruoyi安装部署(linux环境、前后端不分离版本)
目录 简介 1 新建目录 2 安装jdk 2.1 jdk下载 2.2 解压并移动文件夹到/data/service目录 2.3 配置环境变量 3 安装maven 3.1 进入官网下载最新的maven 3.2 解压并移动文件夹到/data//service目录 3.3 配置环境变量 3.4 配置本地仓库地址与阿里云镜像 4 安装git 4.…...
终极RPG Maker游戏资源解密工具:无需安装的浏览器解决方案
终极RPG Maker游戏资源解密工具:无需安装的浏览器解决方案 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https://git…...
深入LTPI状态机:为什么你的链路配置总失败?Advertise与Configure状态详解
深入LTPI状态机:为什么你的链路配置总失败?Advertise与Configure状态详解 在LTPI协议的实际部署中,许多工程师都会遇到一个令人困惑的现象:明明按照规范完成了链路训练,却在配置阶段频繁出现回退到Link Detect状态的情…...
DataStore vs SharedPreferences 迁移指南:告别 ANR,拥抱类型安全
DataStore vs SharedPreferences 迁移指南:告别 ANR,拥抱类型安全 一句话收益:掌握从 SharedPreferences 迁移到 Jetpack DataStore 的完整路径,彻底消除主线程 I/O 阻塞与类型安全隐患。 适用版本:Android API 21&…...
嵌入式条码扫描头:从核心原理到八大行业应用实战
1. 项目概述:从“扫码”到“感知”的嵌入式革命每次在超市收银台听到“嘀”的一声,或者在快递驿站看到工作人员拿着手持设备快速扫过包裹,我们都在与条码扫描技术打交道。但你是否想过,这些看似简单的“扫码”动作背后,…...
从零开发游戏需要学习的c#模块,第二十一章(精灵动画 —— 让角色走起来)
今天我们要学习的内容是 理解精灵图集的原理 加载精灵图集并切帧 实现四方向行走动画 静止时显示待机帧 第一步:准备精灵图集 精灵图集就是一张大图里包含多个小图(帧),播放时依次显示每一帧,形成动画效果。 一…...
技术人的收入结构优化:工资、副业、投资的三支柱模型
在软件测试的世界里,我们熟知一个真理:没有任何单一测试策略能保证系统的绝对健壮。一个高质量的系统,必然建立在单元测试、集成测试、系统测试和验收测试所构成的稳固金字塔上。同样的逻辑,也适用于我们技术人的财务健康。过度依…...
破解安卓设备标识获取难题:Android_CN_OAID的全栈兼容解决方案
破解安卓设备标识获取难题:Android_CN_OAID的全栈兼容解决方案 【免费下载链接】Android_CN_OAID 安卓设备唯一标识解决方案,可替代移动安全联盟(MSA)统一 SDK 闭源方案。包括国内手机厂商的开放匿名标识(OAID…...
Python API认证与授权实战:从Basic Auth到OAuth2.0
Python API认证与授权实战:从Basic Auth到OAuth2.0 引言 API安全是后端开发中至关重要的一环。作为从Python转向Rust的后端开发者,我深刻体会到认证与授权机制的重要性。一个安全可靠的API需要完善的认证体系来保护敏感数据和资源。本文将从实战角度出…...
效率直接起飞 2026 最新!降AIGC工具测评与推荐
2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...
为openclaw配置taotoken作为其ai供应商的详细步骤指南
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为OpenClaw配置Taotoken作为其AI供应商的详细步骤指南 OpenClaw是一款流行的AI智能体开发工具,它允许开发者通过配置来…...
