我正在加密这样的文本(node.js):
var text = "holds a long string..."
var cipher = crypto.createCipher("aes128", "somepassword")
var crypted = cipher.update(text, 'utf8', 'hex')
crypted += cipher.final('hex');
如果我text
直接保存到文件,则为N个字节。如果保存crypted
,文件大小约为N * 2字节。
有什么办法可以使加密文本尽可能接近N个字节?
像AES这样的现代密码可以对二进制数据进行处理。加密字符数据时,首先将其转换为二进制表示形式。这基本上就是UTF-8编码所做的。加密后,您会得到任意的二进制数据,当您尝试对其进行解码时,不一定是有效的UTF-8编码(几乎所有编码都有特殊的结构)。
如果省略output_encoding
fromCipher#update
和Cipher#final
,则会得到一个Buffer
,可以将其连接或写入文件。它以二进制格式管理数据,但在打印时默认为十六进制。当您将缓冲区写入文件时,文件大小将接近纯文本大小,但永远不会达到该大小。
AES是一种分组密码,只能加密一个正好16字节的块。ECB或CBC之类的操作模式使您可以加密多个块。最后,像默认的PKCS#7填充这样的填充方案使您能够加密任意长度的文本。该填充总是在实际解密之前添加一些字节。确切地说,它增加了1到16个字节。
您可以使用它cipher.setAutoPadding(false)
来防止填充,但是随后您需要填充自己。您还可以使用类似CTR(“ aes-128-ctr”)的流模式,但是随后您需要提供12字节的唯一IV(即刻)以确保其安全性。此随机数不必是秘密的,但您必须将其传输到解密器。
最后,密文实际上不可能与明文完全一样大小。总有一些东西会使密文膨胀。
切勿使用crypto.createCipher
。您需要使用随机密码来获得语义安全性。使用crypto.createCipheriv
带有新鲜和随机IV。对于CTR模式,IV必须是唯一的;对于CBC模式,IV必须是不可预测的。
始终使用经过身份验证的加密。它使您能够检测到错误的密钥和密文的(恶意)篡改。这是AES-GCM的示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句