哈希运算(以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 = 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 mainimport ( "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 = 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 = 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 = 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=

参考资料

[1] 在线比对: 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 多平台发布

相关阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。