js中常见的数据加密与解密的方法

JavaScript022

js中常见的数据加密与解密的方法,第1张

加密在我们前端的开发中也是经常遇见的。本文只把我们常用的加密方法进行总结。不去纠结加密的具体实现方式(密码学,太庞大了)。

常见的加密算法基本分为这几类,

RSA加密:RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。(这才是正经的加密算法)

非对称加密算法:非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法

DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

AES这个标准用来替代原先的DES

DES/AES我们合并在一起介绍其用法和特点

Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法。只是看上去像是加密而已(吓唬人)。

// node的crypto模块

DH算法是一种密钥交换协议,它可以让双方在不泄漏密钥的情况下协商出一个密钥来。

示例见 https://www.liaoxuefeng.com/wiki/1022910821149312/1023025778520640

SHA-1不够安全,不能继续使用,是SHA-1的后继者

用javascript实现rsa加解密的实现方式是通过PKCS完成的。

1、整个定义的function

function pkcs1pad2(s,n) {

if(n <s.length + 11) { // TODO: fix for utf-8

alert("Message too long for RSA")

return null

}

var ba = new Array()

var i = s.length - 1

while(i >= 0 &&n >0) {

var c = s.charCodeAt(i--)

//UTF-8编码为变长字节,使用实际的字节来记录

if(c <128) { // encode using utf-8

ba[--n] = c

}

else if((c >127) &&(c <2048)) {

ba[--n] = (c &63) | 128

ba[--n] = (c >>6) | 192

}

else {

ba[--n] = (c &63) | 128

ba[--n] = ((c >>6) &63) | 128

ba[--n] = (c >>12) | 224

}

}

//实际输入拼装结束,将下一位赋值为0标记结束

ba[--n] = 0

var rng = new SecureRandom()

var x = new Array()

//拼接随机非0字节

while(n >2) { // random non-zero pad

x[0] = 0

while(x[0] == 0) rng.nextBytes(x)

ba[--n] = x[0]

}

//这两位做简单的校验

ba[--n] = 2

ba[--n] = 0

return new BigInteger(ba)

}

该方法中对UTF-8字符进行了兼容,并且在拼装完实际输入的字符后,还拼装了随机的字节,使用拼装后的字符串去加密。由于每次拼装的结果是随机的,这样每次加密后的密文都不同。

2、调用方法:;

function RSAEncrypt(text) {

var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3)

if(m == null) return null

var c = this.doPublic(m)

if(c == null) return null

var h = c.toString(16)

if((h.length &1) == 0) return helse return "0" + h

}