首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与pidcrypt和openssl_encrypt的兼容性问题

与pidcrypt和openssl_encrypt的兼容性问题
EN

Stack Overflow用户
提问于 2013-08-08 01:29:28
回答 1查看 335关注 0票数 1

我正在设计一个应用程序,允许最终用户从他们的浏览器进行测验。这使得从服务器向最终用户提供问题变得不太合理,因为这将导致突然爆发的请求,因此我打算在他们连接后立即向他们提供问题,并且测验开始时间不到2小时。

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

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

代码语言:javascript
复制
        $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字节,我是不是以正确的方式完成了整个设置?谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-08-08 04:58:14

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

pidcrypt中,随机化的盐与密码和MD5一起使用来生成密钥和IV,然后将盐预先附加到密文中(就像openssl一样)。服务器应该使用相同的方法来生成密钥和IV,使用预先挂起的Salt值和共享密码。当前您正在尝试直接使用键和IV,这是不正确的。

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

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

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

代码语言:javascript
复制
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字节的密文(一个完整的块)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18109921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档