Python/JS实现常见加密算法的示例代码

  • Post author:
  • Post category:python


前言

本文仅仅介绍了常见的一些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实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14


<


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实现

1

2

3

4

5

6


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实现

1

2

3

4

5

6

7

8

9

10

11


<!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实现

1

2

3

4

5

6


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实现

1

2

3

4

5

6

7

8


<!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是数字1




alert(str_encode)  // 0e9f44d42516562396d7b8923542a6a4fc29cd5c




</


script


>


</


html


>


2. SHAI – Python实现

1

2

3

4

5

6


import


hashlib


sha1


=


hashlib.sha1()


str1


=


'i am xz'


sha1.update(str1.encode())


str_encode


=


sha1.hexdigest()


print


(


"SHAI加密:"


, str_encode)


# SHAI加密: 0e9f44d42516562396d7b8923542a6a4fc29cd5c


五、散列消息鉴别码 HMAC


1.HMAC – JS实现

1

2

3

4

5

6

7

8

9

10


<!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实现

1

2

3

4

5

6

7


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实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25


<


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.DES




var 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实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26


<


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.DES




var 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

1

2

3

4

5

6

7

8

9

10


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介绍

特征:加密使用公钥,解密使用私钥,公钥(可以公开暴露出来只能加密),私钥(必须隐藏),成对出现, 私匙是通过公匙计算生成的,不能盲目随机生成,可根据setPublicKey,setPrivateKey 确定是否为非对称RSA加密;

公私匙在线生成:

http://web.chacuo.net/netrsakeypair

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


2. JS-代码示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23


<


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


>



版权声明:本文为sinat_40572875原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。