主要加密算法前言

本文仅仅介绍了常见的一些JS加密,并记录了JS和Python的实现方式

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

(1)base64编码伪加密

(2)线性散列算法(签名算法)MD5

(3)安全哈希算法 SHAI

(4)散列消息鉴别码 HMAC

(5)对称性加密算法 AES,DES

(6)非对称性加密算法 RSA

一、编码,加密?

1. 什么是编码?

编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码;

2. 什么是加密?

加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。

二、常见编码

1.Base64

base64是基于64个可打印ascii字符对任意字节数据进行编码算法,base64是一种编码方式而不是加密算法。只是看上去像是加密而已;

Base64使用A–Z,a–z,0–9,+,/ 这64个字符实现对数据进行加密。

2. Base64 - JS实现

<html><script type="text/javascript">// 创建Base64对象var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}// 定义字符串var string = 'i am xz!';// 加密var encodedString = Base64.encode(string);alert(encodedString);// 解密var decodedString = Base64.decode(encodedString);alert(decodedString);</script>
</html>    

3. Base64 - Python实现

import base64                                   str1 = 'i am xz'
str_encode = base64.b64encode(str1.encode())
print("Base64编码:", str_encode)
str_decode = base64.b64decode(str_encode)
print("Base64解码:", str_decode) 

4.Unicode

Unicode是计算机中字符集,编码的一项业界标准,被称为统一码,万国码,
表现形式一般以"\u"或"&#"开头;

5.Urlencode

urlencode是URL编码,也称作百分号编码,用于把url的符号进行转换;

三、线性散列算法(签名算法)MD5

1.MD5介绍

MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value)。
特征:MD5加密之后产生的是一个固定长度(32位或16位)的数据,常规讲MD5是不存在解密的。
使用场景:注册账号时的密码一般都是用的MD5加密。

2. MD5 - JS实现

<!DOCTYPE html>
<html lang="en"><!-- md5源码地址:https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js --><!-- md5常用于登录--><script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script><script type="text/javascript">var str1 = 'i am xz'var str_encode = md5(str1);alert(str_encode) // 在弹窗中输出文本 f0404c7b9bff0bde8d6df8b64759960f</script>
</html>  

3. MD5 - Python实现

import hashlib                str1 = 'i am xz'
m = hashlib.md5()
m.update(str1.encode('utf-8'))
str_encode = m.hexdigest()
print("MD5加密:", str_encode)  # MD5加密: f0404c7b9bff0bde8d6df8b64759960f  

四、安全哈希算法 SHAI

1. SHAI - JS实现

<!DOCTYPE html><script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script><script>var str1 = 'i am xz';var str_encode = CryptoJS.SHA1(str1).toString(); // 注意:1是数字1alert(str_encode)  // 0e9f44d42516562396d7b8923542a6a4fc29cd5c</script>
</html>   


2. SHAI - Python实现

import hashlibsha1 = hashlib.sha1()
str1 = 'i am xz'
sha1.update(str1.encode())
str_encode = sha1.hexdigest()
print("SHAI加密:", str_encode)  # SHAI加密: 0e9f44d42516562396d7b8923542a6a4fc29cd5c 

五、散列消息鉴别码 HMAC

1.HMAC - JS实现

<!DOCTYPE html><script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script><script>var key = 'key';var str1 = 'i am xz';var hash = CryptoJS.HmacSHA256(key, str1);var str_encode = CryptoJS.enc.Hex.stringify(hash);alert(str_encode)  // '11a7960cd583ee2c3f1ed910dbc3b6c3991207cbc527d122f69e84d13cc5ce5c'</script>
</html> 


2. HMAC - Python实现

import hmac
import hashlib
key = 'key'
str1 = 'i am xz'
mac = hmac.new(key=key.encode(), msg=str1.encode(), digestmod=hashlib.sha256)
mac.digest()
str_encode = mac.hexdigest()
print("HMAC加密:", str_encode)  # HMAC加密: e5137adac855050a62c7434b01bb97229f9e1a8fd5b45364e4035d28885b0852      

六、对称加密 AES、DES

1. AES,DES介绍

AES和DES的区别:加密后密文长度的不同,DES加密后密文长度是8的整数倍,AES加密后密文长度是16的整数倍;
特征:对称加密特征,加密和解密需要相同的密钥DES;
应用场景:企业级开发使用DES足够安全,要求高使用AES;

2. AES - JS实现

<html><script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script><script type="text/javascript">var aseKey = "12345678"     // 定制秘钥,长度必须为:8/16/32位, 长度不一致也没问题var message = "i am xz";  // 需要加密的内容// 加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DESvar encrypt = CryptoJS.AES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey),  // 参数1=密钥, 参数2=加密内容{mode: CryptoJS.mode.ECB, // 为DES的工作方式padding: CryptoJS.pad.Pkcs7  // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符}).toString(); // toString=转字符串类型alert(encrypt); // 在弹窗中打印字符串 2vcsEDJv9vAZZLgFLjkZ9A==//解密var decrypt = CryptoJS.AES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), // 参数1=密钥, 参数2=解密内容{mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8); // toString=转字符串类型,并指定编码alert(decrypt); // "i am xz"</script>
</html>                


3. DES - JS实现

<html><!-- 对称加密特征,加密和解密需要相同的密钥DES,AES--><script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script><script type="text/javascript">var aseKey = "12345678"     // 定制秘钥,长度必须为:8/16/32位, 长度不一致也没问题var message = "i am xiaozhou ?";  // 需要加密的内容// 加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DESvar encrypt = CryptoJS.DES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey),  // 参数1=密钥, 参数2=加密内容{mode: CryptoJS.mode.ECB, // 为DES的工作方式padding: CryptoJS.pad.Pkcs7  // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符}).toString(); // toString=转字符串类型alert(encrypt); // 控制台打印 CDVNwmEwDRM//解密var decrypt = CryptoJS.DES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), // 参数1=密钥, 参数2=解密内容{mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8); // toString=转字符串类型,并指定编码alert(decrypt); // 控制台打印 "i am xiaozhou ?"</script>
</html>               


4. DES - Python实现

pip 安装: pip intall pyDes -i https://pypi.tuna.tsinghua.edu.cn/simple

import binascii
from pyDes import des, CBC, PAD_PKCS5                                                                          deskey = '12345678'
message = 'i am xz'
des_encrypt = des(key=deskey, mode=CBC, IV=deskey, padmode=PAD_PKCS5)
str_encode = binascii.b2a_hex(des_encrypt.encrypt(message, padmode=PAD_PKCS5))  # .decode('utf-8')
print("DES加密:", str_encode)  # DES加密: b'b8a5ac525c77aad0'                                                                                                                                                     str_decrypt = des(key=deskey, mode=CBC, IV=deskey, padmode=PAD_PKCS5)
str_decode = str_decrypt.decrypt(binascii.a2b_hex(str_encode), padmode=PAD_PKCS5)
print("DES解密:", str_decode)  # DES解密: b'i am xz'   

七、非对称加密RSA

1. RSA介绍

公私匙在线生成

应用场景:公开密钥加密和电子商业中RSA被广泛使用,支付密码会通过RSA加密;

2. JS-代码示例

<html><!-- 公私匙可以在线生成:http://web.chacuo.net/netrsakeypair --><!-- 非对称加密特征,加密使用公钥和解密使用私钥,公钥(可以公开暴露出来,只能加密)和私钥(必须隐藏)成对出现,公钥和私钥有着某种联系 RSA --><script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script><script type="text/javascript">// 公钥 私匙是通过公匙计算生成的,不能盲目设置var PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALyBJ6kZ/VFJYTV3vOC07jqWIqgyvHulv6us/8wzlSBqQ2+eOTX7s5zKfXY40yZWDoCaIGk+tP/sc0D6dQzjaxECAwEAAQ==-----END PUBLIC KEY-----';//私钥var PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvIEnqRn9UUlhNXe84LTuOpYiqDK8e6W/q6z/zDOVIGpDb545NfuznMp9djjTJlYOgJogaT60/+xzQPp1DONrEQIDAQABAkEAu7DFsqQEDDnKJpiwYfUE9ySiIWNTNLJWZDN/Bu2dYIV4DO2A5aHZfMe48rga5BkoWq2LALlY3tqsOFTe3M6yoQIhAOSfSAU3H6jIOnlEiZabUrVGqiFLCb5Ut3Jz9NN+5p59AiEA0xQDMrxWBBJ9BYq6RRY4pXwa/MthX/8Hy+3GnvNw/yUCIG/3Ee578KVYakq5pih8KSVeVjO37C2qj60d3Ok3XPqBAiEAqGPvxTsAuBDz0kcBIPqASGzArumljkrLsoHHkakOfU0CIDuhxKQwHlXFDO79ppYAPcVO3bph672qGD84YUaHF+pQ-----END PRIVATE KEY-----';//使用公钥加密var encrypt = new JSEncrypt();//实例化加密对象encrypt.setPublicKey(PUBLIC_KEY);//设置公钥var message = 'hello xiaozhou!' // 需要加密的数据 var encrypted = encrypt.encrypt(message);//对指定数据进行加密alert(encrypted)  // 'JQ83h8tmJpsSZcb4BJ3eQvuqIAs3ejepcUUnoFhQEvum8fA8bf1Y/fG+DO1bSIVNJF6EOZKe4wa0njv6aOar9w=='//使用私钥解密var decrypt = new JSEncrypt(); // 创建解密对象decrypt.setPrivateKey(PRIVATE_KEY); //设置私钥var uncrypted = decrypt.decrypt(encrypted); //解密 'hello xiaozhou!'alert(uncrypted);</script><!-- 总结:可根据setPublicKey,setPrivateKey 确定是否为非对称RSA加密 -->
</html>

JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现相关推荐

  1. aes加密算法python语言实现_python实现AES/DES/RSA/MD5/SM2/SM4/3DES加密算法模板汇总

    都是作者累积的,且看其珍惜,大家可以尽量可以保存一下,如果转载请写好出处https://www.cnblogs.com/pythonywy 一.md5加密 1.简介 这是一种使用非常广泛的加密方式,不 ...

  2. JS逆向加密-Cryptojs库AES/DES/RSA等代码

    目录 一.crypto-js 二.nodejs之md5.sha1.sha256.base64 三.crypto-js之AES 四.crypto-js之DES 五.crypto-js之3DES 六.Py ...

  3. 常见加密方式DES、AES

    1. 对称加密 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. 示例: 我们现在有一个原文3要发送给B 设置密钥为108, 3 * 1 ...

  4. aes 256 ecb 加解密 pkcs7补全 python JS

    python aes 256 ecb 加解密 功能 实现 Python ECB 256 JS版本 ECB 算法 JS版本 CBC 算法Pkcs7填充 SQL AES 在线验证网站 notice 功能 ...

  5. base64编码解码js

    base64: html代码: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"&g ...

  6. as3 crypto 加密解密des,rsa

    des实例: <?xml version="1.0″ encoding="utf-8″?> <s:Application xmlns:fx="http: ...

  7. python可逆加密算法_常见加密方式及Python实现

    由于计算机软件的非法复制,通信的泄密.数据安全受到威胁,所以加密在开发过程中是经常使用到的技术,在一些重要场景中都有所应用,如:登录.支付.oauth等,场景不同需要搭配不一样的签名加密算法来达到业务 ...

  8. Java 加密 AES 对称加密算法

    版权声明:本文为博主原创文章,未经博主允许不得转载. [AES] 一种对称加密算法,DES的取代者. 加密相关文章见:Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES R ...

  9. python3 rsa加密_python3产生RSA秘钥对并执行加解密操作详解

    加密使用的是公钥对数据进行加密,而且当你使用一把1024bit的rsa公钥的时候,你一次只能加密最多117byte的数据,如果数据量超过这个数,可能会涉及到对数据进行分段加密的问题.而且现在rsa 1 ...

最新文章

  1. 江湖急诏令:腾讯数据库王者挑战赛赏金万两募英豪!
  2. Error starting static Resources caused by project facet
  3. IEnumerable.OrderBy().First() 在 .netcore 3.1 中是否做了优化?
  4. org.hibernate.MappingException: Could not determine type for: java.util.List, at table: user, for...
  5. python中常见的运行时错误_新手常见Python运行时错误汇总
  6. RabbitMQ基本管理(下)
  7. java输入验证码代码,JavaWeb 实现验证码功能(demo)
  8. JAAS(Java 认证和授权服务)
  9. Mina MEID/GSM Activator 1.0 三网信号激活,支持iOS12.0~14.8.1
  10. 域名被污染解决方法及DNS污染清洗方法
  11. CyberSecurity Knowledge Base笔记
  12. dataframe 对象中统计每个列的所有数的和,或者每一行所有值的和
  13. 用JSP/Servlet构建三层式管理信息系统
  14. static(静态变量,方法)
  15. 豪沃轻abs12v电是什么系统_小汽车显示abs是什么问题,ABS系统介绍
  16. GoLand+Delve(dlv) 远程调试
  17. 现实中如何评判路遥《人生》中的高加林?
  18. 无需翻墙的Google瓦片地图地址
  19. 腾讯安全发布《银行业数据安全白皮书》 指明建设数据安全体系四大要素
  20. 我的世界服务器整人系列,整人新思路?《我的世界》人气最高的模组 好兄弟看完怀疑人生...

热门文章

  1. Yolov5-5.0源码分享以及环境配置——Yolov5训练及测试教程(超详细含数据集制作,格式转换,数据集划分)
  2. oracle12c数据库安装(静默安装)
  3. Oracle EBS OM Drop Ship Orders(直发业务)技术-API和核心表关联关系介绍
  4. php iframe referer,【技术分享】通过iframe注入实现referer欺骗
  5. 新能源控制器,新能源汽车车载双向OBC,PFC,LLC,V2G 双向 充电桩 电动汽车 车载充电机 充放电机 MATLAB仿真模型
  6. Jenkins Generic Webhook Trigger 插件使用
  7. 0/0型极限(等价无穷小)
  8. 0、‘0‘、‘\0‘的区分和联系
  9. SpringBoot(一)
  10. 两个阶跃函数相加或相减的傅里叶变换