首页 文章

与pidcrypt和openssl_encrypt的兼容性问题

提问于
浏览
1

我正在设计一个允许最终用户从他们的浏览器中进行测验的应用程序 . 部分要求是,当测验开始时间到来时,应立即向每个参与者显示问题 . 这使得来自服务器的最终用户的服务问题变得不那么合理,因为这将导致突然的请求突发,所以我打算在他们连接时立即向他们提出问题,并且在测试开始时间不到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

    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__ 的ASCII字符串,后跟一个8字节的随机盐(不是IV),然后是16字节的密文(一个完整的块) .

相关问题