aes對稱加密演算法下有好多種演算法,往往很難做到垮語言的加密解密,本文提供一套c#和node.js可以相互加密解密通用的**之aes-256-cbc演算法:
1、aes所有的鑰匙必須 128位(16位元組),192位(24位元組)或256位(32位元組)長
2、有幾種操作模式,每個都有不同的優點和缺點。一般來說,建議用cbc和ctr模式。不推薦ecb(據說完整性不好)
aes-256-cbc c#**
using system.security.cryptography;
publicaes-256-cbc node.js演算法class
aes ;
//////
aes加密
/// ///
要加密的字元
///對應的金鑰(不可為中文,不能超過32個字元,超過32個字元的擷取前32個字元)
///返回base64格式的字串
public
static
string encode(string encryptstring, string
encryptkey)
if (string
.isnullorempty(encryptkey))
if(encryptkey.length > 32
) encryptkey = stringutility.cutstring(encryptkey, 0, 32
);
if (encryptkey.length < 32
) encryptkey = encryptkey.padright(32, '0'
); rijndaelmanaged rijndaelprovider = new
rijndaelmanaged();
rijndaelprovider.key =encoding.utf8.getbytes(encryptkey);
rijndaelprovider.iv =_vector;
rijndaelprovider.padding = paddingmode.pkcs7; //
填充模式
icryptotransform rijndaelencrypt =rijndaelprovider.createencryptor();
byte inputdata =encoding.utf8.getbytes(encryptstring);
byte encrypteddata = rijndaelencrypt.transformfinalblock(inputdata, 0
, inputdata.length);
return
convert.tobase64string(encrypteddata);
}//////
aes解密
/// ///
要解密的字元(該字元必須是已經加密過的base64格式的字串)
///解密的金鑰,該金鑰要和加密的金鑰一致(不可為中文,不能超過32個字元,超過32個字元的擷取前32個字元)
///解密後的字串
public
static
string decode(string decryptstring, string
decryptkey)
if (string
.isnullorempty(decryptkey))
if (decryptkey.length > 32
) decryptkey = stringutility.cutstring(decryptkey, 0, 32
);
if (decryptkey.length < 32
) decryptkey = decryptkey.padright(32, '0'
); rijndaelmanaged rijndaelprovider = new
rijndaelmanaged();
rijndaelprovider.key =encoding.utf8.getbytes(decryptkey);
rijndaelprovider.iv =_vector;
rijndaelprovider.padding = paddingmode.pkcs7; //
填充模式
icryptotransform rijndaeldecrypt =rijndaelprovider.createdecryptor();
byte inputdata =convert.frombase64string(decryptstring);
byte decrypteddata = rijndaeldecrypt.transformfinalblock(inputdata, 0
, inputdata.length);
return
encoding.utf8.getstring(decrypteddata);
}catch
}public
static
string decode(string decryptstring, string decryptkey, byte
my_vector)
if (string
.isnullorempty(decryptkey))
if (decryptkey.length > 32
) decryptkey = stringutility.cutstring(decryptkey, 0, 32
);
if (decryptkey.length < 32
) decryptkey = decryptkey.padright(32, '0'
); rijndaelmanaged rijndaelprovider = new
rijndaelmanaged();
rijndaelprovider.key =encoding.utf8.getbytes(decryptkey);
rijndaelprovider.iv =_vector;
rijndaelprovider.padding = paddingmode.pkcs7; //
填充模式
icryptotransform rijndaeldecrypt =rijndaelprovider.createdecryptor();
byte inputdata =convert.frombase64string(decryptstring);
byte decrypteddata = rijndaeldecrypt.transformfinalblock(inputdata, 0
, inputdata.length);
string uid =encoding.utf8.getstring(decrypteddata);
guid id =guid.empty;
if (guid.tryparse(uid, out id)) //
當前token解成功了
else
}catch}}
var crypto = require('crypto');/*** 加密方法
* @param key 加密key
* @param iv 向量
* @param data 需要加密的資料
* @returns string */
var encrypt = function
(key, iv, data) ;/**
* 解密方法
* @param key 解密的key
* @param iv 向量
* @param crypted 密文
* @returns string */
var decrypt = function
(key, iv, crypted) ;
var key = '[email protected]';
console.log('加密的key:', key.tostring('hex'));
var iv = 'areyounysnowman?';
console.log('加密的iv:', iv);
var data = "5c3bb4fe-2fcc-49b7-b58a-10520a8a0fb2";
console.log("需要加密的資料:", data);
var crypted =encrypt(key, iv, data);
console.log("資料加密後:", crypted);
var dec =decrypt(key, iv, crypted);
console.log("資料解密後:", dec);
AES加密演算法
aes加密演算法 加密模式 ecb模式 優點 1.簡單 2.有利於平行計算 3.誤差不會被傳送 缺點 1.不能隱藏明文的模式 2.可能對明文進行主動攻擊 cbc模式 優點 1.不容易主動攻擊,安全性好於ecb,適合傳輸長度長的報文,是ssl ipsec的標準。缺點 1.不利於平行計算 2.誤差傳遞 ...
AES加密演算法
aes的基本要求是 比三重des快 至少與三重des一樣安全 資料分組長度為128 bit 金鑰長度為128 192 256 bit,對應於金鑰的不同長度,加密輪的次數也不盡相同。選定rijndael演算法為新的aes演算法。演算法的原型是square演算法,其設計策略為寬軌跡策略 針對差分分析和線...
AES加密演算法 C
先搞定aes演算法,基本變換包括subbytes 位元組替代 shiftrows 行移位 mixcolumns 列混淆 addroundkey 輪金鑰加 其演算法一般描述為 明文及金鑰的組織排列方式 bytesubstitution 位元組替代 非線性的位元組替代,單獨處理每個位元組 求該位元組在有...