哈勃所有读者问好! 不久前,我决定处理加密算法和电子签名原理。 我认为这个话题很有趣且相关。 在学习过程中,我尝试了几个库,但是从我的角度来看,
PyCrypto库是最方便的。 她拥有出色的文档,并附有示例。
阅读材料后,您将学到以下几点:- 什么是加密;
- 对称加密和非对称有什么区别?
- 在这种情况下,使用对称和非对称加密会更有效;
- 什么是数据哈希,为什么要在加密中使用它;
主题的相关性不断增长。 长期以来,密码术的使用不仅限于对信息进行加密。 无论采用哪种形式,我们每天通过HTTPS协议访问网站时都会使用加密算法,使用信用卡进行购物时,或者在即时通讯程序中进行通信时,每天都会使用加密算法。 在过去的几年中,同样基于密码学的区块链技术引起了广泛的关注。
本文的目的是向读者介绍基本的加密算法。 在写文章时,我试图尽可能地注意实际应用问题。 对于编程,使用了Python 3.6。 在编写代码时,我试图将其分成单独的部分,并对所有关键点进行注释。
在本文中,我没有分析数字签名,但是在了解了非对称加密之后,这项技术的含义将变得清晰。
情节
让我们从精神上进入第6集事件之前的星球大战宇宙,那时抵抗力量开始意识到建造新死亡之星的开始。 该司令部计划以建造者的名义引入一个情报小组。 操作非常危险,与总部的沟通将很困难。 在紧急情况下,小组中的每个成员都可以不受保护的频率从总部发送和接收消息。
侦察小组的目的是可以揭示未来加油站的配置,武器和目的的任何数据。 为了存储数据,计划开发专用设备和软件。
总部批准了此操作的两种选择:计划A —叛乱力量给定的特工返回;
计划B-使用电台设备从死亡之星本身远程传输计划。
信息的传输将很快,但是在传输之后,最有可能计算并捕获代理。您是团队中负责软件开发的程序员。
在计划操作时,考虑了几种可能的负面情况:- 敌人将拦截该信号,了解其有关攻击计划的内容,并使该物体靠近忠于帝国的部队。 在这种情况下,电阻之间的损耗会更高;
- 其中一名间谍将被抓获,在审讯期间将透露其行动计划,这可能会导致加密密钥受到损害(我们将在下面讨论)。
- 带有下载数据的间谍可能会受到帝国力量的拦截,这将对内容进行更改,从而错误地告知抵抗力量该站的弱点。 在这种情况下,反攻舰队将在错误的方向上被送进并逐渐被摧毁;
从这些方案中可以制定任务:- 必须对内容进行安全加密并防止其更改;
- 如果丢失了加密密钥或它们受到损害,则应该有可能以对手可以利用的频率远程获取新的加密密钥。
信息加密
让我们解决信息加密的问题:
加密密钥用于加密和解密信息。 这是使加密可逆的密钥。 每个代理将被提供一个加密密钥。 下载数据后,代理将对其进行加密,然后将其发送到抵抗力量的总部。
加密原理说明使用单个密钥对消息进行加密和解密的方法称为
对称加密 。

对称加密的弱点是加密密钥,或者更确切地说,它是传递给收件人的。 如果密钥在传递过程中遭到破坏,则第三方可以轻松解码该消息。 对称加密的优势在于它的速度,这使得对大量数据进行编码成为可能。
非对称加密使用两个相互连接的密钥:公用和专用。
作用机理如下:- 收件人将OPEN密钥发送给发送方;
- 发送者使用接收到的公共密钥对消息进行编码。 同时,现在只能使用私钥对消息进行解码;
- 接收到加密的消息后,收件人将使用CLOSED密钥(与公众共同生成)将其解码。
让我们开始编程吧! 要开发必要的软件,我们将使用名为
pycrypto的Python库。 她拥有出色的文档,并介绍了所有常见的加密算法。
首先,我们将开发一种称为
高级加密标准(AES)的对称加密功能。 它是最常见的对称加密算法之一。
from Crypto.Cipher import AES
让我们使用一个示例来检查代码的性能 message = """ 120 120 / 120 10 30-5 (2) 4.0 """ key = 'Traveling through hyperspace ain't like dusting crops, farm boy.' encr_message = symmetric_encrypt(message, key, verbose = True) print('\n') print('DECRIPTION') decr_message = symmetric_decrypt(encr_message, key) print(decr_message)
Message was encrypted into: ed10e4c65358bb9e351c801c3b3200b21fa86a24021c317bb5c9d8b3f76bdf9f3a7d26781a22402f0e4f41ca831b6d2da9e1e6878c34c79ddc7959af3ae9fc2ba0cfff1c0180a7e0f637f1aa5b24507d552d5dfe7625e7b81d817b5882b2b19bb95f3988a03c78f850098dfc8e6089863deaa39b887eaea4c1d4ba006edaec90205d54b27ed4ac70ed75cdd01732e1176bf04218beb8ae742ff708a201a9d1cb57dd5f2e70dc3239208d23705f7a3aae3e315c4df6d73c871b66c4995cce5f19738f731cd58755d21ed92612c44197f875cddf3f7aa1d60e435ce1492679b9d60c4b8538f52408f321711ac1d2daa6dbbc33dc655abca10e2f5fd3ff27823995b9dcdb62c0bafc1963ab539ccb466f1c140479df34b0005f578f72fcdd76b17391332037b801f74f733a08 DECRIPTION Success! Encrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 Decrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 120 120 / 120 10 30-5 (2) 4.0
如您所见,我们已使用公共密钥成功加密了邮件。
多次运行代码。 您将看到每次加密的部分更改。 这是因为在加密时,我们使用了密码反馈模式(AES.MODECFB),在该模式下,明文块与密文块混合在一起。 iv-初始化向量(在此处了解有关模式的更多信息)。 在解密消息时,我们看到解密消息的哈希值与加密期间添加的哈希值匹配。 这意味着解密是正确的。
什么是哈希文档哈希只是一个字符串,对于任何数据集都是唯一的。 任何数据更改,哈希值都会发生很大变化。 换句话说,散列是任何数据集的一种“指纹”。

但是,如果由于某种原因而破坏了加密密钥怎么办? 这样,任何人都可以解密信息。
在这种情况下,我们需要以某种方式远程更改加密密钥,攻击者可以利用该频率。 我们假设他们已经在听她的话。 那么我们该怎么做呢? 在这里,另一种方法可用于救援,称为非对称加密(或公共密钥密码系统)。 与对称加密不同,它使用两个密钥:公共和私有。 邮件使用公钥加密,之后只能使用私钥解密。 解密公钥将无用。 但是,有一个重要的观点:私钥肯定必须来自生成的公共对。 公共密钥的存在是非对称加密的几个重要且有趣的属性之一。 也就是说,我们可以通过任何通道传输公钥,而不必担心它将被用于解密消息。
同时,关于我们的任务,有一个细微差别-非对称加密适用于小数据,例如短信。 我们只能猜测通过情报获得的数据量。 当然,我们可以将接收到的所有数据分解为小片段,并使用私钥对其进行编码,但是有更好的解决方案。 (问题已在
此处解决 )。
解决方案用户Akela_wolf正确地指出,任何人都可以生成和发送公钥。 我对该计划做了一些调整。
如果总部在发送代理之前会生成几个密钥对并为每个代理分配一个私钥,那将是正确的。 最好只生成几对,以便每个代理都有一个单独的密钥。 这对于准确地拟出密钥所有者是必要的。
然后,如果密钥被盗用,中心将创建一个新的SYMMETRIC密钥,使用公共密钥将其编码到每个座席,并通过开放信道发送。
旧决定- 特工将在适当的位置生成一个密钥对(公共密钥和私有密钥),然后将公共密钥发送给叛军;
- 在抵抗力量的总部,他们将创建一个用于SYMMETRIC加密的新密钥。
- 对称密钥是使用代理发送的公钥进行编码的;
- 加密的对称密钥将发送给代理,代理将使用私钥对其进行解码。
请注意我们在公开频道上的节目:
- 代理从该对发送OPEN密钥,而CLOSED密钥由他拥有;
- 抵抗总部发送一个对称的加密密钥,该密钥使用代理发送的公钥进行加密。
在拦截中,第一条消息和第二条消息都没有任何价值。
让我们编写代码:
让我们看看按键是什么样的。 print(private_key.exportKey(format='PEM').decode()) print('\n') print('#'*65) print('\n') print(public_key.exportKey(format='PEM').decode())
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA4JDLu7Vtvg2yqbH6Y0eJPfoEsOlKzgmOodqhA1CqkEG4OpKi
sGW7ciGP4v37GE6edHBCEy4UNkVQtnpPBjzTHvKd1pO70B84vD5OSrS7uNw2EYkj
d/ZwhrJMrcQKRwPkkM4OiewaaAaK0vPWJIKwlW61DY9X7LfNz7aOKMTbKnm1vdR0
919AV98FUmNoQBgka6nXFGmNbi7D43MtLwxBZIXfFupEiANSvOs+57hgaCho7OWM
GUOjLkG6HBscPhJ2W1H5DU9GjwL24ynTvKifgo1/2ue61MV1Pzh5CVaicJKNaRtg
Pd99gFhBGINsXV2X6Jh/W5nNsCddU4EI0AlO8wIDAQABAoIBAARM4YnjrIlSK9Sy
EtBp40frjMFyhjsx1ahlzmWI2utORt/gRPtJx3AlEmNPZ8qMXt5t8+X4IOz1INmN
uAuviH90N++O/q66mlSIgOlPUrT0ipiFXseCUZ9StMMzGNtJSMw5FfAwNEU/stLd
VoF2ezkxWIg88XsX/fn3Tfub4XKLvu4raJGcJ+Fo2GI9hYEGKnHhSuHvDHekTLlQ
z46O+cIwtehbFGcKesyK3zDD1uP5YLPIWpiqt1TgKjJzRF0l4ZJLk+RT7kU2pGIQ
mosOnr+06WyMIg724yQyAIwtS9X0czKBGUESrtTTb1HCXLeTwnncOTxh6q2z42LF
tn34+DECgYEA6EEp4oTvjfTQfUQPMByuAjF1hpdFHQqRymygiFgoF+Mg3QmL0w8j
/84H/q7s8FSx+3th8MK87bFq4lrry+h/mYwmvF5zZbhxcnl2uaX+KUPgpT6TgvAo
WOv2wc4BSaoo9DrxrZId86vpO2qbopw6gkBsvw47HSoQ+FSqXtZ0p8kCgYEA94Zj
b1ulctUjybiszO93TAjkzx3lU3yL+B1eZiQXtJa3mgG+ka1R/uMfr0NlT+Jzo0My
wHV30YRJDxziCrDol9OgSSU0sXwEcUxUIBLBwXLCp1EmMsYG9PB/x4OTWve35a8F
O+rMxuvWaZeIOfVCfL8UEcWweYaVdWIonJN+ltsCgYEAjeSZ2UlMLZce9RjqioNL
EA31dlfeoqJ9dYUuAn6RaB6cSk51vWlnnfXazo9CNIYaAsFbkcL3t+QHn+jaXEZc
BowocjbmG4Q20zBAB6XRBJbynSIA7yMYE1N9+uOHx+CMisGkO12krOUfZex4zzzR
RhhkF8ly9htoKL9ZIv20YXkCgYBzH3UF6PkVZJ5lhtgP5Nx2Z7iLwBrV7ppnBrnO
BcFkw6iXH3KT7KmzQ82LxWvMcMVZzLpBGyFkOAOG3OchE9DKNKpa+sv8NHMYguip
li+5mneAPFTozoOTznuPvtl9OLO2RuXHTVh6uFub9tdsJW8L+A8MiQagLwE6fDHp
SQxaewKBgQDIyzL1THpW3+AMNrOZuI/d3Em5wpGJiZbDSBRosvsfGm/sHaz4Ik5E
nWnftgktmsAD60eORTTh9/ww/nm7f3q9kzT8Sv1MmqeRXq9VFIOeP/+8SSE/7LzD
izlb5xEtVD8LuY54jHyiOxiZC++TQswMnOKKi0Gx26MDoO7Tx9akVw==
-----END RSA PRIVATE KEY-----
#################################################################
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4JDLu7Vtvg2yqbH6Y0eJ
PfoEsOlKzgmOodqhA1CqkEG4OpKisGW7ciGP4v37GE6edHBCEy4UNkVQtnpPBjzT
HvKd1pO70B84vD5OSrS7uNw2EYkjd/ZwhrJMrcQKRwPkkM4OiewaaAaK0vPWJIKw
lW61DY9X7LfNz7aOKMTbKnm1vdR0919AV98FUmNoQBgka6nXFGmNbi7D43MtLwxB
ZIXfFupEiANSvOs+57hgaCho7OWMGUOjLkG6HBscPhJ2W1H5DU9GjwL24ynTvKif
go1/2ue61MV1Pzh5CVaicJKNaRtgPd99gFhBGINsXV2X6Jh/W5nNsCddU4EI0AlO
8wIDAQAB
-----END PUBLIC KEY-----
如您所见,非对称加密密钥是数学上较长的字符序列。
因此,我们生成了密钥。 现在让我们编写一个编码数据的函数:
from Crypto.PublicKey import RSA
工作流程步骤- 代理生成密钥对:
private_key, public_key = generate_keys()
- 将OPEN键发送到总部;
- 在总部,使用公共密钥对密钥进行编码以进行对称加密:
new_symmetric_key = 'SOME_KEY_asdfasdfasdfasdfsdfgrtwhetynt' encr_msg = encrypt_message(new_symmetric_key, public_key)
结论Message: SOME_KEY_asdfasdfasdfasdfsdfgrtwhetynt was encrypted to
41e940507c96397e3feb4a53390c982633bb1775a52957996a8069bd22063086a0e831bf775a17909276aba0d0478ee6c953837c8ea5d20d40e1c8eb463aaa1bc5c93c71677b1a85e90439c9dbda8a98ce168acb38368155437c66815b84aa2fbdda0eb909e4e6079b4410c720eddd955ed048193bf87f8f9976a17ee32a58a71dfddf3db116343d949d29c25f72c511a440a50a5d4f1e01c37b24a1cb4127e191d3231328b2f120c7dbd0cb5bf19823f0978b8ed17d25952de4b146ef9724fff359eb2af503fdfd72b91525a5503b076ba9aaaeac55af3f8d210c12d579d45dd70362123c0b4b36ef9c2f7705e6f884a25553eb0e11e5077f11fa986d0ff280
- 这个长序列被发送回代理。
- 代理使用私钥解密收到的消息:
recieved_symmetric_key = decrypt_message(encr_msg, private_key) print('\n') print(f"New symmetric key is: {recieved_symmetric_key}")
结论 Success! Encrypted hash is 42ad66445a05ac09e684bb21f9b487d95b9cfa11d02e0b459931321ee02f7c1c Decrypted hash is 42ad66445a05ac09e684bb21f9b487d95b9cfa11d02e0b459931321ee02f7c1c New symmetric key is: SOME_KEY_asdfasdfasdfasdfsdfgrtwhetynt
- 然后,代理使用新的对称密钥对接收到的数据进行加密:
message = """ 120 120 / 120 10 30-5 (2) 4.0 """ encr_message = symmetric_encrypt(message, recieved_symmetric_key, verbose = True)
结论 Message was encrypted into:
- 总部解密:
print('DECRIPTION') decr_message = symmetric_decrypt(encr_message, new_symmetric_key) print(decr_message)
结论 DECRIPTION Success! Encrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 Decrypted hash is b0dbb35b28fbff258350a50c39282b73e31f408c9da937c81d8d48115b491026 120 120 / 120 10 30-5 (2) 4.0
瞧!在这个抽象示例中,我们看到了通用加密算法的工作。 对称,非对称加密以及哈希用于
网络 ,
电子签名 ,
区块链和加密货币的工作 。 我希望这些材料对理解这些技术的操作有用。
后记
结果,反叛情报部门设法获得了有关该电台的脆弱性及其通往该地点的方式,皇帝的存在,检查的能量盾牌及其在恩多的来源的准确信息。 帝国发现了间谍,将基地的战斗力误告知了他们。 该电台还被分配给Endor卫星,从那里受到盾牌的保护。