javascript - pidcrypt 和 openssl_crypt 的兼容性问题

标签 javascript encryption openssl pidcrypt

我正在设计一个应用程序,允许最终用户通过浏览器进行测验。部分要求是,当测验开始时间临近时,问题应立即显示给每个参与者。这使得从服务器向最终用户提供问题不太合理,因为这会导致请求突然爆发,因此我打算在他们连接后立即向他们提供问题,并且距离测验开始时间不到 2 小时。问题是,由于这是一场比赛,问题在开始时间之前不应该被看到,因此需要对其进行加密。

我决定分两个阶段进行加密,第一阶段的加密使用非对称 RSA 加密来交换 key ,我已经成功完成了这一点。该 key 将用于加密将在服务器和客户端之间发送的任何其他数据。

现在的问题是对称加密部分。我正在尝试使用 openssl_encrypt 方法在服务器端进行加密,并尝试在客户端使用 pidcrypt (一个 javascript 加密/解密库)进行解密。事实证明,pidcrypt 要求您的 iv(初始化向量)长度为 8 个字节,但是使用 AES-256-CBC 模式的 openssl_encrypt 不允许使用 8 个字节,而是不断坚持使用 16 个字节。我做了很多排列和实验,但没有运气。 pidcrypt 的文档中指出它与 openssl 兼容,所以我的问题是 - 我做错了什么? 下面是使用 PHP 在服务器端加密的代码

        $iv_len = openssl_cipher_iv_length("AES-256-CBC");
            $key='My very secret key.......';
    $iv = openssl_random_pseudo_bytes($iv_len);
    $enc = openssl_encrypt('Hello', "AES-256-CBC", $key, 0, $iv);
    $encryptedMessage = base64_encode("Salted__".bin2hex($iv).$enc);
    echo json_encode(array('key'=>$key, 'encrypt'=>$encryptedMessage,));

请问有没有办法让 $iv_len 长为 8 个字节,而不是此代码不断返回的 16 个字节,我是否以正确的方式处理整个设置。谢谢

最佳答案

pidcrypt 不使用 8 字节 IV,它使用 8 字节 salt。 IV 和盐是不同的概念,尽管它们有许多相似之处。

在 pidcrypt 中,随机盐与密码和 MD5 一起使用来生成 key 和 IV。然后将盐添加到密文之前(如 openssl 所做的那样)。服务器应该使用相同的方法来生成 key 和 IV,使用预先添加的盐值和共享密码。目前您正在直接使用 key 和 IV 进行尝试,这是不正确的。

无论使用什么库,用于解密任何 CBC 模式的 IV 都应与底层密码的 block 大小相同。这里的底层分组密码是 AES,这意味着 IV 将始终为 16 字节。

您应该仔细阅读用户对未记录的 openssl_encrypt 方法的评论,然后可能在 PHP 中找到另一个 openssl 兼容库,或者查找/实现 the OpenSSL key derivation method (EVP_BytesToKey) .

请注意,以下输出是由 openssl 命令行实用程序生成的:

00000000  53 61 6c 74 65 64 5f 5f  44 a2 2f ee ac ee 94 fd  |Salted__D./.....|
00000010  6f 93 17 24 44 12 88 66  e7 fe 5c d5 7d 81 fe d9  |o..$D..f..\.}...|
00000020

这是一个包含 Salted__ 的 ASCII 字符串,后跟 8 字节随机盐(不是 IV),然后是 16 字节密文(一个完整的 block )。

关于javascript - pidcrypt 和 openssl_crypt 的兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18109921/

相关文章:

javascript - 延迟对象链可以用于事件处理程序吗?

javascript - 在上下文或 props 中找不到 "store"

c - 使用指针加密字符串的函数

CS50破解问题。需要有关如何解密 2-4 个字符的单词的帮助

objective-c - 返回可变大小字节数组并释放内存

javascript - 从包含多维的字符串构建 JSON 对象

javascript - Object.freeze() 不卡住传递的对象中的对象有什么好处?

.net - 使用 protected 配置对web.config进行加密毫无意义吗?

c - 在 C 中使用 OpenSSL API 进行加密

windows - 为 Win32 编译 OpenSSL 时出错