1

十行 Python 代码,使用 OTP 实现对文件的加密解密

 1 year ago
source link: https://www.51cto.com/article/722149.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

十行 Python 代码,使用 OTP 实现对文件的加密解密

作者:somenzz 2022-11-07 07:04:25
OTP 就是 One-time password,翻译过来就是一次性密码。它的原理非常简单,加密的过程就是明文和密钥(key)进行异或,得到密文,而解密的过程就是密文和密钥(key)异或,得到明文。

不知道你是否相信,只需 10 行代码,就可以使用 Python 100% 安全地加密文件。这背后的原理就是 OTP。

OTP 就是 One-time password,翻译过来就是一次性密码。它的原理非常简单,加密的过程就是明文和密钥(key)进行异或,得到密文,而解密的过程就是密文和密钥(key)异或,得到明文。举例如下:

图片
图片

理论上,基于以下假设,这个加密被认为是牢不可破的:

  • 密钥是真正随机的
  • 密钥长度与信息长度相同
  • 密钥永远不会全部或部分重复使用
  • 密钥 key 很安全,不会公开

应用:加密文件

如果自己有一个私密的文件,那么完全可以使用 OTP 来加密,密钥保存在自己手里,很安全。话不多说,直接上代码:

加密文件:

import os
def encryption(file):
    toBeEncryptedFile = open(file, 'rb').read()
    size = len(toBeEncryptedFile)
    otpKey = os.urandom(size)
    with open(file.split('.')[0] + '.key', 'wb') as key:
        key.write(otpKey)
    encryptedFile = bytes (a ^ b for (a, b) in zip(toBeEncryptedFile, otpKey))
    with open(file, 'wb') as encrypted:
        encrypted.write(encryptedFile)

这段代码一共 10 行,密钥 optKey 随机生成并保存在文件中,然后用这个密钥加密文件,当需要加密文件时,这样调用 encryption 函数:

if __name__ == "__main__":
    encryption("/Users/aaron/Downloads/1/银行卡.JPG")
图片

成功执行代码后,我们无法再预览或打开我们的图像,因为它现在是加密的。此外,我们的文件夹中有一个新的密钥文件“银行卡.key”。

图片

现在,我们来解密它。

解密文件只需要 6 行代码:

def decryption(file, otpKey):
    encryptedFile = open(file, 'rb').read()
    otpKey = open(otpKey, 'rb').read()
    decryptedFile = bytes (a ^ b for (a, b) in zip(encryptedFile, otpKey))
    with open(file, 'wb') as decrypted:
        decrypted.write(decryptedFile)

这样调用:

if __name__ == "__main__":
    # encryption("/Users/aaron/Downloads/1/银行卡.JPG")
    decryption("/Users/aaron/Downloads/1/银行卡.JPG", "/Users/aaron/Downloads/1/银行卡.key")

这样就完成了解密:

图片
import os


def encryption(file):
    toBeEncryptedFile = open(file, "rb").read()
    size = len(toBeEncryptedFile)
    otpKey = os.urandom(size)
    with open(file.split(".")[0] + ".key", "wb") as key:
        key.write(otpKey)
    encryptedFile = bytes(a ^ b for (a, b) in zip(toBeEncryptedFile, otpKey))
    with open(file, "wb") as encrypted:
        encrypted.write(encryptedFile)


def decryption(file, otpKey):
    encryptedFile = open(file, "rb").read()
    otpKey = open(otpKey, "rb").read()
    decryptedFile = bytes(a ^ b for (a, b) in zip(encryptedFile, otpKey))
    with open(file, "wb") as decrypted:
        decrypted.write(decryptedFile)


if __name__ == "__main__":
    # encryption("/Users/aaron/Downloads/1/银行卡.JPG")
    decryption("/Users/aaron/Downloads/1/银行卡.JPG", "/Users/aaron/Download

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK