【问题标题】:OpenSSL File encryption in PHP and decrypting in C++PHP 中的 OpenSSL 文件加密和 C++ 中的解密
【发布时间】:2020-04-14 02:53:57
【问题描述】:

如何使用 OpenSSL 在 PHP 中加密文件内容并在 C++ 中解密? 这是我的代码:

$dll = file('file.dll')[0];

$iv = substr(hash('sha256', 'test'), 0, 16);
$key = substr(hash('sha256', 'test'), 0, 32);

$dll_en = openssl_encrypt($dll, "AES-256-CBC", $key, 0, $iv);

这里是 c++

int main() {
    /* A 256 bit key */
    byte* key = (byte*)"9f86d081884c7d659a2feaa0c55ad015";
    /* A 128 bit IV */
    byte* iv = (byte*)"9f86d081884c7d65";

    std::vector<byte> data = base64_decode("CyeJtJecBChtVSxeTLw9mYKapHwLNJed/5VVuyGOHNSTksBzH1Ym2JwLJv/LvlT9tqMEahwcX7Yj9jYVRCSnTliz/zQYk0pIi8CKTEGkqffqZd8CdA6joLMl9Ym6d+5wERgHEotURq8Kn+H3/GbUuEBUtLL9Cd1+VsKWDyqkE1c=");
    byte* ciphertext = new byte[data.size()];

    for (size_t i = 0; i < data.size(); i++)
    {
        ciphertext[i] = data.at(i);
    }

    byte decryptedtext[8096];
    int decryptedtext_len;

    decryptedtext_len = decrypt(ciphertext, data.size(), key, iv, decryptedtext);
    decryptedtext[decryptedtext_len] = 0;

    std::cout << decryptedtext;

    return 0;
}

解密函数来自here

dll的第一行是 MZ����@�� �!�L�!This program cannot be run in DOS mode. 但我在控制台中得到的只是MZÉ。 我做错了什么?

【问题讨论】:

  • 静态 IV 是一个非常糟糕的主意,从密钥派生的 IV 是一个更糟糕的主意,而实际上是密钥子字符串的 IV 是一个灾难性的糟糕主意。 IV 应该在每条消息中随机生成,并且通常打包到消息的前 N ​​个字节中,因为它们本身不应被视为秘密。
  • 由于没有直接消息系统,所以我可以联系您,请发邮件至 shokarta@gmail.com 给我好吗?有件事想与您合作希望管理员可以将此帖子至少保留一段时间,以便用户可以与我联系。或者如果 stackoverflow 可以通过任何方式直接联系用户,请分享如何...

标签: php c++ file encryption openssl


【解决方案1】:

除了你选择的输出方法没有错!

由于您将byte* 传递给std::cout,它知道何时停止的唯一方法是将输入视为C 字符串,即8 位字节序列。当它遇到一个值为 ZERO 的值时,它认为它是一个空终止符并停止。它正在正常工作。

但是您的输入不是 ASCII!它是任意的“二进制”数据。

您应该改用std::cout.write(decryptedtext, decryptedtext_len) 之类的东西,它只会将所有您的字节扔到输出流中。然后由您的控制台/电传打字机/打印机来呈现它认为合适的内容(这可能与您正在寻找的内容不同,具体取决于设置)。

【讨论】:

    【解决方案2】:

    没什么,在打印二进制文件时,您只需使用 ASCII 而不是 UTF-8 来获取内容,并且会跳过字符,直到遇到 00 值字节,而不是打印为带有问号的菱形。改为执行二进制比较。

    当然你应该注意,密钥和 IV 的计算,甚至更多的 IV 在 PHP 模式下是完全不安全的,而且 CBC 模式不提供身份验证,所以代码没有应有的安全。

    【讨论】:

    • “在打印二进制文件时,您只需使用 ASCII 而不是 UTF-8 格式” 这并不完全正确,但它接近于正确解释为什么流式传输结束在第一个空字节处(通过 history
    猜你喜欢
    • 2018-11-28
    • 2016-04-15
    • 2018-10-27
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多