python实现AES算法及AES-CFB8加解密源码

目录
  • Python实现AES算法
    • 生成轮密钥
    • 加密
    • 解密
    • 完整代码如下
    • 测试
    • 测试程序
  • Python实现AES-CFB8加解密

Python实现AES算法

密码学课程老师留的作业,我觉得用python实现更简单,就用python写了一个加解密的程序。
程序分成三个部分,一个部分是生成轮密钥,一个加密,一个是解密。

生成轮密钥

这个部分要看是不是四的倍数,非四的倍数是简单的,直接异或就可以了。如果是4的倍数,这时就需要执行字节代替和异或运算。

for i in range(4):#把16进制转成十进制
            for j in range(0, 8, 2 ):
                self.subkey[i].append('0x'+key[i*8+j:i*8+j+2])
for i in range(4,44):#生成密钥
    if i%4 !=0:
        tmp = xor_32(self.subkey[i-1], self.subkey[i-4])
        self.subkey.append(tmp)
     else:#4的倍数的时候执行
          tmp1 = self.subkey[i-1][1:]
          tmp1.append(self.subkey[i-1][0])
          tmp1 = self.S_box(tmp1) #字节代替
          tmp1 = xor_32(tmp1,self.Rcon[i/4])#和Rcon异或
          self.subkey.append(xor_32(tmp1,self.subkey[i-4]))

加密

加密时最难实现的是列混淆,因为要实现域上的乘法,没想到用递归实现的好方法,还是把一个一个用if判断来进行运算。

解密

解密的时候最难的仍然是逆列混淆运算,仍然是最傻的if判断。

完整代码如下

# -*- coding: utf-8 -*-
"""
Created on Fri Nov  1 18:47:24 2019
@author: pkill
"""
class AesCryption:
    s_box = { #字节替换s盒
            0:['0x63', '0x7c', '0x77', '0x7b', '0xf2', '0x6b', '0x6f', '0xc5', '0x30', '0x01', '0x67', '0x2b',
               '0xfe', '0xd7', '0xab', '0x76'],
               1:['0xca', '0x82', '0xc9', '0x7d', '0xfa', '0x59', '0x47', '0xf0', '0xad', '0xd4', '0xa2', '0xaf', '0x9c', '0xa4', '0x72', '0xc0'],
               2:['0xb7', '0xfd', '0x93', '0x26', '0x36', '0x3f', '0xf7', '0xcc', '0x34', '0xa5', '0xe5', '0xf1',  '0x71', '0xd8', '0x31', '0x15'],
               3:['0x04', '0xc7', '0x23', '0xc3', '0x18', '0x96', '0x05', '0x9a', '0x07', '0x12', '0x80', '0xe2', '0xeb', '0x27', '0xb2', '0x75'],
               4:['0x09', '0x83', '0x2c', '0x1a', '0x1b', '0x6e', '0x5a', '0xa0', '0x52', '0x3b', '0xd6', '0xb3', '0x29', '0xe3', '0x2f', '0x84'],
               5:['0x53', '0xd1', '0x00', '0xed', '0x20', '0xfc', '0xb1', '0x5b', '0x6a', '0xcb', '0xbe', '0x39', '0x4a', '0x4c', '0x58', '0xcf'],
               6:['0xd0', '0xef', '0xaa', '0xfb', '0x43', '0x4d', '0x33', '0x85', '0x45', '0xf9', '0x02', '0x7f',
                  '0x50', '0x3c', '0x9f', '0xa8'],
               7:['0x51', '0xa3', '0x40', '0x8f', '0x92', '0x9d', '0x38', '0xf5', '0xbc', '0xb6', '0xda', '0x21',
                     '0x10', '0xff', '0xf3', '0xd2'],
               8:['0xcd', '0x0c', '0x13', '0xec', '0x5f', '0x97', '0x44', '0x17', '0xc4', '0xa7', '0x7e', '0x3d',
                  '0x64', '0x5d', '0x19', '0x73'],
               9:['0x60', '0x81', '0x4f', '0xdc', '0x22', '0x2a', '0x90', '0x88', '0x46', '0xee', '0xb8', '0x14',
                  '0xde', '0x5e', '0x0b', '0xdb'],
               10:['0xe0', '0x32', '0x3a', '0x0a', '0x49', '0x06', '0x24', '0x5c', '0xc2', '0xd3', '0xac', '0x62', '0x91', '0x95', '0xe4', '0x79'],
               11:['0xe7', '0xc8', '0x37', '0x6d', '0x8d', '0xd5', '0x4e', '0xa9', '0x6c', '0x56', '0xf4', '0xea', '0x65', '0x7a', '0xae', '0x08'],
               12:['0xba', '0x78', '0x25', '0x2e', '0x1c', '0xa6', '0xb4', '0xc6', '0xe8', '0xdd', '0x74', '0x1f', '0x4b', '0xbd', '0x8b', '0x8a'],
               13:['0x70', '0x3e', '0xb5', '0x66', '0x48', '0x03', '0xf6', '0x0e', '0x61', '0x35', '0x57', '0xb9', '0x86', '0xc1', '0x1d', '0x9e'],
               14:['0xe1', '0xf8', '0x98', '0x11', '0x69', '0xd9', '0x8e', '0x94', '0x9b', '0x1e', '0x87', '0xe9', '0xce', '0x55', '0x28', '0xdf'],
               15:['0x8c', '0xa1', '0x89', '0x0d', '0xbf', '0xe6', '0x42', '0x68', '0x41', '0x99', '0x2d', '0x0f', '0xb0', '0x54', '0xbb', '0x16']
               }
    s_1_box = { #逆字节替换s盒
            0:['0x52', '0x09', '0x6a', '0xd5', '0x30', '0x36', '0xa5', '0x38', '0xbf', '0x40', '0xa3', '0x9e', '0x81', '0xf3', '0xd7', '0xfb'],
            1:['0x7c', '0xe3', '0x39', '0x82', '0x9b', '0x2f', '0xff', '0x87', '0x34', '0x8e', '0x43', '0x44', '0xc4', '0xde', '0xe9', '0xcb'],
            2:['0x54', '0x7b', '0x94', '0x32', '0xa6', '0xc2', '0x23', '0x3d', '0xee', '0x4c', '0x95', '0x0b', '0x42', '0xfa', '0xc3', '0x4e'],
            3:['0x08', '0x2e', '0xa1', '0x66', '0x28', '0xd9', '0x24', '0xb2', '0x76', '0x5b', '0xa2', '0x49', '0x6d', '0x8b', '0xd1', '0x25'],
            4:['0x72', '0xf8', '0xf6', '0x64', '0x86', '0x68', '0x98', '0x16', '0xd4', '0xa4', '0x5c', '0xcc', '0x5d', '0x65', '0xb6', '0x92'],
            5:['0x6c', '0x70', '0x48', '0x50', '0xfd', '0xed', '0xb9', '0xda', '0x5e', '0x15', '0x46', '0x57', '0xa7', '0x8d', '0x9d', '0x84'],
            6:['0x90', '0xd8', '0xab', '0x00', '0x8c', '0xbc', '0xd3', '0x0a', '0xf7', '0xe4', '0x58', '0x05', '0xb8', '0xb3', '0x45', '0x06'],
            7:['0xd0', '0x2c', '0x1e', '0x8f', '0xca', '0x3f', '0x0f', '0x02', '0xc1', '0xaf', '0xbd', '0x03', '0x01', '0x13', '0x8a', '0x6b'],
            8:['0x3a', '0x91', '0x11', '0x41', '0x4f', '0x67', '0xdc', '0xea', '0x97', '0xf2', '0xcf', '0xce', '0xf0', '0xb4', '0xe6', '0x73'],
            9:['0x96', '0xac', '0x74', '0x22', '0xe7', '0xad', '0x35', '0x85', '0xe2', '0xf9', '0x37', '0xe8', '0x1c', '0x75', '0xdf', '0x6e'],
            10:['0x47', '0xf1', '0x1a', '0x71', '0x1d', '0x29', '0xc5', '0x89', '0x6f', '0xb7', '0x62', '0x0e', '0xaa', '0x18', '0xbe', '0x1b'],
            11:['0xfc', '0x56', '0x3e', '0x4b', '0xc6', '0xd2', '0x79', '0x20', '0x9a', '0xdb', '0xc0', '0xfe', '0x78', '0xcd', '0x5a', '0xf4'],
            12:['0x1f', '0xdd', '0xa8', '0x33', '0x88', '0x07', '0xc7', '0x31', '0xb1', '0x12', '0x10', '0x59', '0x27', '0x80', '0xec', '0x5f'],
            13:['0x60', '0x51', '0x7f', '0xa9', '0x19', '0xb5', '0x4a', '0x0d', '0x2d', '0xe5', '0x7a', '0x9f', '0x93', '0xc9', '0x9c', '0xef'],
            14:['0xa0', '0xe0', '0x3b', '0x4d', '0xae', '0x2a', '0xf5', '0xb0', '0xc8', '0xeb', '0xbb', '0x3c', '0x83', '0x53', '0x99', '0x61'],
            15:['0x17', '0x2b', '0x04', '0x7e', '0xba', '0x77', '0xd6', '0x26', '0xe1', '0x69', '0x14', '0x63', '0x55', '0x21', '0x0c', '0x7d']
            }
    Rcon = { #Rcon生成密钥的表
            1: ['0x01','0x00', '0x00', '0x00'],
            2: ['0x02', '0x00', '0x00', '0x00'],
            3: ['0x04', '0x00', '0x00', '0x00'],
            4: ['0x08', '0x00', '0x00', '0x00'],
            5: ['0x10', '0x00', '0x00', '0x00'],
            6: ['0x20', '0x00', '0x00', '0x00'],
            7: ['0x40', '0x00', '0x00', '0x00'],
            8: ['0x80', '0x00', '0x00', '0x00'],
            9: ['0x1B', '0x00', '0x00', '0x00'],
            10: ['0x36', '0x00', '0x00', '0x00']
            }
    Matrix = [  #列混淆
            ['0x02','0x03','0x01','0x01'],
            ['0x01','0x02','0x03','0x01'],
            ['0x01','0x01','0x02','0x03'],
            ['0x03','0x01','0x01','0x02']
            ]
    InvMatrix = [  #逆列混淆
            ['0x0e','0x0b','0x0d','0x09'],
            ['0x09','0x0e','0x0b','0x0d'],
            ['0x0d','0x09','0x0e','0x0b'],
            ['0x0b','0x0d','0x09','0x0e']
  ]
    plaintext = [[],[],[],[]] #存放明文
    plaintext1 = [[],[],[],[]]
    subkey = [[],[],[],[]] #存放密钥
    def __init__(self,key):#构造函数,同时生成密钥
        for i in range(4):#把16进制转成十进制
            for j in range(0, 8, 2 ):
                self.subkey[i].append('0x'+key[i*8+j:i*8+j+2])
        for i in range(4,44):#生成密钥
            if i%4 !=0:
                tmp = xor_32(self.subkey[i-1], self.subkey[i-4])
                self.subkey.append(tmp)
            else:#4的倍数的时候执行
                tmp1 = self.subkey[i-1][1:]
                tmp1.append(self.subkey[i-1][0])
                tmp1 = self.S_box(tmp1) #字节代替
                tmp1 = xor_32(tmp1,self.Rcon[i/4])#和Rcon异或
                self.subkey.append(xor_32(tmp1,self.subkey[i-4]))
    def AddRoundKey(self,round):#轮密钥加函数
        for i in range(4):
            self.plaintext[i] = xor_32(self.plaintext[i],self.subkey[round*4+i])
    def PlainSubBytes(self):#明文字节代替函数
        for i in range(4):
            self.plaintext[i] = self.S_box(self.plaintext[i])
    def ShiftRows(self):#移位函数
        p1,p2,p3,p4 = self.plaintext[0][1],self.plaintext[1][1],self.plaintext[2][1],self.plaintext[3][1]
        self.plaintext[0][1] = p2;self.plaintext[1][1] = p3;self.plaintext[2][1] = p4;self.plaintext[3][1] = p1
        p1,p2,p3,p4 = self.plaintext[0][2],self.plaintext[1][2],self.plaintext[2][2],self.plaintext[3][2]
        self.plaintext[0][2] = p3;self.plaintext[1][2] = p4;self.plaintext[2][2] = p1;self.plaintext[3][2] = p2
        p1,p2,p3,p4 = self.plaintext[0][3],self.plaintext[1][3],self.plaintext[2][3],self.plaintext[3][3]
        self.plaintext[0][3] = p4;self.plaintext[1][3] = p1;self.plaintext[2][3] = p2;self.plaintext[3][3] = p3
    def S_box(self,row):#s盒函数
        a = []
        for i in range(4):
            a.append(self.s_box[int(row[i][2],16)][int(row[i][3],16)])
        return a

    def S_1_box(self,row):#逆s盒函数
        a = []
        for i in range(4):
            a.append(self.s_1_box[int(row[i][2],16)][int(row[i][3],16)])
        return a
    def MixColumns(self):#列混淆函数
        for i in range(4):
            for j in range(4):
                self.plaintext1[i].append(mc(self.Matrix[j],self.plaintext[i]))

    def InvShiftRows(self):#逆移位函数
        p1,p2,p3,p4 = self.plaintext[0][1],self.plaintext[1][1],self.plaintext[2][1],self.plaintext[3][1]
        self.plaintext[3][1] = p3;self.plaintext[2][1] = p2;self.plaintext[0][1] = p4;self.plaintext[1][1] = p1
        p1,p2,p3,p4 = self.plaintext[0][2],self.plaintext[1][2],self.plaintext[2][2],self.plaintext[3][2]
        self.plaintext[0][2] = p3;self.plaintext[1][2] = p4;self.plaintext[2][2] = p1;self.plaintext[3][2] = p2
        p1,p2,p3,p4 = self.plaintext[0][3],self.plaintext[1][3],self.plaintext[2][3],self.plaintext[3][3]
        self.plaintext[0][3] = p2;self.plaintext[1][3] = p3;self.plaintext[2][3] = p4;self.plaintext[3][3] = p1
    def InvSubBytes(self):#逆字节代替
        for i in range(4):
            self.plaintext[i] = self.S_1_box(self.plaintext[i])
    def InvMixColumns(self):#逆列混淆
        for i in range(4):
            for j in range(4):
                self.plaintext1[i].append(mc(self.InvMatrix[j],self.plaintext[i]))
    def AesEncrypt(self,plain):#加密函数
        for i in range(4):
            for j in range(0, 8, 2 ):
                self.plaintext[i].append('0x'+plain[i*8+j:i*8+j+2])#把16进制转化成二进制
        self.AddRoundKey(0)#第一轮密钥加
        for i in range(9):
            self.PlainSubBytes()#字节代替
            self.ShiftRows()#行移位
            self.MixColumns()#列混淆
            self.plaintext = self.plaintext1#把列混淆生成的密钥赋值给plaintext
            self.plaintext1 = [[],[],[],[]]#重置
            self.AddRoundKey(i+1)
        self.PlainSubBytes()#最后一轮字节代替
        self.ShiftRows()#最后一轮行移位
        self.AddRoundKey(10)#最后一轮轮密钥加
        return Matrixtostr(self.plaintext)#把二进制转换成诗十六进制
    def AesDecrypt(self,cipher):
        for i in range(4):
            for j in range(0, 8, 2 ):
                self.plaintext[i].append('0x'+cipher[i*8+j:i*8+j+2])#16进制转成2进制
        self.AddRoundKey(10)#轮密钥加
        for i in range(9):
            self.InvShiftRows()#逆行移位
            self.InvSubBytes()#逆字节代替
            self.AddRoundKey(9-i)#轮密钥加
            self.InvMixColumns()#逆列混淆
            self.plaintext = self.plaintext1
            self.plaintext1 = [[],[],[],[]]
        self.InvShiftRows()
        self.InvSubBytes()
        self.AddRoundKey(0)
        return Matrixtostr(self.plaintext)#把二进制转换成十六进制
def hextobin(word):#把十六进制转换成二进制
    word = bin(int(word,16))[2:]
    for i in range(0,8-len(word)):#补全八位
        word = '0'+word
    return word
def bintohex(word):#把二进制转换十六进制
    word = hex(int(word, 2))
    if len(word) == 4:
        return word
    elif len(word) <4:
        return word.replace('x','x0')#0x5-->0x05
def xor_32(start, end):#32位进行异或
    a = []
    for i in range(0,4):
        xor_tmp = ""
        b = hextobin(start[i])
        c = hextobin(end[i])
        for j in range(8):
            xor_tmp += str(int(b[j],10)^int(c[j],10))
        a.append(bintohex(xor_tmp))
    return a
def xor_8(begin, end):#8位异或
    xor_8_tmp = ""
    for i in range(8):
        xor_8_tmp += str(int(begin[i])^int(end[i]))
    return xor_8_tmp
def Fa(a,b):#列混淆中的乘法运算
    if a == 1:
        return b
    elif a == 2:
        if b[0] == '0':
            b = b[1:] + '0'
        else:
            b = b[1:] + '0'
            b = xor_8(b,'00011011')
        return b
    elif a == 3:
        tmp_b = b
        if b[0] == '0':
            b = b[1:] + '0'
        else:
            b = b[1:] + '0'
            b = xor_8(b,'00011011')
        return xor_8(b,tmp_b)
    elif a == 9:
        tmp_b = b
        return xor_8(tmp_b,Fa(2,Fa(2,Fa(2,b))))
    elif a == 11:
        tmp_b = b
        return xor_8(tmp_b, xor_8(Fa(2,Fa(2,Fa(2,b))),Fa(2,b)))
    elif a == 13:
        tmp_b = b
        return xor_8(tmp_b, xor_8(Fa(2,Fa(2,Fa(2,b))),Fa(2,Fa(2,b))))
    elif a == 14:
        return xor_8(Fa(2,b), xor_8(Fa(2,Fa(2,Fa(2,b))),Fa(2,Fa(2,b))))
def mc(s1,s2):#列混淆中的矩阵乘法
    result = []
    s3 = []
    for i in range(4):
        s3.append(hextobin(s2[i]))
    for i in range(4):
        result.append(Fa(int(s1[i],16),s3[i]))
    for i in range(3):
        result[0] = xor_8(result[0],result[i+1])
    return bintohex(result[0])
def Matrixtostr(matrix):#矩阵转成字符串
    result = ""
    for i in range(4):
        for j in range(4):
            result += matrix[i][j][2:]
    return result

测试

输入和输出都是16进制格式的字符串:
测试例子:

key = 2b7e151628aed2a6abf7158809cf4f3c
plain = 3243f6a8885a308d313198a2e0370734
cipher = 3925841d02dc09fbdc118597196a0b32

测试程序

# -*- coding: utf-8 -*-
"""
Created on Fri Nov  1 19:37:00 2019
@author: whoami
"""
from AesCryption import AesCryption
key = input("key = ")
plain = input("plain = ")
cipher = input("cipher = ")
aesencrypt = AesCryption(key)
print('密文是:'+aesencrypt.AesEncrypt(plain))
print()
print('明文是:'+aesencrypt.AesDecrypt(cipher))

Python实现AES-CFB8加解密

import json
from base64 import b64encode, b64decode
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
def cfb_encrypt(data, key, iv=None):
    if iv is None:
        iv = get_random_bytes(16)
    cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8)
    ct_bytes = cipher.encrypt(data)
    ct = b64encode(ct_bytes).decode('utf-8')
    iv = b64encode(iv).decode('utf-8')
    return encrypt_data, iv
def cfb8_decrypt(ciphertext, iv, key):
    iv = b64decode(iv)
    ct = b64decode(ciphertext)
    cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8)
    decrypt_data = cipher.decrypt(ct)
    return decrypt_data

以上就是python实现AES算法及AES-CFB8加解密源码的详细内容,更多关于Python实现AES-CFB8加解密算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • python简单实现AES加密和解密

    本文实例为大家分享了python实现AES加密和解密的具体代码,供大家参考,具体内容如下 参考:python实现AES加密和解密 AES加密算法是一种对称加密算法, 他有一个密匙, 即用来加密, 也用来解密 import base64 from Crypto.Cipher import AES # 密钥(key), 密斯偏移量(iv) CBC模式加密 def AES_Encrypt(key, data): vi = '0102030405060708' pad = lambda s: s + (

  • Python实现AES加密,解密的两种方法

    第一种 import base64 from Crypto.Cipher import AES # 密钥(key), 密斯偏移量(iv) CBC模式加密 def AES_Encrypt(key, data): vi = '0102030405060708' pad = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16) data = pad(data) # 字符串补位 cipher = AES.new(key.encode('utf8

  • Python基于pycrypto实现的AES加密和解密算法示例

    本文实例讲述了Python基于pycrypto实现的AES加密和解密算法.分享给大家供大家参考,具体如下: 一 代码 # -*- coding: UTF-8 -*- import string import random from Crypto.Cipher import AES def keyGenerater(length): '''''生成指定长度的秘钥''' if length not in (16, 24, 32): return None x = string.ascii_lette

  • python实现AES加密和解密

    一.前言 AES,高级加密标准(英语:Advanced Encryption Standard).是用来替代DES,目前比较流行的加密算法. 它是一种对称加密算法,与上一篇博文提到过的RSA非对称算法不同,AES只有一个密钥,这个密钥既用来加密,也用于解密. AES只是个基本算法,实现AES有几种模式,主要有ECB.CBC.CFB和OFB这几种(其实还有个CTR): 1.ECB模式(电子密码本模式:Electronic codebook) ECB是最简单的块密码加密模式,加密前根据加密块大小(如

  • python实现AES算法及AES-CFB8加解密源码

    目录 Python实现AES算法 生成轮密钥 加密 解密 完整代码如下 测试 测试程序 Python实现AES-CFB8加解密 Python实现AES算法 密码学课程老师留的作业,我觉得用python实现更简单,就用python写了一个加解密的程序.程序分成三个部分,一个部分是生成轮密钥,一个加密,一个是解密. 生成轮密钥 这个部分要看是不是四的倍数,非四的倍数是简单的,直接异或就可以了.如果是4的倍数,这时就需要执行字节代替和异或运算. for i in range(4):#把16进制转成十进

  • 密码系统AES私钥RSA公钥的加解密示例

    目录 前言 百科的诠释 java使用公私钥加解密的实例 前言 密钥是成对存在的,加密和解密是采用不同的密钥(公开密钥),也就是非对称密钥密码系统,每个通信方均需要两个密钥,即公钥和私钥,使用公钥进行加密操作,使用私钥进行解密操作.公钥是公开的,不需要保密,而私钥是由个人自己持有,并且必须妥善保管和注意保密.密码学里面博大精深,下面的实例仅供参考 百科的诠释 公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分

  • Python写一个简单上课点名系统(附源码)

    目录 一.准备工作 1.Tkinter 2.PIL 二.预览 1.启动 2.开始点名-顺序点名 3.开始点名-随机点名 4.手动加载人名单 5.开始点名-顺序点名-Pyqt5版本 三.思路 1.整体实现思路 2.点名实现思路 四.源代码 五.总结 一.准备工作 1.Tkinter Tkinter 是 python 内置的 TK GUI 工具集.TK 是 Tcl 语言的原生 GUI 库.作为 python 的图形设计工具,它所使用的 Tcl 语言环境已经完全嵌入到了 python 解释器中. 我们

  • Python实现淘宝秒杀聚划算抢购自动提醒源码

    说明 本实例能够监控聚划算的抢购按钮,在聚划算整点聚的时间到达时发出提醒(音频文件自己定义位置)并自动弹开页面(URL自己定义). 同时还可以通过命令行参数自定义刷新间隔时间(默认0.1s)和监控持续时间(默认1800s). 源码 # encoding: utf-8 ''''' @author: Techzero @email: techzero@163.com @time: 2014-5-18 下午5:06:29 ''' import cStringIO import getopt impor

  • python基于tkinter制作无损音乐下载工具(附源码)

    继续写GUI,本次依然使用Tkinter设计一款图形界面,使用Tkinter做一款音乐下载软件,听起来听平常的,但是我这款软件能够下载 无损音乐下载软件,听起来不错吧,Let`s go! 一.准备工作 python Tkinter 二.预览 1.搜索 2.下载 3.结果 无损音乐就这样下载完了. 三.详细设计 这里仅展示我设计的整体思路. 四.源代码 4.1 Music_Search-v1.0.py from tkinter import * from tkinter import ttk fr

  • Python爬虫实战之虎牙视频爬取附源码

    目录 知识点 开发环境 分析目标url 开始代码 最开始还是线导入所需模块 数据请求 获取视频标题以及url地址 获取视频id 保存数据 调用函数 运行代码,得到数据 知识点 爬虫基本流程 re正则表达式简单使用 requests json数据解析方法 视频数据保存 开发环境 Python 3.8 Pycharm 爬虫基本思路流程: (重点) [无论任何网站 任何数据内容 都是按照这个流程去分析] 1.确定需求 (爬取的内容是什么东西?) 都通过开发者工具进行抓包分析 分析视频播放url地址 是

  • 深入理解Python虚拟机中复数(complex)的实现原理及源码剖析

    目录 复数数据结构 复数的操作 复数加法 复数取反 Repr 函数 总结 复数数据结构 在 cpython 当中对于复数的数据结构实现如下所示: typedef struct { double real; double imag; } Py_complex; #define PyObject_HEAD PyObject ob_base; typedef struct { PyObject_HEAD Py_complex cval; } PyComplexObject; typedef struc

  • CryptoJS中AES实现前后端通用加解密技术

    在项目中如果要对前后端传输的数据双向加密, 比如避免使用明文传输用户名,密码等数据. 就需要对前后端数据用同种方法进行加密,方便解密.这里介绍使用 CryptoJS 实现 AES 加解密. 首先需要下载前台使用 CryptoJS 实现 AES 加解密的,所以要先下载组件,下载 CryptoJS-v3.1.2 版本之后,文件中包含components 和 rollups 两个文件夹,components 文件夹下是单个组件,rollups 文件夹下是汇总,引用 rollups 下的 aes.js

  • 使用python+pygame开发消消乐游戏附完整源码

    效果是这样的 ↓ ↓ ↓ 一.环境要求 windows系统,python3.6+ pip21+ 开发环境搭建地址 一起来学pygame吧 游戏开发30例(开篇词)--环境搭建+游戏效果展示 安装游戏依赖模块 pip install pygame 二.游戏简介 消消乐应该大家都玩过,或者看过.这个花里胡哨的小游戏 用python的pygame来实现,很简单. 今天带大家,用Python来实现一下这个花里胡哨的小游戏. 三.完整开发流程 1.项目主结构 首先,先整理一下项目的主结构,其实看一下主结构

  • 详解springMVC容器加载源码分析

    springmvc是一个基于servlet容器的轻量灵活的mvc框架,在它整个请求过程中,为了能够灵活定制各种需求,所以提供了一系列的组件完成整个请求的映射,响应等等处理.这里我们来分析下springMVC的源码. 首先,spring提供了一个处理所有请求的servlet,这个servlet实现了servlet的接口,就是DispatcherServlet.把它配置在web.xml中,并且处理我们在整个mvc中需要处理的请求,一般如下配置: <servlet> <servlet-name

随机推荐