常用加密算法的javascript (node版) 实现

常用加密算法的javascript (node版) 实现

0 背景

常用加密算法的javascript (node版) 实现

在之前的文章,我们陆续介绍了一些常用加密算法在python & java中的应用实现: 常用加密算法的python实现 & 常用加密算法的java实现,在数据采集过程中,许多网站为了防止恶意爬虫和保护自身数据,会采用各种反爬虫机制,其中之一就是使用加解密算法对请求和响应进行加密处理,而了解这些加解密算法可以帮助我们更好地理解和应对这些反爬虫机制,提高爬虫的效率和成功率,同时可以让我们对这些加密数据进行解密处理,从而获取所需的数据并进行分析。

我们再介绍一下,

常用的加密算法可以分为以下几种:

哈希算法

MD5SHA1SHA256算法等,这种加密方式将原始数据,转换为固定长度的散列值。这是一种消息摘要算法,一种单向加密的过程,就是数据一旦被加密,就不能还原成原来的数据.

对称加密算法

AESDES3DES 算法是一种堆成加密算法,这类算法使用同一个密钥进行加密和解密。对称加密算法因其高效率和较低的计算需求而被广泛应用于需要加密大量数据的场景, 在大量数据加解密的时候, 速度相比于非对称加密算法是非常快的。

非对称加密算法

RSADSA等算法,在加密和解密的过程中,分别使用不同的密钥进行数据的加密和解密,这两个密钥分别是公钥和私钥,这两个密钥是相关联的,但彼此不同。通常,一个是公钥,用来公开分享,用于数据的加密,另一个是私钥,自己保密,不让别人知道,用来进行数据的解密.

非对称加密算法主要用于密钥管理和数据认证场景,由于其计算过程较为复杂,一般不直接用于大规模数据加密。一般有以下一些场景应用:

  1. 密钥交换:如SSL/TLS握手过程中,使用非对称加密来安全地交换对称加密的密钥。
  2. 数字签名:用于证明数字文档的真实性和完整性,如电子邮件签名、软件签名和数字合同。
  3. 身份验证:在多种网络协议和认证服务中,验证用户或设备的身份。
  4. 安全邮件服务:例如,PGP和S/MIME用于电子邮件加密和签名。
  5. 区块链和加密货币:用于创建和验证交易,如比特币和其他加密货币的交易。

1 算法实现

md5

const crypto = require('crypto');


function encode_md5(text{
    const md5 = crypto.createHash('md5');
    return md5.update(text,'utf8').digest('hex');
}

const text = '1';
console.log('encode_md5: ',encode_md5(text));

// encode_md5:  c4ca4238a0b923820dcc509a6f75849b

sha256

const crypto = require('crypto');

function encode_sha256(text{
    const md5 = crypto.createHash('sha256');
    return md5.update(text,'utf8').digest('hex');
}

const text = '1';
console.log('encode_sha256: ',encode_sha256(text));

// encode_sha256:  6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b

base64

编码 & 解码

function encode_base64(text{
    return Buffer.from(text).toString('base64');
}

function decode_base64(text{
    return Buffer.from(text,'base64').toString('utf8');
}

const text = '1';
console.log('encode_base64: ',encode_base64(text));

const text2 = 'MQ==';
console.log('decode_base64: ',decode_base64(text2));


// encode_base64:  MQ==
// decode_base64:  1

aes

const crypto = require('crypto');

function encrypt_aes(text,key,iv = '') {
    // const cipher = crypto.createCipheriv('aes-256-cbc',key,iv);
    const cipher = crypto.createCipheriv('aes-128-ecb',key,iv);
    const encrypted = Buffer.concat([cipher.update(text,'utf8'),cipher.final()]);
    return encrypted.toString('hex');
    // or
    // const cipher = crypto.createCipheriv('aes-128-ecb',key,'');
    // let encrypted = cipher.update(text,'utf8','hex');
    // encrypted += cipher.final('hex');
    // return encrypted;
}

function decrypt_aes(text,key,iv = '') {
    // const decipher = crypto.createDecipheriv('aes-256-cbc',key,iv);
    const decipher = crypto.createDecipheriv('aes-128-ecb',key,iv);
    const decrypted = Buffer.concat([decipher.update(Buffer.from(text,'hex')),decipher.final()]);
    return decrypted.toString('utf8');
    // or
    // const decipher = crypto.createDecipheriv('aes-128-ecb',key,'');
    // let decrypted = decipher.update(ciphertext,'hex','utf8');
    // decrypted += decipher.final('utf8');
    // return decrypted;
}

const key = 'c4ca4238a0b92382';
const text = '1';
console.log('encrypt_aes: ',encrypt_aes(text,key));

const text2 = '8ea10a8b8d615d02324396c3df45ab08';
console.log('decrypt_aes: ',decrypt_aes(text2,key));


// encrypt_aes:  8ea10a8b8d615d02324396c3df45ab08
// decrypt_aes:  1

rsa

const crypto = require('crypto');

function encrypt_rsa(plaintext,publicKey{
    const buffer = Buffer.from(plaintext,'utf8');
    const encrypted = crypto.publicEncrypt(publicKey,buffer);
    return encrypted.toString('base64');
}


function decrypt_rsa(ciphertext,privateKey{
    const buffer = Buffer.from(ciphertext,'base64');
    const decrypted = crypto.privateDecrypt(privateKey,buffer);
    return decrypted.toString('utf8');
}

publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwM8V/KzcLL9Kz+SQa73D
8qC845upKFDbzOXQCK5IrlR52fGSH2uD36ZviGBP0IPGDjhnmJvdc+xvYSvvAYhK
H/cDCcDL580zB6LN81KuMcfPfwaUgprmmkNICtiI+HL9XdKB4W/U9ronJ80DfeJq
fDdZ/0y+ua7T8v0MjaAviryHtsuB6vIhuFvwD5WmJx+B/qBTNmmGhZNt1wNXSA0S
VfX5rImb2Zt030HgmrUSqDVKTgU5/B81kBRbgwTtGk4u+JHNC0+lk9xWakTC7YmO
1ICVP1hxJ935PmuNJaKaFxvDBWCpmoJ40/BvoL26MlfUAffZyWs26K+lvDWjpudi
JQIDAQAB
-----END PUBLIC KEY-----`

privateKey = `-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwM8V/KzcLL9Kz+SQa73D8qC845upKFDbzOXQCK5IrlR52fGS
H2uD36ZviGBP0IPGDjhnmJvdc+xvYSvvAYhKH/cDCcDL580zB6LN81KuMcfPfwaU
gprmmkNICtiI+HL9XdKB4W/U9ronJ80DfeJqfDdZ/0y+ua7T8v0MjaAviryHtsuB
6vIhuFvwD5WmJx+B/qBTNmmGhZNt1wNXSA0SVfX5rImb2Zt030HgmrUSqDVKTgU5
/B81kBRbgwTtGk4u+JHNC0+lk9xWakTC7YmO1ICVP1hxJ935PmuNJaKaFxvDBWCp
moJ40/BvoL26MlfUAffZyWs26K+lvDWjpudiJQIDAQABAoIBAAFd1mGOlhbpGi4k
CBQDac6f7gbM9SN4gz5OCK3vEkvOBHkTeb4oRGyC4Pp9+ELZlD9Ijg9qV2T5cYam
SZDgtunIFejtSWSwsyJkOIJ3fQ2URXe4g7fzQhwoyutswnfEVOBj3BDNepxvEFT7
YoFzZ97Og6BIGnf1ccIgogSk9IFOtpwlqYb3v0RveNo9TbVKXh51pGPumWD0jKrO
o5G9P7TMw89QIpFLvuTzFmm6RYmexxspJZtqH1uR9sB6BV/HOQmJuERCkcQnCUBP
HUQLFVYn4AnH8/Bbq4wClJ09zwIXTSzN7krZJh12J3IfDBi5POY7mmJbeXWJzy/Q
k9KaWwECgYEAy1zMLKJvVRamG3C9Fv+LyQ+Ckv3B+45FekMw5u9zMgKe5ibhys9V
4cgiPGoR4Q36asfhdQvXtctuhYd1r6ZIB88njhaAgsAeVsw/63gN8W9GAZPK6hXx
l0zE9yVOworjDuLlryTB1YIdFQgBMtIWHr0at0y5OeOTVBF9JG8AwYECgYEA8rb9
CFQ1gvSF/8SDKbHec0+yFm6rx9YALLLKyoXk3CpL/kK5PjO1n+8tOEUz/q65O5i9
HIjQ2yZL0vv11R/sWf9jMFzJnDqjC9PUBn5iVD0nu0Px/Ncq/Pzg7+8CaacOZUPD
8yQ3s8rtCFOSzGTBxzJmTTi1ZXO9ZoqcCbprqqUCgYEApiqnMnlvmwkspRNTjm00
nQ8tVEpArPmtT5+DX8+cQurdR5XRvVP5CsnrH45UGZ7AVWwJjwgkNAmLv1PWF7Y4
+RiNa457Z1rv72Bpgk/QpMyVWUiX7voLM+OotYEof9HYghtoLdpM/9aXSM4HnK0J
IgjGwavRVbnccj7wEEsbRQECgYEAt2Cv3loZL/7lOu/TFW5wnnipGa+2E77I1Pyk
oMz2s601Sz5ITQmugM6pQKlwdky2YKOuxd9MxTay9Q4ulz6OSRTecQy5ulLHG0mJ
GPrl+bVWznKwYxKCRTAeFsli7kYsZzAC3TIQ78MywSa7c7fwfDrE9jURQDxo7g9t
gyAY9o0CgYAFMZmZPCMBeVVG+cWBYgzSnCV53FHBV6Us7B3BynbsLXJR0sV6mm87
TVnKO9yhru5GnXAWs9L3esT0OKgVPVL//y9n7XWqDy02mOxzAQd5yJJk7LxaBC/U
1fZj1OitsPEpFI0XL1DoIHM0SK6rwwAXcnewVhBjFDyxgBOnOgI0dQ==
-----END RSA PRIVATE KEY-----`


const plaintext = '1';
const encryptedText = encrypt_rsa(plaintext,publicKey);
console.log('Encrypted Text:',encryptedText);

const decryptedText = decrypt_rsa(encryptedText,privateKey);
console.log('Decrypted Text:',decryptedText);


// Encrypted Text: aXr8A8GiCGJL31BL+N8qc0Ottp1WgUUyaR5uhJHxhzt4uj+w896bXq0GoDRVkELopHyiQHtBew80JVRP2JVu9d4WasihVCUvd2ZyydI2T0Bv4uZze/qt6xC/5pmKkXAf4X5ygr5GOgAOEjD5r+dPT9TXp+iCYlAGzIhVgZpYz1
// QA791S0sFnvZ15vPy4Nu23zNibucO/8jLLgq9n+15X4a0UUALIM/iP4KygmYmKsj9wSFypKi9IpuoDwqZkF60hH6BU6/STjyctf7n0Jl5cCGmxFhAwn6XuQvohxWo4NRtTHsNXECT39Ll0bBcgS+48rBzKKifrV/hBbxM+g1Ru+w==
// Decrypted Text: 1

2 关于

在网页js逆向的时候,了解一些常用的js加密算法,在爬虫工作中,可以让我们在node中实现复现一些在网页中的加密的算法.

欢迎关注我的微信公众号


原文始发于微信公众号(其之):常用加密算法的javascript (node版) 实现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204839.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!