首页
社区
课程
招聘
[翻译]加密聊天室:第一部分
2018-5-3 12:29 3462

[翻译]加密聊天室:第一部分

2018-5-3 12:29
3462

为了了解更多加密以及如何在网络协议中实现加密的细节(比如SSHHTTP over TLS),我开始编写一个加密的聊天客户端和服务器。现在已经差不多完成了,我想在此与你分享我学到的东西。


我将这个系列分成两个帖子。本帖将涵盖理解这个程序如何工作所需的概念。第二个帖子将深入讨论代码并将这些概念与程序实际正在做的事情联系起来。感谢@oaktree的建议使用这种方式。


下面开始。

第一部分:概念性概述


目标:建立一个共享密钥,用于在客户端和服务器之间发送的消息的加密与解密。


要设置聊天室,客户端必须能够安全地将消息发送到服务器,反之亦然。对称加密使用相同的密钥来加密和解密消息,对于这项任务来说非常合适。但是这样做的话,客户端和服务器必须协商一个秘钥。


**记住:加密密钥只是非常大的数字。


那么我们如何让两台电脑拥有相同的大数字?我们不能通过电报发送它......这首先会破坏加密的目的,因为窃听者可能窃取密钥并解密所有内容。所以我们将使用Diffie-Hellman密钥交换


第一步:Diffie-Hellman密钥交换

这是一种非常聪明的生成共享秘钥方法。


Diffie-Hellman(或简称DH)使用有限循环组来使两个实体达到相同的数量,而没有明确地共享它。很多有限循环组的应用使用了整数乘法组模p,其中p是质数。但是,其他选项(如椭圆曲线)也存在(比如你现在正在使用一个选项来查看此网页!)。


抛开疯狂的数学,交换背后的实际概念并不是很难理解,并且执行它所需的数学运算也是基础级别的。以下是Wikipedia上列出的图表:


Diffie-Hellman密钥交换背后想法的例证


对于我们的聊天室来说,“共同的油漆”是一个非常大的质数模量p(至少2048位)和基数g。这些数字可以公开分享并且不会威胁我们的安全通信。“秘密的色彩”是每个参与者生成的随机数字,并保持秘密。整个过程因以下原因而起作用:


(g^a % p)^b % p = (g^b % p)^a % p

其中a和b是“秘密的颜色”,%是模数运算符(它只是分割和返回余数)。你问为什么这两个表达式是相等的?我没有资格告诉你。我想这就像是问为什么2 + 2 = 4,尽管听上去我们的例子更复杂- 它就是这样。如果有人能够很简单地解释这个等式,请发表评论,因为我也希望自己能更好地理解它。我还没有研究群论,但也许有人可以在此提出对这个等式更多的看法。


如果你没有完全理解这里发生了什么,那么没关系,当我们看代码的时候,我会更详细地讨论它。重要的是我们现在有相同的数字(共同秘钥):一旦我们有了,我们可以继续下一步。


第二步:AES加密

(高级加密标准)


由于AES的速度和安全性,AES是一种广泛使用的对称加密算法。除非使用它的系统正在泄漏数据(例如通过糟糕的功能实现),否则破解它的唯一方法就是暴力破解。我们将在密码块链模式(CBC模式)中使用AES-256,该模式依赖于256位密钥(这也是为什么你会看到我们将通过SHA-256传递我们的共享大数字以将其标准化为256 比特长度)并且使得该系列中的每个块依赖于前一个块。


AES-SubBytes


在这种模式下,我们必须用一个初始化向量来开始加密我们的消息,这个初始化向量在我们的链中作为起始块来影响每个连续的块。


在CBC模式下,每个明文块在加密前都与先前的密文块异或。这样,每个密文块依赖于到该点为止处理的所有明文块。这是初始化向量的用途,因为如果你都没有开始加密,你就不能异或先前的密文。

(感谢@ pry0cc的阐明)

与加密密钥不同,此值可以公开共享。它被用来对密钥进行逆向工程的可能性曾经为0,因为如果使用相同的密钥对“hello”进行两次加密,两个不同的初始化向量将会产生完全不同的结果。但我们必须小心,重复使用同一个IV会降低通信的安全性。请参阅WEP了解为什么这是个问题。


我们还需要添加一些额外的字符来“填充”,以便使我们的消息是AES块长度的倍数。在消息尾部标记空格很容易在另一端剔除,所以我们将使用它。因此,第一个块将是我们的IV(初始向量值),并且每个连续块将属于我们的消息,包括任何填充。


就这样,我们现在可以在服务器和客户端之间来回发送加密的消息。客户端会将加密的聊天消息提交给服务器,然后服务器将消息解密并用每个客户端的密钥重新加密它们,以便将消息广播到该服务器。对任何人窃听网络,每封邮件都会看起来完全不同,并且任何内容都不会被破译。


总结


我希望你喜欢我的加密聊天程序的概念性概述。在第二部分,我们会仔细查看代码的一些关键点,并详细地了解这些概念是如何实现的。第二个帖子应该很快就会出来,与此同时我们欢迎你仔细阅读Github上的源代码:https://github.com/spec-sec/SecureChat 48.如果您有任何建议,请留下一条评论。谢谢阅读!


原文链接: 

https://0x00sec.org/t/encrypted-chat-part-i/5839

编译: 看雪翻译小组 一壶葱茜


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-5-3 12:32 被一壶葱茜编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回