python加密

字符串与bytes

s = "我爱你"
a = s.encode("utf-8")
b = a.decode("utf-8")
print(a)  # b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'
print(b)  # 我爱你

binascii

binascii模块以更合适的方式展示16进制的字节

import binascii

s = "我爱你"
a = s.encode("utf-8")
b = binascii.b2a_hex(a)
c = binascii.a2b_hex(b)

print(a)  # b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'
print(b)  # b'e68891e788b1e4bda0'
print(c)  # b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'

URL编码

URL编码是一种浏览器用来避免URL中出现特殊字符的编码方式。其原理便是将超出ASCII范围的字符转换成带%的16进制格式。

from urllib import parse


url = "https://www.baidu.com?value=我爱你"
a = parse.quote(url)
b = parse.unquote(a)

print(a)  # https%3A//www.baidu.com%3Fvalue%3D%E6%88%91%E7%88%B1%E4%BD%A0
print(b)  # https://www.baidu.com?value=我爱你

Base64编码

原理

  1. 将所有字符转化为ASCII码。
  2. 将ASCII码转化为8位二进制 。
  3. 将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位。
  4. 统一在6位二进制前补两个0凑足8位。
  5. 将补0后的二进制转为十进制。
  6. 从Base64编码表获取十进制对应的Base64编码。
import base64

s = "我爱你"
a = base64.b64encode(s.encode("utf-8"))
b = base64.b64decode(a)

print(a)  # b'5oiR54ix5L2g'
print(b.decode("utf-8"))  # 我爱你

MD5编码

特点
1、长度固定
2、抗修改性,对于原数据进行任何改变,MD5都会改变
3、强碰撞性,不同文件的MD5值基本上是唯一的
4、不可逆性

import hashlib

s = "我爱你"
md5 = hashlib.md5()
md5.update(s.encode("utf-8"))
a = md5.hexdigest()

key = "123456"
md5_2 = hashlib.md5(bytes(key, encoding="utf-8"))  # 如果有参数,在原先的基础上在做一层加密
md5_2.update(s.encode("utf-8"))
b = md5_2.hexdigest()

print(a)  # 4f2016c6b934d55bd7120e5d0e62cce3
print(b)  # 5054fb0f1535be3289f1ba92027e8325

计算大文件的md5值

import hashlib


def get_file_md5(file):
    m = hashlib.md5()
    while True:
        data = file.read(10240)
        if not data:
            break
        m.update(data)
    return m.hexdigest()


FILE_NAME = "D:/Steam/game.zip"
with open(FILE_NAME, 'rb') as f:
    file_md5 = get_file_md5(f)
print(file_md5)

hmac

import hmac

s = "我爱你"
salt = "123456"
hm = hmac.new(s.encode(encoding="utf-8"), salt.encode(encoding="utf-8"), "MD5")

print(hm.digest())  # b'\x17\xae\xe8\xc3f\xb0\xd0\xee\xd1\x87\xa3=\x1b\xd8%\xb1'
print(hm.hexdigest())  # 17aee8c366b0d0eed187a33d1bd825b1

sha1加密
Security Hash Algorithm(安全哈希算法)。sha1基于MD5,加密后的数据长度更长,更安全。

import hashlib

s = "我爱你"
a = hashlib.sha1(s.encode(encoding="utf-8")).hexdigest()

print(a)  # 5890a73fed38bf09622c34ad9391f1d09c0ec100

DES加密

对称加密体质。DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密的和解密用的是同一个算法。
DES算法的入口参数有3个,key、data、mode。key为工作密钥,7个字节。data为需要加解密的数据。mode为DES的工作模式。
密钥长64位,由56位key和第8、16、24、32、40、48、56、64位校验位组成。

DES加密需要第三方依赖包。pip install pycryptodome

from Crypto.Cipher import DES
import binascii


def pad(text):
    """
    如果加密文本不是8的倍数,需要对文本进行填充
    :param text:
    :return:
    """
    pad_text = (8 - len(text) % 8) * "*" if len(text) % 8 else ""
    return text + pad_text


key = "12345678"
s = "hello, my friend"
des = DES.new(key.encode("utf-8"), DES.MODE_ECB)
data = pad(s)
encrypted_data = des.encrypt(data.encode("utf-8"))
plain_data = des.decrypt(encrypted_data)

print(data)  # hello, my friend
print(binascii.b2a_hex(encrypted_data))  # b'8d0c263b163a0b90eafe513008caa8f6'
print(plain_data)  # b'hello, my friend'

AES

Advanced Encryption Standard

from Crypto.Cipher import AES
from Crypto import Random

import binascii

data = "我爱你"
key = "12345678abcdefgh"  # b密钥key必须位16位、24位或32位
iv = Random.new().read(AES.block_size)
aes_encrypt = AES.new(key.encode("utf-8"), AES.MODE_CFB, iv)
cipher_text = iv + aes_encrypt.encrypt(data.encode("utf-8"))

aes_decrypt = AES.new(key.encode("utf-8"), AES.MODE_CFB, cipher_text[:16])
decrypt_text = aes_decrypt.decrypt(cipher_text[16:])

print(binascii.b2a_hex(iv))  # b'c491c0df41490bb643976ae0672a9b1c'
print(binascii.b2a_hex(cipher_text))  # b'c491c0df41490bb643976ae0672a9b1c598dfd7be91cfbc1ad'
print(decrypt_text.decode("utf-8"))  # 我爱你

RSA

非对称加密
使用openssl,keytools等工具生成一对公私钥对,使用被公钥加密的数据可以使用私钥来解密,反之亦然,使用私钥加密的数据也可以被公钥加密。

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import binascii


class MyRSA:
    def __init__(self):
        self.private_rsa_key = ""  # 密钥
        self.rsa_public_pem = ""  # 公钥

    def create_rsa_key(self, password):
        key = RSA.generate(1024)
        encrypted_key = key.exportKey(passphrase=password.encode("utf-8"), pkcs=8,
                                      protection="scryptAndAES128-CBC")
        self.private_rsa_key = encrypted_key
        self.rsa_public_pem = key.publickey().exportKey()

    def encrypt(self, text):
        recipient_key = RSA.import_key(self.rsa_public_pem)
        cipher_rsa = PKCS1_v1_5.new(recipient_key)
        encrypted_text = cipher_rsa.encrypt(text.encode("utf-8"))
        return encrypted_text

    def decrypt(self, encrypted_text, password):

        private_key = RSA.import_key(self.private_rsa_key, password)
        cipher_rsa = PKCS1_v1_5.new(private_key)
        text = cipher_rsa.decrypt(encrypted_text, None)
        return text


password = "123456"
rsa = MyRSA()
rsa.create_rsa_key(password)
encrypted_text = rsa.encrypt("我爱你")
decrypted_text = rsa.decrypt(encrypted_text, password)

print(binascii.b2a_hex(encrypted_text))
print(decrypted_text.decode("utf-8"))
print(binascii.b2a_hex(rsa.private_rsa_key))
print(binascii.b2a_hex(rsa.rsa_public_pem))

转载文章:Python 常见加密方式和实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容