编辑部专版 - 用小学数学知识结束这场加密战争
看到@贺鸣Herman5_论坛号 试图自研“加密算法”,结果不出两个小时就被攻破,其加密过程也不公开,密钥也不公开,并且仍在尝试继续做这种没有意义的“加密”。本编辑决定用最简单的小学数学知识,介绍一个无法攻破的加密算法,结束这场加密战争,并且,加密过程完全公开。
生成密钥
使用这个加密算法必须要有一对密钥,分为公钥和私钥。公钥是公开的,而私钥是不能公开的。生成密钥的过程如下:
先来找两个质数,分别为和,这两个质数是不能公开的,并且通常特别大,这里我们为了方便计算,选取。然后计算和,然后选取一个和互质的数,也就是和没有公因数的数字,我们在这里选取,然后解关于未知数的方程,解得,此时数对也就是就是公钥,这一对数字要公开,数字也就是7就是私钥。
mod是求余数运算也叫做取模运算
加密
我们先把明文转换为对应的Unicode码,如果“草”这个字在Unicode码表中对应的数字是15,,根据公钥计算出密文,这里得到密文是27
解密
公钥加密的内容必须要用私钥解密。已知密文和加密它的公钥的对应的私钥,明文的计算过程为,则
如果明文特别大,但是p,q,写的特别小,就会导致数据丢失,无法进行加密
Python实现
def generate_keys(p, q):
"""生成公钥和私钥"""
n = p * q
phi = (p - 1) * (q - 1)
# 选择与phi互质的e
e = 2
while e < phi:
if gcd(e, phi) == 1:
break
e += 1
# 计算d (e的模反元素)
d = modinv(e, phi)
# 公钥 (e, n), 私钥 (d, n)
return (e, n), (d, n)
def encrypt(plaintext, public_key):
"""加密明文"""
e, n = public_key
# 将字符转换为Unicode码点
F = ord(plaintext)
# 加密计算
m = pow(F, e, n)
return m
def decrypt(ciphertext, private_key):
"""解密密文"""
d, n = private_key
# 解密计算
F = pow(ciphertext, d, n)
# 将Unicode码点转换为字符
return chr(F)
# 辅助函数
def gcd(a, b):
"""计算最大公约数"""
while b != 0:
a, b = b, a % b
return a
def modinv(e, phi):
"""计算模反元素d (ed ≡ 1 mod phi)"""
for d in range(3, phi):
if (e * d) % phi == 1:
return d
raise ValueError("模反元素不存在")
# 示例使用
if __name__ == "__main__":
# 给定p和q,越大越好
p = 3
q = 11
# 生成密钥对
public_key, private_key = generate_keys(p, q)
print(f"公钥: (e={public_key[0]}, n={public_key[1]})")
print(f"私钥: (d={private_key[0]}, n={private_key[1]})")
# 加密示例
plaintext = '草'
ciphertext = encrypt(plaintext, public_key)
print(f"加密 '{plaintext}' -> {ciphertext}")
# 解密示例
decrypted = decrypt(ciphertext, private_key)
print(f"解密 {ciphertext} -> '{decrypted}'")
杀死比赛
加解密过程,密钥生成过程已经给你了,p,q是两个617位的超大的质数
公钥(Base64编码过的)
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj+1rFATQFml/zSZxEegs
EzqweIgtxoQu41BamMVBgJF64zfxaxjgSPt9W3Fe736V74UenZIKNlQKSdm4tqod
8IBsbqzrKz36CpprZBRdsPY7MaykrYBaKT7eBk2w7E5fB1bOyeuMhzSbMLQSG/pg
Zf+pvjwoXGt8iuPyMN9olxchhOUOMncfwi9Mi4FekpirTATrl9hmahnHBTzSK2XU
kwS6bmn4IjySlVGXhNJJNhpCvrgC05TttZ4VsNUBTGjahpbjz+eJvKzHyTXzVa1o
9VJWGUs2T1BDDF3oZSKVECrtY593ADChk2Yzxo1mfSDJhawGvfH8JxQLG6PH/KP0
iwIDAQAB
-----END PUBLIC KEY-----
密文(Base64)
J6Z7JTu97dHjH8cMayxsktBWWsABlbuOEyUoRZWZPXr662qJjH0GDJt2j0lV6iB1dqeiTB9/ZV6COmesT5D7A67c4WJ6xEPkqhQrON+X8DCc/QH8zOlV4nwYUo+poXCKphEJ27tqiXKmpd0IAqVMwX4+xNi3FJeEfSXHsBEVxKA/pSdWbJpqDG3bH+Dsgv2oCmzoyh+dGTBvDKQ1D8gNOu9JUzlAK1GHty0AxcvKZAoi3SlNs26GwVXbK4qyjpY6lWEqXnsJXgq81aK+2CAbveuHOizMgAGZxq0FCmO8AN5Lcq9d5FT3HtxckQ0WEB1AsNjOEd4eKL22Sro6aVJqWQ==
没人能够解密,除非你是广东人,手搓出来了靓仔计算机
写在后面
这并不是我自己搞出来的加密算法,而是早在1970年三个数学家发现的一种加密算法,这种算法称为RSA,它常用于银行等对安全要求十分高的地方。如果你破解了RSA,那您就写好论文等着收到图灵奖吧。这篇文章并不是想要抨击谁,而是指出现代密码学的加密算法应当公开加密过程,而不是把算法藏着掖着,这样才能保证加密算法的可靠性。想要做出好的加密算法,应当提高自己的数学水平和编程技术力,而不是在社区发送一些无意义的加密帖子。