与pidcrypt和openssl_encrypt的兼容性问题

时间:2013-08-07 17:29:28

标签: javascript encryption openssl pidcrypt

我正在设计一个允许最终用户从他们的浏览器中进行测验的应用程序。部分要求是,当测验开始时间到来时,应立即向每个参与者显示问题。这使得来自服务器的最终用户的服务问题不太合理,因为这将导致突然的请求突发,因此我打算在他们连接时立即向他们提出问题,并且在不到2小时的时间内进行测验开始时间。问题在于,由于它是竞争,因此在开始时间之前不应该看到问题,因此需要对其进行加密。

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

现在的问题是对称加密部分。我试图使用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字节,我是否以正确的方式接近整个设置。感谢

1 个答案:

答案 0 :(得分:0)

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

pidcrypt中,随机盐与密码和MD5一起使用以生成密钥和IV。然后将盐预先加到密文上(如openssl所做)。服务器应使用相同的方法生成密钥和IV ,使用预先设置的salt值和共享密码。目前您正在尝试直接使用密钥和IV,这是不正确的。

无论库是什么,用于解密任何CBC模式的IV都应该与底层密码的块大小相同。这里的底层块密码是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__后跟8字节随机盐(不是IV)的ASCII字符串,然后是16字节的密文(一个完整的块)。