附:
#针对Linux !/usr/bin/env python3
import argparse
import base64
import os
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.backends import default_backend
# ---------- 生成密钥对 ----------
def gen_keys(name_prefix="my_rsa", bits=2048):
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=bits,
backend=default_backend()
)
public_key = private_key.public_key()
# 私钥 PEM
pem_private = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
# 公钥 PEM
pem_public = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
with open(f"{name_prefix}_private.pem", "wb") as f:
f.write(pem_private)
with open(f"{name_prefix}_public.pem", "wb") as f:
f.write(pem_public)
print(f"已生成 {name_prefix}_private.pem 与 {name_prefix}_public.pem")
# ---------- 辅助读密钥 ----------
def load_public_key(path):
with open(path, "rb") as f:
return serialization.load_pem_public_key(f.read(), backend=default_backend())
def load_private_key(path):
with open(path, "rb") as f:
return serialization.load_pem_private_key(f.read(), password=None, backend=default_backend())
# ---------- 加密 ----------
def encrypt_text(text: str, pub_key_path: str) -> str:
pub_key = load_public_key(pub_key_path)
cipher = pub_key.encrypt(
text.encode("utf-8"),
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
return base64.b64encode(cipher).decode("utf-8")
# ---------- 解密 ----------
def decrypt_text(b64_cipher: str, priv_key_path: str) -> str:
priv_key = load_private_key(priv_key_path)
cipher = base64.b64decode(b64_cipher.encode("utf-8"))
plain = priv_key.decrypt(
cipher,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
return plain.decode("utf-8")
# ---------- 帮助文字 ----------
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="RSA 加密/解密小工具")
sub = parser.add_subparsers(dest="action")
# 生成密钥
g = sub.add_parser("gen", help="生成密钥对")
g.add_argument("-p", "--prefix", default="my_rsa", help="文件名前缀")
g.add_argument("-b", "--bits", type=int, default=2048, help="密钥长度")
# 加密
e = sub.add_parser("enc", help="加密文本")
e.add_argument("-t", "--text", required=True, help="要加密的文本")
e.add_argument("-k", "--pubkey", required=True, help="公钥文件路径")
# 解密
d = sub.add_parser("dec", help="解密文本")
d.add_argument("-c", "--cipher", required=True, help="base64 密文")
d.add_argument("-k", "--privkey", required=True, help="私钥文件路径")
args = parser.parse_args()
if args.action == "gen":
gen_keys(args.prefix, args.bits)
elif args.action == "enc":
print(encrypt_text(args.text, args.pubkey))
elif args.action == "dec":
print(decrypt_text(args.cipher, args.privkey))
else:
parser.print_help()
# d*##$.
# zP"""""$e. $" $o
#4$ '$ $" $
#'$ '$ J$ $F
# 'b $k $> $
# $k $r J$ d$
# '$ $ $" $~
# '$ "$ '$E $
# $ $L $" $F ...
# $. 4B $ $$$*"""*b
# '$ $. $$ $$ $F
# "$ R$ $F $" $
# $k ?$ u* dF .$
# ^$. $$" z$ u$$$$e
# #$b $E.dW@e$" ?$
# #$ .o$$# d$$$$c ?F
# $ .d$$#" . zo$> #$r .uF
# $L .u$*" $&$$$k .$$d$$F
# $$" ""^"$$$P"$P9$
# JP .o$$$$u:$P $$
# $ ..ue$" "" $"
# d$ $F $
# $$ ....udE 4B
# #$ """"` $r @$
# ^$L '$ $F
# RN 4N $
# *$b d$
# $$k $F
# $$b $F
# $"" $F
# '$ $
# $L $
# '$ $
# $ $
# 永无BUG!!!!提示:需要先安装cryptography!!需要先安装cryptography!!需要先安装cryptography!!
如果不安装,程序会直接报错退出
我最近又做了个加密工具,是RSA的加密工具,2048bit的加密。
我觉得挺好用的,但是有一个大问题,SHA256不能存太多中文字符,暂时没有很好的解决方法。
下面分享一下此工具的使用方法:
生成:
python XXX.py gen ------------如果您使用的是EXE发行版-------------- XXX.exe gen
加密:
python XXX.py enc -t "在此处输入您要加密的明文" -k 公钥名称.pem ------------如果您使用的是EXE发行版-------------- XXX.exe enc -t "在此处输入您要加密的明文" -k 公钥名称.pem
解密:
python XXX.py dec -c "在此处输入您要加密的明文" -k 私钥名称.pem ------------如果您使用的是EXE发行版-------------- XXX.exe dec -c "在此处输入您要解密的密文" -k 私钥名称.pem
使用本程序的步骤:
生成秘钥对 执行上方“生成”板块中的指令,生成秘钥对
加密 执行上方“加密”板块中的指令,生成密文
加密者和解密者之间的传输 将在执行“生成秘钥对”步骤时生成的私钥(要注意是私钥不是公钥)传输给解密者
解密者解密 执行上方“解密”板块中的指令,解密密文,生成明文
祝您使用愉快!
#转载请注明出处!
