8 October 2022 - 字数统计：1699 - 阅读大约需要6分钟 - Hits: Loading...

# 用Python写一个超简单的加密程序

by mayx

这是一篇创建于 天前的文章，其中的信息可能已经有所发展或是发生改变。

AI摘要

这篇文章介绍了一种使用Python编写的简单加密程序，作者发现TinyAES库非常适合对数据进行AES-128-CTR加密，因为其加密和解密方法一致，使用起来非常直观。作者通过导入MD5哈希来处理非16位长度的密码，然后举例编写了一个加密脚本，用户只需提供文件路径和密钥即可执行加密或解密。这种库相比于复杂的加密库（如pycryptodome或cryptography），被作者认为更符合Python的简洁性和易用性。

- 起因
- 探索
- 使用方法
- 示例
- 感想

有些冷门的库也许更容易解决问题

#
起因

最近在写Python脚本的时候遇到一个问题，就是怎么样轻松的加密一串字符。在网上随便一搜大都是介绍的使用比如pycryptodome或者cryptography库进行加密，我以前写的一个加密传输Demo作业的时候就用过。不过现在总感觉看着很难受，倒不是说有多复杂，主要是这些库的算法太多了，什么AES，RSA啥的都有，而且还有一堆乱七八糟的参数，我用的时候还要去思考到底用哪个算法比较好，还要考虑有些有什么向量之类乱七八糟的。但是很多时候我只是单纯要个加密，不想去考虑这些乱七八糟的东西，那我应该怎么做比较好呢？

#
探索

这时候我想起来我以前用的Pyinstaller库如果想要使用Key参数的时候会要求安装一个叫做tinyaes的库，我搜了一下这个库，网上几乎没有对这个库的介绍，没办法就只好去Github找找它源代码的仓库。去看了一眼说了跟没说一样，就几句话连个示例也没有的……不过大概意思就是C也有个叫tiny-AES-c的库，它是在Python上对这个库做的一个简单的包装，但那个仓库里面也没有示例😂……还好tinyaes仓库里面有个测试脚本，我看了一眼又回去看了看C的库那个文档，结合“Same function for encrypting as for decrypting in CTR mode”这句话我才明白，这个tinyaes原来就用一个方法就能进行加解密了！怪不得叫“xcrypt”，就像xor加密那样，用同样的方法就可以做到加密和解密，这个仓库加密的算法是AES-128-CTR，这样我也不用费心考虑到底选什么加密算法了，使用也非常简单，非常的符合我的需求啊，可惜就是这个库不怎么出名，100个⭐都不到。

#
使用方法

tinyaes的使用方法非常简单，一句话就可以搞定，而且加密和解密的代码完全一致：

    __import__("tinyaes").AES(b"十六位的密码", b"十六位的向量，可以不要").CTR_xcrypt_buffer(b"需要加密/解密的内容")

使用起来非常的简单啊，就是密码要求必须是16位的……那我要是想要一个随意位数的密码怎么办呢？我想起来MD5的hash长度好像就是16位的，所以如果想要其他位数的密码就用MD5哈希之后再用吧。

#
示例

既然使用方法如此简单，我估摸了一下，如果写一个加密文件的小程序估计用不了10行，用其他的加密库我估计应该做不到吧，所以说就随手写了一个试试看，果然不到10行就写了出来，看起来非常不错。

    import hashlib, tinyaes, sys

    if not len(sys.argv) == 3:
        exit(f"Usage: {sys.argv[0]} [filepath] [key]")
    key = tinyaes.AES(hashlib.md5(sys.argv[2].encode()).digest())
    with open(sys.argv[1], 'rb') as orig:
        with open(sys.argv[1] + ".xc", 'wb') as enc:
            for byte_block in iter(lambda: orig.read(4096), b''):
                enc.write(key.CTR_xcrypt_buffer(byte_block))

用法很简单，比如我给这个脚本起名叫“encrypt_file.py”，我想加密就可以直接输入`python3 encrypt_file.py 要加密的文件.txt 密码`就可以了，执行完之后会生成一个“.xc”为后缀的文件，解密也一样，输入`python3 encrypt_file.py 要加密的文件.txt.xc 密码`就OK了，不过因为我这个程序并不能判断一个文件有没有加密，所以解密的时候就会给后缀再加一个“.xc”，这时候就只能手动把它去掉了。如果密码不正确，那就相当于二次加密了，解密就要按顺序依次反过来执行，很有意思。

#
感想

这样的库我感觉更符合Pythonic，用什么pycryptodome或者cryptography库写的就感觉像是Java程序那样臃肿，这种程序感觉就很直观，不用考虑那么多奇怪的东西。

tags: Python - 加密 查看原始文件

#### 推荐文章

Loading...

上一篇：Cloudflare规则新功能体验
下一篇：如何破解我上次写的加密程序？
想问这篇文章
召唤伊斯特瓦尔