我们曾经将Telegram视为任何类型消息的可靠且安全的传输介质。 但实际上,它具有a-和对称加密的相当普遍的组合。 哪里有趣? 而且无论如何,为什么有人会信任他们的消息给第三方?

TL; DR-在用户互相阻塞的情况下发明了一个秘密秘密通道。
隐秘渠道
有很多解决方法可以在两个用户之间传输数据,从而避免直接联系。 您可以使用中间商,加密和隐写方法,广播中继网络以及现有协议的其他扩展。 但是有时仅使用正式记录的功能就可以建立安全的联系,这很有用。 或应该说,建立一个秘密通道 。
我们可以在苏联间谍电影《春天的十七个瞬间》中看到一个例子(这很不错,尝试观看)。 在其中,安全屋窗户上的一朵花用来表示间谍是否完成了任务。 花本身并不意味着任何东西:它可以存在也可以不存在,这种共生是很平常的事,只告诉我们主人对花的热爱。 只有预定的解释才能将间谍收到的信息与随机过路人收到的信息区分开。

Telegram中基于窗口的基于花的通道
按照相同的原理来组织自己的秘密通道,您只需要两件事:一扇窗户和一朵花。 窗口代表一个对象,您可以更改其他人和花朵的可见状态-可能的状态以及更改它们的方式。
那么,爱丽丝在鲍勃可以看到的电报中会发生什么变化? 实际上,有很多东西:化身,用户名,上次访问时间等等。 但是通常,这些东西可以同时供所有人使用,从而限制了对话的隐私性-如果有人拥有过渡方法,他就可以读取爱丽丝发送的任何内容。 令人惊讶的是,无需任何加密就可以解决此限制。
我在阻止你,哈哈
每个用户都有自己的黑名单,如果读者足够烦,那么他在被阻止后应该已经注意到,他的尚未好友的“上次访问”状态已更改为“很久以前见过”。 事实是,他可能在几秒钟前甚至现在就已经在线,但是Telegram API不会再将此信息发送到您的应用程序。 这样,它可以保护其他用户的隐私免受不必要的侵犯。 作为交换,他们可以查看是否将其列入黑名单。
那么看花和被遮挡有什么共同点呢? 两者都可以在给定的时刻进行检查,从而根据您是否被阻止来接收一点信息。 另一个优点是,Telegram可能不会存储用户互相阻塞的日志(最多仅在短期内用于日志记录)。
组织位
发送和接收位的可能性很有趣,但我们仍然需要描述其利用机制。 电报在被阻止时拒绝通知您,因此每个``接收位''操作应由收件人初始化(我们称他为鲍勃),而不依赖发件人(她将是爱丽丝),即独立进行。 同样,爱丽丝和鲍勃应该以相同的频率发出请求。
每个时钟上的位交换算法如下所示:
- A检查发送位,如果与先前的值不同,则根据值进行更改:
- A-> T:如果位为1,则块B;否则为0。
- A-> T:如果位为0,则取消阻止B。
- B收到一点:
- B-> T:解决A;
- T-> B:B可获得有关A的信息;
- B:检查接收到的信息是否具有状态:
- B:如果是->他没有被阻止并且该位为0
- B:如果不是->他被阻止,该位为1
大多数现代PC具有良好的频率发生器(例如,系统时钟),因此我们可以与它们同步时钟,而无需使用通道来传输除消息位以外的任何内容。 仅值得注意的是,Telegram API请求(取消(阻止)和解决用户状态)都是网络调用,并且无法快速工作,特别是在使用代理或VPN的情况下。 这产生了一个局限性:时钟长度应该比平均响应时间更长(因为我们需要使响应时间适应),这就是我们的数据传输速度受到限制的原因。
编码信息
自然语言的文本具有很高的冗余度,并且收到错误消息后,大多数人仍然可以阅读。 而且由于Telegram是使者(忽略一些疯狂的东西 ),所以我们可以忽略纠错,从而限制了将数据传输到简单文本消息的可能性。
我们的频道带宽极低,因此为什么我们需要对可能的消息使用最有效的消息编码。 幸运的是,使者的名字提醒着我们这个问题是一个普遍的问题。
这就是为什么我们生活在21世纪的人将使用一百年前电报工作者可用的最有效的编码之一- 鲍多(Baudot)编码来编码文本。 更准确地说,由Donald Murray创建的ITA-2最终版本是在该语言的最常用符号上执行较少的API调用。
成功发送消息的唯一剩下的就是找到传输会话的边界,以便接收者可以在连续的比特流中找到已发送的消息。 在传输开始之前,Bob是否被阻止,并且他的状态不会很快改变。 这就是为什么Alice可以通过将会话交换到对端仅一个时钟来发出有关会话开始的信号的原因。 在会议成功结束时,她将解除对他的封锁,并和平离开。 另一方面,他将继续接收零位,直到确定它们不是消息的一部分为止-博多码没有00000
符号。

该方法的缺点是无法将正在进行的转换连接(可以,但是可能由于位偏移而可能需要手动纠错),并且需要将收到的带有错误的空符号与已发送的空符号分开。 但是存在实施的所有问题。
高科技
在花了几个小时尝试使用官方库来使用API之后,我很累,并使用更人性化的Telethon库用Python编写了所有内容。 出于某些奇怪的原因,它甚至还具有同步样式的API,这种情况今天很少见。 自从我自己写的ITA-2消息编码以来,在Internet上没有发现任何有用的信息。
考虑到每个网络API调用所需的时间在大多数情况下都超过十分之一秒,因此使用系统时钟进行时钟同步(是的,它在(sleep()s!之间)! 用户可以根据需要设置传输速度,但是如果您不想同时看到对方的错误并发现自己被防洪系统所禁止,则建议遵循“每秒不超过请求数”的规则。 事实证明,Telegram对API的使用非常挑剔,即使是连续几次尝试(成功!),我的访问都被冻结了一整天,并且出于未知的原因,只是在传输过程中随机阻止了泛滥。 伙计们,您应该始终声明API使用限制。
如果用户决定使用这种奇怪的通道来交换消息,那么他就不必在意任何图形用户界面功能。 而且并非所有系统都具有它,这就是为什么我以终端工具的形式编写应用程序的原因。 它允许通过命令行参数用户ID中给定的通道通过通道发送和接收消息,但是每次启动仅一次操作。 当然,没有人会限制您只运行一个程序的副本,并同时使用两种方式使用多个通道,您只需要使用相同的参数运行同一脚本的多个副本。
使用东西
您可以通过GitHub上的API(最后链接到存储库)来了解有关将此内容同时用作命令行实用工具和python3库的更多信息。 唯一的问题是获取自己的API凭据(简单的手册就足够了),因为Telegram不允许公开我的API凭据并根据脚本的本地副本中的值进行设置。 除了授权部分(默认情况下是通过stdio制作的)外,所有内容都通过命令行参数传递,如下所示:
For Alice: For Bob: Enter your phone number: XXX | Enter your phone number: XXX Enter auth code: YYY | Enter auth code: YYY Started message transmission... | Listening for the message... ---++ ('O', '9') | ---++ ('O', '9') --+-+ ('H', '#') | --+-+ ('H', '#') +++++ (1, 1) | +++++ (1, 1) --++- ('N', ',') | --++- ('N', ',') --+-- (' ', ' ') | --+-- (' ', ' ') ++-++ (0, 0) | ++-++ (0, 0) --+-+ ('H', '#') | --+-+ ('H', '#') -++-- ('I', '8') | -++-- ('I', '8') --+-- (' ', ' ') | --+-- (' ', ' ') --+++ ('M', '.') | --+++ ('M', '.') ++--- ('A', '-') | ++--- ('A', '-') -+-+- ('R', "'") | -+-+- ('R', "'") ++++- ('K', '(') | ++++- ('K', '(') +++++ (1, 1) | +++++ (1, 1) +-++- ('F', '!') | +-++- ('F', '!') --+++ ('M', '.') | --+++ ('M', '.') --+++ ('M', '.') | --+++ ('M', '.') Done, exiting... | ----- ('', '') | ----- ('', '') | Automatically decoded: OH, HI MARK!..
接收到的消息会自动解码,但是如果您想手动更正某些错误或跟踪进度,可以通过查看命令行输出来完成。
电报外
值得一提的是,可以在任何可以检测是否被其他用户阻止的Messenger和/或社交网络上实施这种渠道。 在现有代码中可以轻松替换相似的接口,因此,如果要这样做,只需使用我的基础即可。 由于传输速度低和API调用响应时间短,因此python的性能低(与C / ++这类情况相比)不是限制因素。
PS特别感谢我的激情对我的不寻常爱