FlashSwirl 闪旋,一款高性能的对称加密算法库,提供流加密、AEAD认证加密、HAS
H、HMAC、HKDF、PBKDF2
概述
由风之暇想研究的对称加密算法,基于ARX(Add-Rotate-XOR)结构设计,灵感来源于ChaCha20;加密库提供流加密、AEAD认证加密、HASH、HMAC、HKDF密钥派生、PBKDF2密钥派生的密码学功能。
✨ 特性
- 多种加密模式:支持流加密(Stream)和AEAD认证加密
- 高性能设计:批量处理、并行计算、内存池优化
- 跨平台支持:提供C++、Go、JavaScript三种语言代码
📊 算法规范
算法规范文档
📚 三种语言库调用说明
C++ 版本
使用示例:
#include"FlashSwirl.h"#include<iostream>#include<vector>intmain(){// 准备密钥和Nonceuint8_tkey[32]={/* 32字节密钥 */};uint8_tnonce[24]={/* 24字节随机Nonce,必须使用安全随机数生成 */};// ===== 1. 流加密 =====std::vector<uint8_t>data={'H','e','l','l','o'};FlashSwirl_EncryptBuffer(key,32,nonce,24,data.data(),data.size(),20);// data现在包含密文FlashSwirl_DecryptBuffer(key,32,nonce,24,data.data(),data.size(),20);// data现在恢复为明文// ===== 2. AEAD认证加密 =====uint8_tplaintext[]="Secret message";uint8_tciphertext[256];intoutLen=sizeof(ciphertext);uint8_tad[]="additional-data";FlashSwirl_EncryptAEADBuffer(key,32,nonce,24,plaintext,sizeof(plaintext)-1,ciphertext,&outLen,ad,sizeof(ad)-1,20);uint8_tdecrypted[256];intplainLen=sizeof(decrypted);FlashSwirl_DecryptAEADBuffer(key,32,nonce,24,ciphertext,outLen,decrypted,&plainLen,ad,sizeof(ad)-1,20);// ===== 3. HASH =====constchar*message="Hello, FlashSwirl!";uint8_thash[32];FlashSwirl_Hash((constuint8_t*)message,strlen(message),20,hash);// ===== 4. HMAC =====uint8_thmacKey[]="secret-key";uint8_thmacOut[32];FlashSwirl_HMAC(hmacKey,sizeof(hmacKey)-1,(constuint8_t*)message,strlen(message),20,hmacOut);// ===== 5. HKDF密钥派生 =====uint8_tmasterKey[32]={/* 主密钥 */};uint8_tsalt[32]={/* 盐值 */};uint8_tinfo[]="my-app";uint8_tderivedKey[32];FlashSwirl_HKDF(masterKey,32,salt,32,info,sizeof(info)-1,32,20,derivedKey);// ===== 6. PBKDF2密钥派生 =====constchar*password="user-password";uint8_tpbkdf2Salt[]="random-salt";uint8_tkeyFromPassword[32];FlashSwirl_PBKDF2((constuint8_t*)password,strlen(password),pbkdf2Salt,sizeof(pbkdf2Salt)-1,10000,32,20,keyFromPassword);return0;}Go 版本
https://pkg.go.dev/github.com/fzxx/FlashSwirl/GO/FlashSwirl
使用示例:
packagemainimport("bytes""crypto/rand""fmt""FlashSwirl")funcmain(){// 准备密钥和Noncekey:=make([]byte,32)nonce:=make([]byte,24)rand.Read(key)rand.Read(nonce)// ===== 1. 流加密 =====plaintext:=[]byte("Secret message")varencrypted bytes.Buffer FlashSwirl.Encrypt(key,nonce,bytes.NewReader(plaintext),&encrypted,20)vardecrypted bytes.Buffer FlashSwirl.Decrypt(key,nonce,&encrypted,&decrypted,20)fmt.Printf("Decrypted: %s\n",decrypted.Bytes())// ===== 2. AEAD认证加密 =====varaeadEncrypted bytes.Buffer additionalData:=[]byte("context info")FlashSwirl.EncryptAEAD(key,nonce,bytes.NewReader(plaintext),&aeadEncrypted,additionalData,20)varaeadDecrypted bytes.Buffer valid,_:=FlashSwirl.DecryptAEAD(key,nonce,&aeadEncrypted,&aeadDecrypted,additionalData,20)ifvalid{fmt.Printf("AEAD Decrypted: %s\n",aeadDecrypted.Bytes())}// ===== 3. HASH =====message:=[]byte("Hello, FlashSwirl!")hash,_:=FlashSwirl.Hash(bytes.NewReader(message),20)fmt.Printf("Hash: %x\n",hash)// ===== 4. HMAC =====hmacKey:=[]byte("secret-key")hmacResult,_:=FlashSwirl.HMAC(hmacKey,bytes.NewReader(message),20)fmt.Printf("HMAC: %x\n",hmacResult)// ===== 5. HKDF密钥派生 =====salt:=[]byte("random-salt")info:=[]byte("my-app")derivedKey,_:=FlashSwirl.HKDF(key,salt,info,32,20)fmt.Printf("Derived Key: %x\n",derivedKey)// ===== 6. PBKDF2密钥派生 =====password:=[]byte("user-password")pbkdf2Salt:=[]byte("random-salt")keyFromPassword,_:=FlashSwirl.PBKDF2(password,pbkdf2Salt,10000,32,20)fmt.Printf("Key from password: %x\n",keyFromPassword)}JavaScript 版本
https://flashswirl.pages.dev/
CDN引用
<script src="https://cdn.jsdelivr.net/gh/fzxx/FlashSwirl/JS/FlashSwirl.js"></script><script src="https://cdn.statically.io/gh/fzxx/FlashSwirl@main/JS/FlashSwirl.js"></script>使用示例:
// 浏览器环境// <script src="FlashSwirl.js"></script>// Node.js环境// const FlashSwirl = require('./FlashSwirl.js');// 准备密钥和Nonceconstkey=crypto.getRandomValues(newUint8Array(32));constnonce=crypto.getRandomValues(newUint8Array(24));// ===== 1. 流加密 =====constplaintext=newTextEncoder().encode("Secret message");constciphertext=FlashSwirl.encrypt('stream',key,nonce,plaintext,newUint8Array(0),20);constdecrypted=FlashSwirl.decrypt('stream',key,nonce,ciphertext,newUint8Array(0),20);console.log("Decrypted:",newTextDecoder().decode(decrypted));// ===== 2. AEAD认证加密 =====constadditionalData=newTextEncoder().encode("context info");constaeadCiphertext=FlashSwirl.encrypt('aead',key,nonce,plaintext,additionalData,20);constaeadDecrypted=FlashSwirl.decrypt('aead',key,nonce,aeadCiphertext,additionalData,20);console.log("AEAD Decrypted:",newTextDecoder().decode(aeadDecrypted));// ===== 3. HASH =====constmessage=newTextEncoder().encode("Hello, FlashSwirl!");consthash=FlashSwirl.hash(message,20);console.log("Hash:",Array.from(hash).map(b=>b.toString(16).padStart(2,'0')).join(''));// ===== 4. HMAC =====consthmacKey=newTextEncoder().encode("secret-key");consthmacResult=FlashSwirl.hmac(hmacKey,message,20);console.log("HMAC:",Array.from(hmacResult).map(b=>b.toString(16).padStart(2,'0')).join(''));// ===== 5. HKDF密钥派生 =====constsalt=newTextEncoder().encode("random-salt");constinfo=newTextEncoder().encode("my-app");constderivedKey=FlashSwirl.hkdf(key,salt,info,32,20);console.log("Derived Key:",Array.from(derivedKey).map(b=>b.toString(16).padStart(2,'0')).join(''));// ===== 6. PBKDF2密钥派生 =====constpassword=newTextEncoder().encode("user-password");constpbkdf2Salt=newTextEncoder().encode("random-salt");constkeyFromPassword=FlashSwirl.pbkdf2(password,pbkdf2Salt,10000,32,20);console.log("Key from password:",Array.from(keyFromPassword).map(b=>b.toString(16).padStart(2,'0')).join(''));🧑💻开源地址
https://github.com/fzxx/FlashSwirl/
📖 更新日志
更新日志
📚许可证
GNU General Public License 3.0