首页后端开发PythonPYTHON 对密码简单加解密

PYTHON 对密码简单加解密

时间2023-04-03 15:06:44发布访客分类Python浏览729
导读:写在前面加密分为对称加密和非对称加密, 就是salt是否相同.一般常用的就是 公钥加密, 私钥再去解密.也有直接做hash的(无法解密 .但是本文不整那么多花里胡哨的.... 就使用异或运算来对密码加密原理本文没得啥高大上的算法, 核...

写在前面

加密分为对称加密和非对称加密, 就是salt是否相同.

一般常用的就是 公钥加密, 私钥再去解密.

也有直接做hash的(无法解密).

但是本文不整那么多花里胡哨的.... 就使用异或运算来对密码加密

原理

本文没得啥高大上的算法, 核心就是一个异或运算....

异或运算: 相同为0, 相异为1.

异或之后的值再对相同的对象异或 就能得到原来的值. 听起来有点绕口. 差不多就是下面这样的

C = A ^ B
A = C ^ B
是不是有点神奇 +_+

根据这个原理, 我们就能制作一个带salt的加密工具了.

但是考虑到相同的密码和相同的salt会得到相同的结果, 所以我们的加密函数 就再加个 随机数来干扰.

为了方便验证, 我们还加入crc32来校验字符串是否完整.

所以伪代码加密逻辑就是下面这样的

password = password ^ salt
password += crc32(password)

解密就是反过来就行, 这里就不多说了, 直接看测试吧

测试

脚本见文末.

加密

import encrypt_ddcw
encrypt_ddcw.encrypt(b'123456')
encrypt_ddcw.encrypt(b'123456')
相同字符串每次加密结果都不一样

解密

解密就是反向操作.

import encrypt_ddcw
aa = encrypt_ddcw.encrypt(b'aaaaa')
bb = encrypt_ddcw.encrypt(b'666666')
encrypt_ddcw.decrypt(aa)
encrypt_ddcw.decrypt(bb)
解密夜视OK的

以后就能有属于自己的加解密工具了-_-

总结

1. 加密的时候加点随机数就不容易不猜出密码.

2. 虽然没得ssl那么强, 但是足够简单, 能够自己定制.

3. 加上校验位能够辅助判断目标字符串是否完整.

附源代码

ddcw_tool工具也包含了这两函数

import struct,binascii,random,hashlib
def encrypt(password,salt=b'thisissalt'):
	"""
	先crc32 然后异或随机数, 然后异或salt 然后返回带crc32
	"""
	if not isinstance(password,bytes) and not isinstance(password,bytearray):
		password = password.encode()
	if not isinstance(salt,bytes) and not isinstance(salt,bytearray):
		salt = salt.encode()
	password += struct.pack('L',binascii.crc32(password))
	rstr = hashlib.sha256(str(random.random()).encode()).digest()
	rstr_size = random.randint(4,16)
	rstr = bytearray(rstr[:rstr_size])
	password = bytearray(password)
	for x in range(len(password)):
		password[x] ^= rstr[x%len(rstr)]
	password = struct.pack('B',rstr_size) + rstr + password

	salt = bytearray(salt)
	password = bytearray(password)
	for x in range(len(password)):
		password[x] ^= salt[x%len(salt)]
	return password + struct.pack('L',binascii.crc32(password))

def decrypt(password,salt=b'thisissalt'):
	if len(password) = 8:
		return b''
	if not isinstance(salt,bytes) and not isinstance(salt,bytearray):
		salt = salt.encode()
	password = bytearray(password)
	salt = bytearray(salt)
	crc32 = password[-4:]
	password = password[:-4]
	if binascii.crc32(password) != struct.unpack('L',crc32)[0]:
		return b''

	salt = bytearray(salt)
	password = bytearray(password)
	for x in range(len(password)):
		password[x] ^= salt[x%len(salt)]

	rstr_size = struct.unpack('B',password[:1])[0]
	rstr = password[1:1+rstr_size]
	password = password[1+rstr_size:]
	rstr = bytearray(rstr)
	password = bytearray(password)
	for x in range(len(password)):
		password[x] ^= rstr[x%len(rstr)]

	crc32 = password[-4:]
	password = password[:-4]
	if binascii.crc32(password) == struct.unpack('L',crc32)[0]:
		return password
	else:
		return b''

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

python加密加解密

若转载请注明出处: PYTHON 对密码简单加解密
本文地址: https://pptw.com/jishu/826.html
python调用linux执行命令 【CSS】课程网站头部制作 ② ( 导航栏测量 | 导航栏编写 | 代码示例 )

游客 回复需填写必要信息