加密原理
一次性密码(One-time password)。原理非常简单,加密的过程就是明文和密钥(key)进行异或,得到密文,而解密的过程就是密文和密钥(key)异或,得到明文。这里面最重要的概念是异或操作;
什么是异或:
异或,是一个数学运算符,英文为exclusive OR,缩写为xor,应用于逻辑运算。异或也叫半加运算,其运算法则相当于不带进位的二进制加法。
异或的运算法则如下:
- 1、真异或假其结果为真;
- 2、假异或真其结果为真;
- 3、假异或假其结果为假;
- 4、真异或真其结果为假。
总结就是:
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
加密实现
- 读取文件信息,获取文件长度
toBeEncryptedFile = open(file, 'rb').read()
size = len(toBeEncryptedFile)
- 生成与文件等长的随机密钥
p_key = os.urandom(size)
with open(file.split('.')[0] + '.key', 'wb') as key:
key.write(p_Key)
- 两个文件进行异或操作,生成新文件
encryptedFile = bytes (a ^ b for (a, b) in zip(toBeEncryptedFile, otpKey))
with open(file, 'wb') as encrypted:
encrypted.write(encryptedFile)
- 文件加密完成,生成了新的加密文件和加密密钥;密钥保存到自己手里,加密文件就可以传给其他人了;
- 只需要大概10 行代码,就可以使用 Python 100% 安全地加密自己的手里文件,然后可以放心的发送给别人了;
- 如果要看原始文件,解密即可
上面加密文件的操作,只用到了os模块,非常简单;而且:
- 密钥是真正随机的
- 密钥长度与信息长度相同
- 密钥基本不会重复
解密文件
解密文件只需要获取加密文件和密钥文件,再次进行异或操作,就可以解密成原来的文件了;
def decryption(file, p_Key):
encryptedFile = open(file, 'rb').read()
otpKey = open(p_Key, 'rb').read()
decryptedFile = bytes (a ^ b for (a, b) in zip(encryptedFile, otpKey))
with open(file, 'wb') as decrypted:
decrypted.write(decryptedFile)