加密,数字签名,数据保护是IT专业人员中相当普遍的术语。
关于这些主题,已经写了很多有趣的出版物,文章和书籍。 读完其中一篇之后,我决定尝试练习。 因此该项目诞生了,下面将进行讨论。
应用简介
SecureDialogues应用程序为通过Gmail等服务传输的邮件添加了加密级别。 应用程序本身使用OAuth2协议对已配置的服务执行授权,并接收和发送消息。 它的核心是常规的Messenger ,它为消息提供加密保护,除非可以使用几种第三方服务之一进行传输。
硬盘上的数据使用256位密钥使用AES算法进行加密,该密钥是从启动时输入的密码中提取的, RSA用于数字签名。 用户消息使用256位AES 会话密钥进行编码。
源代码可在 项目Wiki 的链接上获得。
可以在docker容器中启动应用程序, 更多内容请参见链接 。
创作目的
该应用程序是为非常特定的目的而创建的-我对在一个实际项目中使用密码学很感兴趣。 而不是像“在此处插入文本,而是在此处接收编码的消息”这样的简单消息,而是要有数字签名 , 非对称加密 , 会话密钥和其他有趣的东西。 因此,选择了Messenger项目。
在没有用于发送消息的所有必要基础结构的情况下,此功能委派给了Gmail或VKontakte等现有服务。
接口说明
首次启动时,应用程序将要求您输入密码:

此密码用于加密存储在硬盘驱动器上的数据,例如: RSA密钥, OAuth2的授权令牌,服务和联系人上的数据。
消息和有关对话框的信息不会保存 ,也就是说,在应用程序的末尾,有关接收到的消息和打开的对话框的数据会丢失。
在随后的启动中,该应用程序还要求输入密码以解密和下载以前保存的数据。
主应用程序窗口的视图:

在发送第一条消息之前,必须完成两个步骤:
最重要的是公钥 ,因此在交换开始之前已添加了联系人 。 用户之间发送的每条消息都必须由发件人签名。 如果接收者无法使用公共密钥验证数字签名,则将丢弃此类消息。
同样,公共密钥用于加密会话密钥。
完成所有准备步骤后,您可以开始对话。 为此,在主应用程序窗口中有一个相应的按钮( 在wiki上有更多信息 )。 创建对话时, 将生成一个会话密钥 , 该 密钥将对该对话中的所有消息进行加密 。
所有对话框都显示在左侧的主窗口中。 对话者确认创建对话后,可以在其中发送和接收消息:

要在所需对话框中发送或阅读消息,您需要通过单击鼠标左键来选择它。
远程用户的消息显示在左侧,您的消息显示在右侧。 如果消息尚未传递,则显示为灰色:

该应用程序按以下顺序对对话框列表进行排序-在最顶部将有允许发送消息的活动对话框,在最底部将有关闭的对话框。 此外,顺序受对话框更改时间的影响。 最重要的是,最后收到的消息将是活动的对话,而最后一个关闭的对话将在底部。 对于每个对话,都会显示未读消息数量的指示符(如果有):

对话状态以彩色突出显示:
- 关闭的对话框为红色
- 活动对话框显示为绿色 ,则可以发送消息
- 灰色对话框正在制作中。
这是一个带有世界文本的简单消息的示例! :

信号交换
对话者A和对话者B之间的消息交换包括以下步骤:
- 甲方生成一个用于创建对话框的命令(
CREATE_DIALOG
)并使用其私钥对其进行签名; - 乙方要求用户同意创建对话,如果用户同意,则生成会话密钥T和随机字符串R ,它们分别用公钥A加密并放置在消息正文(
VERIFY_KEY
)中。 整个消息都使用私钥B签名。 - A端解密会话密钥和随机字符串,用会话密钥加密随机字符串,并将结果添加到
KEY_VERIFICATION
消息KEY_VERIFICATION
。 用他的私钥签名整个消息。 - B端解密随机字符串,检查结果是否与字符串R匹配,如果一切正确,则
ACCEPT_DIALOG
签名消息ACCEPT_DIALOG
,这意味着对话建立并且可以进行进一步的消息交换。
成功的对话建立和信号交换如图所示:

项目的进一步发展
目前,该应用程序已经提供了通过数字签名进行消息加密和身份验证的基本功能。 但是支持的服务列表非常小。
将来计划增加它。 包括VKontakte在内的工作已经在进行中。
该项目中还增加了用户界面的信息内容,例如添加了用于连接服务的状态(活动,连接错误等)。
用于检查重复消息的算法不能以最佳方式工作,因此计划最终确定。