Php 为什么数据中的00会破坏UTF-16编码/OpenSSL?

Php 为什么数据中的00会破坏UTF-16编码/OpenSSL?,php,login,openssl,utf-16,Php,Login,Openssl,Utf 16,我正在开发一个PHP登录,它接受一个ID,并在用户经过身份验证后将其登录到其他地方。它适用于除三个ID之外的每个ID,它们都有一个共同点:它们都以两个零开始(例如:0012) 我想知道双零在编码中是否有特殊的位置,比如分隔符?或者与OpenSSL有关?它只在那三个上断开。不管我是将数据视为字符串还是整数,它都会双向中断。有什么想法吗 代码(稍作修改): 为什么数据中的00会破坏UTF-16编码/OpenSSL 问题不在于OpenSSL。OpenSSL只处理数据—它不关心编码。它可能与openss

我正在开发一个PHP登录,它接受一个ID,并在用户经过身份验证后将其登录到其他地方。它适用于除三个ID之外的每个ID,它们都有一个共同点:它们都以两个零开始(例如:0012)

我想知道双零在编码中是否有特殊的位置,比如分隔符?或者与OpenSSL有关?它只在那三个上断开。不管我是将数据视为字符串还是整数,它都会双向中断。有什么想法吗

代码(稍作修改):

为什么数据中的00会破坏UTF-16编码/OpenSSL

问题不在于OpenSSL。OpenSSL只处理数据—它不关心编码。它可能与openssl签名有关。但现在很难说

您的问题可能与
mb\u convert\u编码有关。但是,您从未说明实际问题是什么


它怎么不起作用?在Linux系统上验证签名时,它不起作用吗?是否检查是否存在(或不存在)字节顺序标记(BOM)?这是一个真正的问题,尤其是在使用Java时。

旁注:您可以使用
$priv\u key=openssl\u pkey\u get\u private(“file:///OpenSSL-Win64/bin/myrsakey.pem");开始时的双零是区分这些ID和其他ID的唯一方法吗?或者这些通常是唯一以零开头的吗?还有很多其他ID,它们可以是4个数字的任意组合(例如:12342454)。它只在以00开头的ID上断开。所有其他数据都是相同的。
openssl\u是否在创建签名成功后立即使用
$data
上以00开头的公钥验证
?是的,无论情况如何,它都返回true。它应该在重定向到URL后登录成员;它适用于任何不以双零开头的ID。我还假设它与
mb\u convert\u编码相关。在它离开我的终端之后,虽然这取决于另一方(我没有访问权限)来接受该数据,所以除了继续发送请求之外,我的测试非常有限。我只是想确保我这边的一切都正常,或者如果有人看到过类似的东西。我还没有尝试在Linus系统上测试它,也没有涉及Java。只是PHP。
            $fp = fopen("/OpenSSL-Win64/bin/myrsakey.pem", "r");
            $priv_key = fread($fp, 8192) or die("File not found."); 
            fclose($fp);

            $pkeyid = openssl_get_privatekey($priv_key);

            $data = '0012'; // THIS DOESN'T WORK
            $data = '0123'; // THIS DOES WORK
            $data = '1234'; // THIS ALSO WORKS

            $data = mb_convert_encoding($data, "UTF-16LE");

            openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_SHA1); 
            openssl_free_key($pkeyid);