【问题标题】:Encrypt binary data with aes-ecb on node.js在 node.js 上使用 aes-ecb 加密二进制数据
【发布时间】:2017-05-04 16:41:19
【问题描述】:

我尝试在 node.js 上进行加密,但很糟糕,我无法获得与在线网站相同的结果。

我想用二进制密钥加密一些二进制数据。我使用nodejs site 上的教程,但我的参考数据集的结果不同。 我的参考数据集使用 java 代码、C 代码和两个在线站点进行了验证: http://aes.online-domain-tools.com/https://www.hanewin.net/encrypt/aes/aes-test.htm

您知道如何以与这些网站相同的方式进行加密吗? 我猜它可能是填充?

提前致谢。 弗朗索瓦

我的参考数据集:

    key=8CBDEC62EB4DCA778F842B02503011B2
    src=0002123401010100000000000000c631
    encrypted=3edde3f1368328a1a37cf596bc8d4a7c

我的代码:

    var key = new Buffer('8CBDEC62EB4DCA778F842B02503011B2', 'hex')
    var src = new Buffer('0002123401010100000000000000c631', 'hex')
    cipher = crypto.createCipher("aes-128-ecb", key)
    result = cipher.update(src).toString('hex');
    result += cipher.final().toString('hex');
    "result   : " + result

输出:

    result   : 4da42b57b99320067979086700651050e972f1febd1d506e5c90d3b5d3bc9424

【问题讨论】:

  • crypto.createCipher 更改为 crypto.createCipheriv 并传递一个空的 IV ("")。此外,您可能希望禁用填充。
  • 切勿使用ECB mode。它是确定性的,因此在语义上不安全。您至少应该使用像CBCCTR 这样的随机模式。最好对您的密文进行身份验证,以免像padding oracle attack 这样的攻击是不可能的。这可以通过 GCM 或 EAX 等认证模式或encrypt-then-MAC 方案来完成。
  • @ArtjomB。在某些情况下,ECB 模式是可以接受的。一个典型的例子是加密的随机会话代码。输入的“足够”熵有非常具体的要求。上面的示例数据是单个 128 位块。
  • @Matt 如果您可以设计和加密分析一种操作模式,那么您可能会评估 ECB 对于您的特定用例是否足够安全。如果您正在谈论加密会话代码,那么我会说在这种情况下只有加密没有意义。相反,可以使用传输层安全性以及会话代码的加密签名以及签名的时间戳。
  • @ArtjomB。有不同的实现和不同的要求。在特定的实现中,ECB 就足够了。 “永远不要使用欧洲央行”的粗体评论具有误导性。我不会评论会话关键示例的“感觉”部分,因为我认为您没有足够的细节来得出结论。

标签: node.js encryption aes ecb


【解决方案1】:

谢谢 Artjom B。

我在下面发布固定代码:

var key = new Buffer('8CBDEC62EB4DCA778F842B02503011B2', 'hex')
var src = new Buffer('0002123401010100000000000000c631', 'hex')
cipher = crypto.createCipheriv("aes-128-ecb", key, '')
cipher.setAutoPadding(false)
result = cipher.update(src).toString('hex');
result += cipher.final().toString('hex');
"result   : " + result

要解密,请执行相同操作:

var key = new Buffer('8CBDEC62EB4DCA778F842B02503011B2', 'hex')
var encrypted = new Buffer('3edde3f1368328a1a37cf596bc8d4a7c', 'hex')
decipher = crypto.createDecipheriv("aes-128-ecb", key, '')
decipher.setAutoPadding(false)
result = decipher.update(encrypted).toString('hex');
result += decipher.final().toString('hex');
"result   : " + result

谢谢,我由衷的感谢。 问候,弗朗索瓦

【讨论】:

  • 请注意,如果要加密的数据并不总是块大小(128 字节)的倍数,则需要填充。此外,ECB 模式也不安全,请参阅ECB mode,向下滚动到 Penguin。而是使用带有随机IV的CBC模式,只需在加密数据前加上IV用于解密即可,它不需要保密。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多