咱也不是学计算机的,咱也不是学网络安全的,咱更不是学密码学的,所以东拼西凑一堆代码,能用就行。
该加解密的秘钥是自己输入的密码加电脑固定序列号,包括网卡MAC地址、CPU序列号、硬盘序列号、主板序列号、BIOS序列号。
这样可以保证加密文件只能在加密时的计算机打开,在其他人的计算机无法打开,不想用这个功能的可以在生成秘钥那里把序列号删掉。
序列号的获取参考我写的这篇文章:
https://blog.csdn.net/weixin_42845306/article/details/114899172
我下面的代码,就不写获取序列号的函数了。
加密部分的代码如下:
#引用获取序列号的函数
import os
from Crypto.Cipher import AES
filename=input("请输入要加密的文件名:")
key=input("请输入密码:")
#秘钥,此处需要将字符串转为字节
key = key+get_bios_id()+get_cpu_id()+get_board_id()+get_disk_id()+get_mac_address()
key = str.encode(key)
if len(key)>32:#秘钥不能超过32
key=key[0:32]
#加密内容需要可以被16整除,所以进行空格拼接
def pad(text):
while len(text) % 16 != 0:
text += b' '
return text
#加密秘钥需要可以被16整除,所以进行空格拼接
def pad_key(key):
while len(key) % 16 != 0:
key += b' '
return key
#进行加密算法,模式ECB模式,把叠加完的秘钥传进来
aes = AES.new(pad_key(key), AES.MODE_ECB)
#加密内容,此处需要将字符串转为字节
data = bytearray(os.path.getsize(filename))
with open(filename, 'rb') as f:
f.readinto(data)
f.close()
#将数据传入加密类中,结果为字节类型
encrypted_data = aes.encrypt(pad(data))
with open(filename+"_encryption", 'ba') as f:
f.write(encrypted_data)
f.close()
print("成功,请查看文件夹下"+filename+"_encryption")
解密部分的代码如下:
#引用获取序列号的函数
import os
from Crypto.Cipher import AES
filename=input("请输入要解密的文件名:")
key=input("请输入密码:")
#秘钥,此处需要将字符串转为字节
key = key+get_bios_id()+get_cpu_id()+get_board_id()+get_disk_id()+get_mac_address()
key = str.encode(key)
if len(key)>32:#秘钥不能超过32
key=key[0:32]
#加密秘钥需要可以被16整除,所以进行空格拼接
def pad_key(key):
while len(key) % 16 != 0:
key += b' '
return key
#进行加密算法,模式ECB模式,把叠加完的秘钥传进来
aes = AES.new(pad_key(key), AES.MODE_ECB)
#下面是解密
data = bytearray(os.path.getsize(filename))
with open(filename, 'rb') as f:
f.readinto(data)
f.close()
decryption_data = aes.decrypt(data)
#将数据传入加密类中,结果为字节类型
with open(filename+"_decryption", 'ba') as f:
f.write(decryption_data)
f.close()
print("成功,请查看文件夹下"+filename+"_decryption")
我也不会密码学,不知道这个AES被破解的几率有多大。这里用到的秘钥最长32字节,32x8=256位。我看某乎有人问过:
这样我就放心多了。