【问题标题】:JS-C# double AES encryptionJS-C#双重AES加密
【发布时间】:2015-05-28 15:54:32
【问题描述】:

出于某种原因,我想避免使用 SSL, 虽然,我希望使会话尽可能安全(所以我决定双重加密请求 - JS 端和 C# 端) 我想出了一个可能适合我的解决方案:

  1. 用特定的密钥和IV(AES)加密JS中的请求
  2. 将请求发送到服务器。
  3. 在服务器上 - 使用不同的密钥 (AES) 加密请求
  4. 将响应发送回客户端。
  5. 在客户端 - 使用第一个密钥解密响应。
  6. 将请求发送到服务器。
  7. 在服务器上 - 使用第二个密钥解密请求。

现在,我对加密不太熟悉。 当我在有效的服务器和客户端上使用相同的密钥时(可能是因为使用了相同的密钥) 当我使用不同的密钥时,我无法解密客户端上的双重加密消息。

如何用我当前的算法克服这个问题?这可以做到吗? 如果没有,有其他方法可以模拟吗?

谢谢你。 (需要时提供代码)

【问题讨论】:

  • 您可能希望调查类似STS Protocol 的内容。您的场景将是相同的,Alice 代表 JavaScriptBob 代表 C# 代码。它使用签名和加密来确保无法尝试中间人攻击。我敢肯定,您必须修改确切的实现细节,但总体思路是一样的。
  • EBrown,有什么可以让我们更容易理解STS的实现方式吗?任何准备好的代码? (无论是用哪种语言编写的)
  • 很难说,我自己实现了它,但该代码是专有的(我反对分享样本/细节的合同。)This ARPN 期刊问题上有很好的信息据我所见,以易于理解的方式。它没有实际代码,但它有一个很好的概念概述。
  • 我不完全确定我理解你想通过这个协议实现什么。您的协议可以在 CTR 模式下使用 AES 等流密码轻松实现,但您认为这会实现什么? 1. 您对两个预共享密钥的身份验证感兴趣吗?接收者可以解密密文这一事实是否已经意味着他们拥有第二个密钥? 2. 你真的需要通过网络发送 4 次可能很长的消息吗?或许您应该对用于加密实际数据的随机密钥执行此操作。

标签: javascript c# encryption cryptography aes


【解决方案1】:

对于大多数加密算法,用于加密和解密多阶段加密的密钥序列必须完全相反,即如果使用“密钥 A”-“密钥 B”序列进行加密,则必须使用“密钥 B” "-"密钥 A" 用于解密。

您尝试使用“密钥客户端”-“密钥服务器”序列进行加密,并以相同(a.o.t.)相反的序列进行解密,但这是行不通的。

握手加密密钥的好方法是

  • 双向交换随机会话盐
  • 使用重放安全的东西(例如经过验证的时间戳)作为会话 salt 的一部分
  • 根据会话加盐和共享密钥(例如用户的加盐密码散列)创建一组散列
  • 将这些哈希用作 IV 和 Key

【讨论】:

  • Eugen,如果我公开交换密钥,它将不会受到保护。我的目标也是不使用预共享密钥,因为如果有人在嗅探,它也会被公开。
  • 建议的密钥交换不会通过网络发送密钥 - 并且没有预共享密钥。基本上,用户的密码用于播种每个会话的密钥。只需阅读详细信息。
猜你喜欢
  • 2019-05-15
  • 1970-01-01
  • 2013-07-25
  • 2013-04-19
  • 2014-09-12
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多