CryptoJS常用的加密算法使用及原理

1、编码
escape unescape
encodeURIComponent decodeURIComponent
Base64
1、所有的数据都能被编码为只用65个字符就能表示的文本。
标准的Base64每行为76个字符,每行末尾添加一个回车换行符(\r\n)。不论每行是否满76个字符,都要添加一个回车换行符。
2、65字符:A~Z a~z 0~9 + / =
URL Base64算法中,为了安全,会把 + 替换成 – ,把 / 替换成 _
= 有时候用 ~ 或 . 代替
3、Base64的应用
密钥
密文
图片
数据简单加密或者预处理
4、Base64编码解码与btoa(编码)、atob(解码)
Hex
二进制数据最常用的一种表示方式。用0-9 a-f 16个字符表示。每个十六进制字符代表4bit。也就是2个十六进制字符代表一个字节。在实际应用中,尤其在密钥初始化的时候,一定要分清楚自己传进去的密钥是哪种方式编码的,采用对应方式解析,才能得到正确的结果

2、单向散列函数(消息摘要算法)
· 不管明文多长,散列后的密文定长
· 明文不一样,散列后结果一定不一样
· 散列后的密文不可逆
· 一般用于校验数据完整性、签名 sign
由于密文不可逆,所以后台无法还原,也就是说他要验证,会在后台以跟前台一样的方式去重新签名一遍。也就是说他会把源数据和签名后的值一起提交到后台。所以我们要保证在签名时候的数据和提交上去的源数据一致。这种算法特喜欢在内部加入时间戳,很多粗心的学员,通常会在签名的时候取一次时间戳,然后在提交源数据的时候,又取一次时间戳,导致后台验证失败。
· 常见算法
MD5
SHA1
SHA256
SHA512
HmacMD5
HmacSHA1
HmacSHA256

3、加密算法
加密和解密的过程是可逆的
· 对称加密算法
加密/解密使用相同的密钥
DES 数据加密标准
3DES TripleDES DESede
AES 高级加密标准
根据密钥长度不同又分为AES-128 AES-192 AES-256 对应16 24 32 字节
其中AES-192 AES-256在Java中使用需获取无政策限制权限文件
CryptoJS提供ECB,CBC(必须有iv向量),CFB,OFB,CTR五种模式
填充提供NoPadding ZeroPadding Pkcs7(和Java中Pkcs5是一样的) Iso10126(随机) Iso97971 AnsiX923
var cfg = {
mode: CryptoJS.mode.CBC,//加密模式
padding: CryptoJS.pad.Pkcs7,//填充方式
iv: iv
};

· 非对称加密算法

RSA
1、使用公钥加密,使用私钥解密
2、公钥是公开的,私钥保密
3、加密处理安全,但是性能极差,单次加密长度有限制
pkcs1padding 明文最大字节数为密钥字节数-11密文与密钥等长
NoPadding 明文最大字节数为密钥字节数 密文与密钥等长
4、RSA既可用于数据交换,也可用于数据校验
数据校验通常结合消息摘要算法 MD5withRSA 等
5、两种加密算法常见结合套路
随机生成密钥
密钥用于AES/DES/3DES加密数据
RSA对密钥加密
提交加密后的密钥和加密后的数据给服务器
parse和stringify
var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
var wordArray = CryptoJS.enc.Hex.parse(hexString);
var wordArray = CryptoJS.enc.Base64.parse(base64String);
var wordArray = CryptoJS.enc.Latin1.parse(latin1String);

var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
var hexString = CryptoJS.enc.Hex.stringify(wordArray);
var base64String = CryptoJS.enc.Base64.stringify(wordArray);
var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);

CryptoJS.format.OpenSSL.parse
CryptoJS.format.OpenSSL.stringify

Base64与Hex
var srcs = CryptoJS.enc.Utf8.parse(“15968079470”);
CryptoJS.enc.Base64.stringify(srcs);
//CryptoJS.enc.Hex.stringify(srcs);

消息摘要算法
var hash = CryptoJS.MD5(message);
var hash = CryptoJS.MD5(wordArray);
var hmac = CryptoJS.HmacMD5(message, key);

var hash = CryptoJS.SHA1(message);
var hash = CryptoJS.SHA1(wordArray);
var hmac = CryptoJS.HmacSHA1(message, key);

var hash = CryptoJS.SHA224(message);
var hash = CryptoJS.SHA224(wordArray);
var hmac = CryptoJS.HmacSHA224(message, key);

var hash = CryptoJS.SHA256(message);
var hash = CryptoJS.SHA256(wordArray);
var hmac = CryptoJS.HmacSHA256(message, key);

var hash = CryptoJS.SHA3(message);
var hash = CryptoJS.SHA3(wordArray);
var hmac = CryptoJS.HmacSHA3(message, key);

var hash = CryptoJS.SHA384(message);
var hash = CryptoJS.SHA384(wordArray);
var hmac = CryptoJS.HmacSHA384(message, key);

var hash = CryptoJS.SHA512(message);
var hash = CryptoJS.SHA512(wordArray);
var hmac = CryptoJS.HmacSHA512(message, key);

对称加密算法
var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);

var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);

var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);

var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);

==============================================================
var cfg={
iv: iv,
mode:CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7,
format:CryptoJS.format.Hex
};

var srcs = CryptoJS.enc.Hex.parse(“2783726e20d0d334520cbbbb9cd95d9b”);
//CryptoJS.enc.Base64.stringify(srcs);
var decryptdata = CryptoJS.AES.decrypt(
CryptoJS.lib.CipherParams.create({ ciphertext: srcs}),
key,
cfg
);
decryptdata.toString(CryptoJS.enc.Utf8);

==============================================================

加密模式
CBC ECB CFB OFB CTRGladman CTR

填充方式
NoPadding ZeroPadding Pkcs7(Pkcs5) Iso10126 Iso97971 AnsiX923

wordArray转换到字符串
var string = wordArray + ‘’;
var string = wordArray.toString();
var string = wordArray.ciphertext.toString(); //对称加密算法里有

var string = wordArray.toString(CryptoJS.enc.Utf8);
var string = wordArray.toString(CryptoJS.format.Hex);
var string = wordArray.toString(CryptoJS.format.Base64);

另外的调用方式
SHA256
var hasher = CryptoJS.algo.SHA256.create();
hasher.reset();
hasher.update(‘message’);
hasher.update(wordArray);
var hash = hasher.finalize();
var hash = hasher.finalize(‘message’);
var hash = hasher.finalize(wordArray);

HmacSHA256
var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
hmacHasher.reset();
hmacHasher.update(‘message’);
hmacHasher.update(wordArray);
var hmac = hmacHasher.finalize();
var hmac = hmacHasher.finalize(‘message’);
var hmac = hmacHasher.finalize(wordArray);

支持的其他算法
RIPEMD160
HmacRIPEMD160

PBKDF2
CryptoJS.PBKDF2(“22222222222”, “just-code”,{keySize: 8,iterations: 10})

EvpKDF
CryptoJS.EvpKDF(“22222222222”, “just-code”,{keySize: 8,iterations: 10})

RC4Drop
Rabbit 加密用Rabbit 解密用RabbitLegacy
RabbitLegacy 加密解密都用RabbitLegacy
————————————————
版权声明:本文为CSDN博主「不走小道」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21531681/article/details/108608131

CSS3通过:nth-child()选择元素

/* 选择第n个,n位数字 */
:nth-child(n)

选择列表中的偶数标签
:nth-child(2n)

选择列表中的奇数标签
:nth-child(2n-1)

选择前几个元素
/*【负方向范围】选择第1个到第6个 */
:nth-child(-n+6){}

从第几个开始选择
/*【正方向范围】选择从第6个开始的,直到最后 */
:nth-child(n+6){}

两者结合使用,可以限制选择某一个范围
/*【限制范围】选择第6个到第9个,取两者的交集【感谢小伙伴的纠正~】 */
:nth-child(-n+9):nth-child(n+6){}

选择列表中的倒数第n个标签 n为数字
:nth-last-child(n)

批处理对文本文件进行编码转换

iconv是linux下的编码转换工具, windows下的下载地址:

for /r .\ %i in (*.sql) do iconv.exe -f GBK -t UTF-8 %i > %~dpni_utf8.sql

释义:

for /r .\ %i in(*.sql) do

循环 .\ 目录下的所有*.sql文件, 分别处理每个文件, 文件变量 %i

iconv.exe -f GBK -t UTF-8 %i > %~dpni_utf8.sql

用iconv.exe命令做编码转换, -f GBK 指从GBK编码转换, – UTF-8指转换到UTF-8

a > b a和b分别是转换前后的文件名. 上面命令中 a为 %i, 即循环到的每个文件; b 为 %~dpni_utf8.sql, 这里 %….i 是循环到的变量, 可以根据需要做格式化, 中间的 ~dpn是格式化的格式:

d是盘符,
p是路径,
n是文件名(不含扩展名),
x是扩展名,
t是文件的修改时间
s是把文件和路径缩写成8.3格式
z是指文件大小(字节数)
f是指文件名

I.DO