【发布时间】:2017-08-24 07:54:13
【问题描述】:
当我尝试使用 OpenSSL 进行加密时遇到一个奇怪的情况
详情:
- 我尝试使用“Hello World!”加密文件
- 密码(字符串):“testtesttesttest”
- 密码(十六进制):74657374746573747465737474657374
加密文件的终端命令:
-
纯文本密码
openssl aes-128-cbc -e -a -nosalt -iv [some vector] -k [password] -in [input file] -out [output file]openssl aes-128-cbc -e -a -nosalt -iv [some vector] -pass pass:[password] -in [input file] -out [output file]
-
十六进制格式的密码
openssl aes-128-cbc -e -a -nosalt -iv [some vector] -K [HEX password] -in [input file] -out [output file]
因此,命令的唯一区别是一个使用纯文本密码,而另一个使用相同的密码,但采用 HEX 形式。所以在我看来加密的结果应该是一样的。但是 Base64 的输出其实是不一样的。
也许有人知道并可以暗示这里可能是什么情况?
另一个案例是,我现在开发了一个小型应用程序,用于加密黑莓手机上的文件,我希望它与其他加密软件(如 PC 上可用的 OpenSSL)兼容。所以我的应用程序的 Base64 输出与 OpenSSL 使用给定密码生成的输出不同。
示例代码如下所示:
String testKey = "testtesttesttest"; (example)
byte[] aesKeyAsBytes = testKey.getBytes();
AESKey aesKey = new AESKey(aesKeyAsBytes);
AESEncryptorEngine engine = new AESEncryptorEngine(aesKey);
CBCEncryptorEngine cengine=new CBCEncryptorEngine(engine, new InitializationVector(_initVector));
PKCS5FormatterEngine fengine = new PKCS5FormatterEngine(cengine);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BlockEncryptor cryptoStream = new BlockEncryptor(fengine, outputStream);
cryptoStream.write(plainText, 0, numOfPlainTextBytes);
cryptoStream.close();
byte[] cipherText = outputStream.toByteArray();
outputStream.close();
return cipherText;
【问题讨论】:
-
我对 OpenSSL 了解不多,但使用密码可能会应用某种 KDF 并使用结果作为密钥。而十六进制编码的字符串很可能直接用作密钥,因为它正好是 128 位。我想如果你最后传递一个带有一个额外字节的十六进制字符串(例如
00),你可能会得到一个错误? -
@luke-park。如果这是真的,那么这意味着 OpenSSL AES 加密与实现 AES-128-CBC 和其他算法的其他工具不兼容。纯文本密码包含 16 个字符,因此应该是精确的 128 位密钥。
-
嗯,不是这个意思。这意味着如果您想直接使用该字符串作为键(这是一个坏主意),那么您需要先对其进行十六进制编码。
-
@luke-park。我有点困惑。例如,我加密照片并选择密码“Honeymoon_In_Hawaii”。所以这意味着通过 OpenSSL 加密的文件不能被其他工具解密,反之亦然。我需要记住“Honeymoon_In_Hawaii”的 HEX 形式的情况也看起来不够好。
-
@ilmari-karonen:我已将我的应用程序中的示例代码添加到主题中。但也许这个问题更适合 [security.stackexchange.com] 或其他地方。也许其他人对我们使用的纯文本密码如何成为实际用于加密的密钥有这样的误解。感谢luke-park,现在我明白了我的程序中的实际问题。我需要用 OpenSSL 或其他软件使用的一些 KDF 替换 aesKeyAsBytes = testKey.getBytes() 以使其兼容,反之亦然。
标签: linux encryption openssl cryptography