2024年Python最全python实现DES加密解密_des python 代码 16进制(2),2024年最新安卓binder面试题

在这里插入图片描述

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

扩展置换函数

def extend(R0):
result=‘’
# 用扩展置换表进行置换即可
for i in extend_table:
result += R0[i-1]
return result

S盒子压缩函数

def sbox(afterRoundKey):
result = ‘’
for m in range(0,48,6):
# 通过第1位和第6位算出列号
i = int(afterRoundKey[m])*2+int(afterRoundKey[m+5])
# 通过第2、3、4、5位算出行号
j = int(afterRoundKey[m+1])*8+int(afterRoundKey[m+2])*4+int(afterRoundKey[m+3])*2+int(afterRoundKey[m+4])
result += str(‘{:04b}’.format(S[m//6][i][j]))
return result

轮密钥加函数

def addRoundKey(afterExtend,roundKey):
result = ‘’
for i in range(48):
# 进行按位异或运算
result += str(int(afterExtend[i])^int(roundKey[i]))
return result

线性置换P盒

def pbox(afterSbox):
result = ‘’
# 用P盒表进行置换即可
for i in range(32):
result += str(afterSbox[P_table[i]-1])
return result

F函数

def F(R0,key):
# 扩展将32位扩展为48位
R0 = extend(R0)
# 与轮密钥进行按位异或
afterRoundKey = addRoundKey(R0,key)
# 放入S盒压缩
afterSbox = sbox(afterRoundKey)
# 放入P盒进行线性替换
result = pbox(afterSbox)
return result

#轮密钥生成
def generateKey(key):
result = ‘’
roundKey=[]
# 进行第一次压缩置换,将64位密钥减至56位,即去除8个校验位
for i in PC_1:
result += key[i-1]
# 分位左右两部分,每部分28位
C0=result[:28]
D0=result[28:]
for i in range(16):
# 按循环移位位数表进行移位操作
C0=C0[moveNum[i]:]+C0[:moveNum[i]]
D0=D0[moveNum[i]:]+D0[:moveNum[i]]
tmp=C0+D0
ret = ‘’
# 进行第二次压缩将56位压缩减至48位
for i in PC_2:
ret+=tmp[i-1]
# 生成轮密钥存储到列表中
roundKey.append(ret)
return roundKey

IP逆置换

def inverseIP(afterF):
ciphertext=‘’
# 用逆IP表进行置换即可
for i in _IP_table:
ciphertext+=afterF[i-1]
return ciphertext

加密函数

def encrypt(plaintext,roundKey):
# 进行IP置换
result = IP(plaintext)
# 分左右32bit
L0=result[:32]
R0=result[32:]
# 进行16轮加密
for i in range(16):
tmp=R0
results = F(R0, roundKey[i])
# print(results)
# print(roundKey[0])
R0=‘’
for j in range(32):
R0+=str(int(L0[j])^int(results[j]))
L0=tmp
# print(R0)
# 最后一轮结束后结果要左右交换
afterF = R0+L0
# 进行逆IP置换得到密钥
ciphertext=inverseIP(afterF)
return ciphertext

解密函数

def decrypt(ciphertext, roundKey):
result = IP(ciphertext)
Li = result[:32]
Ri = result[32:]
# 解密函数对轮密钥使用要倒序使用
for i in range(15,-1,-1):
tmp=Ri
results = F(Ri,roundKey[i])
Ri = ‘’
for j in range(32):
Ri += str(int(Li[j])^int(results[j]))
Li = tmp
afterF = Ri+Li
plaintext = inverseIP(afterF)
return plaintext

0填充函数

def zeroPadding(message):
# UTF-8解码
message = list(bytes(message,‘utf8’))
# 先填充一个0,这使得如果明文本来就是64位仍然要填充64个0到末尾
message.append(0)
# 填充0到8字节的整数倍
while len(message)%8!=0:
message.append(0)
ret = []
strs=‘’
# 分组,化为二进制串,然后没8字节分组放入ret列表中
for i in range(len(message)):
strs+=str(‘{:08b}’.format(message[i]))
if (i+1)%8==0:
ret.append(strs)
strs=‘’
return ret

处理密文函数

def progress(cipher):
lens=len(cipher)
# 因为密文输入是16进制,所以直接按没16个字符分一组即可,最后会被解释成16*4=64bit
m=lens//16
ret=[]
for i in range(m):
ret.append(cipher[i*16:(i+1)*16])
return ret

将16进制位串变为字符

def to_chr(text):
lens = len(text)
# 每两个个16进制数被解释成一个ASCII码字符,2**8=256
m = lens // 2
lists = []
for i in range(m):
lists.append(text[i * 2:(i + 1) * 2])
strs = ‘’
for s in lists:
tmp=int(s, 16)
# 因为ascii码0不会被输入,因此认为是补位值,当存在补位值,后继必为补位值,直接舍弃即可
# 对中文进行加解密时这里需要优化
if tmp==0:
break
strs += chr(tmp)
return strs

if name == “__main__”:
print(“请选择1、加密,2、解密:”)
choose = input()
if choose == ‘1’:
message = input(“请输入要加密的文本:”)
key = input(“请输入密钥:”)
keylist = list(bytes(key, ‘utf8’)) # 将密钥变为ascii码
if len(keylist)!=8:# 密钥应该为8字节的整数倍
print(“错误!请输入8字节密钥!”)
else:
key=‘’
for i in keylist:
key += str(‘{:08b}’.format(i)) # 将密钥的ascii码转为2进制
roundKey = generateKey(key)# 生成轮密钥,用列表存储
lists=zeroPadding(message) # 进行明文0填充,并分组,每64位一组
cipher=‘’
for p in lists:
cipher+=encrypt(p, roundKey) # 每组分别加密,因为采用ECB方式,直接将各段加密结果链接即可
cipher=str(hex(int(cipher,2)))[2:] # 将结果2进制串转化为16进制串输出
print(cipher)
elif choose == ‘2’:
text = input(“请输入密文文本:”)
key = input(“请输入密钥:”)
keylist = list(bytes(key, ‘utf8’))
if len(keylist)!=8:
print(“错误!请输入8字节密钥!”)
else:
key = ‘’
for i in keylist:
key += str(‘{:08b}’.format(i))
roundKey = generateKey(key)
cipherlist=progress(text)
plaintext=‘’
for c in cipherlist:
message = str(‘{:064b}’.format(int(c, 16)))
tmp=decrypt(message, roundKey)
if c==cipherlist[-1] and int(tmp,2)==0: # 如果当前段位最后一段且当前段值为0,认为是补位段,直接舍弃
break
plaintext+=tmp
plaintext=str(hex(int(plaintext,2)))[2:]
plaintext = to_chr(plaintext) # 将解密结果化为字符输出
print(plaintext)
else:
print(“错误输入!”)


加解密结果经过[在线加密]( )验证正确:  
 **加密:**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/08d194d1ae5a490cba9623ad5c5dac9f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAdV9ndWVzc18=,size_20,color_FFFFFF,t_70,g_se,x_16)  
 **验证结果:**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/dc7f64dafd6c42a58e3168a0f7b85884.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAdV9ndWVzc18=,size_20,color_FFFFFF,t_70,g_se,x_16)


**解密:**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3f009c16d2c04604b2bc8d389f297503.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAdV9ndWVzc18=,size_20,color_FFFFFF,t_70,g_se,x_16)



做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。



别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。

* * *



**(1)Python所有方向的学习路线(新版)**

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



最近我才对这些路线做了一下新的更新,知识体系更全面了。



![在这里插入图片描述](https://img-blog.csdnimg.cn/8fc093dcfa1f476694c574db1242c05b.png)



**(2)Python学习视频**



包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。



![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)



**(3)100多个练手项目**

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。



![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)



**(4)200多本电子书**  

  

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。



基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。



**(5)Python知识点汇总**

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。



![在这里插入图片描述](https://img-blog.csdnimg.cn/c741a91b05a542ba9dc8abf2f2f4b1af.png)



**(6)其他资料**



还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。



![在这里插入图片描述](https://img-blog.csdnimg.cn/9fa77af248b84885a6ec779b2ead064d.png)

**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值