我正在设计一个应用程序,允许最终用户从他们的浏览器进行测验。这使得从服务器向最终用户提供问题变得不太合理,因为这将导致突然爆发的请求,因此我打算在他们连接后立即向他们提供问题,并且测验开始时间不到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字节,我是不是以正确的方式完成了整个设置?谢谢
发布于 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命令行实用程序生成:
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字节的密文(一个完整的块)。
https://stackoverflow.com/questions/18109921
复制相似问题