哈希運算(以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
可以在線比對驗證一下

驗證數(shù)據(jù)完整性(使用HMAC)
MAC(Message Authentication Code,消息認證碼算法)是含有密鑰散列函數(shù)算法,兼容了MD和SHA算法的特性,并在此基礎(chǔ)上加上了密鑰。因此MAC算法也經(jīng)常被稱作HMAC算法。 HMAC算法首先它是基于信息摘要算法的。目前主要集合了MD和SHA兩大系列消息摘要算法。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三種算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五種算法。
HMAC算法除了需要信息摘要算法外,還需要一個密鑰。HMAC的密鑰可以是任何長度,如果密鑰的長度超過了摘要算法信息分組的長度,則首先使用摘要算法計算密鑰的摘要作為新的密鑰。一般不建議使用太短的密鑰,因為密鑰的長度與安全強度是相關(guān)的。通常選取密鑰長度不小于所選用摘要算法輸出的信息摘要的長度。
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]驗證一下:

發(fā)現(xiàn)不一致...
用Go實現(xiàn)一下:
package?main
import?(
?"crypto/hmac"
?"crypto/sha256"
?"encoding/hex"
?"fmt"
)
func?main()?{
?rs?:=?hmacSha256("dashen.tech",?"3pzuAdveaNmiWizw/H1nL9loJVGKD78rzLZnM3uUXP8=")
?fmt.Println("結(jié)果為:",?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))
}
結(jié)果為: 019cb6bd005949a61eca8bd8900b03bb481803348a497340b65bfe9c3e4816e5
和在線工具計算出的結(jié)果一致,說明rust版的實現(xiàn)有問題...以后再研究下原因
加密內(nèi)容(以AES為例)
高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標準。這個標準用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過五年的甄選流程,高級加密標準由美國國家標準與技術(shù)研究院(NIST)于2001年11月26日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標準。2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。
AES加密原理: 采用對稱分組密碼體制,密鑰的長度最少支持為128、192、256位;加密分組長度128位,如果數(shù)據(jù)塊及密鑰長度不足時,會補齊進行加密。
aes加密中的iv是什么[2]
關(guān)于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!("最終結(jié)果為:{}",?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==
最終結(jié)果為:b4NBF3CKKLfYuLg=
參考資料
在線比對: http://www.metools.info/code/c25.html
[2]aes加密中的iv是什么: https://blog.csdn.net/weixin_39559119/article/details/111180758
[3]關(guān)于AES加解密中CBC模式的IV初始化向量的安全性問題: https://www.jianshu.com/p/45848dd484a9文章來源:http://www.zghlxwxcb.cn/news/detail-672046.html
本文由 mdnice 多平臺發(fā)布文章來源地址http://www.zghlxwxcb.cn/news/detail-672046.html
到了這里,關(guān)于Rust常用加密算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!