从C#编码URL,在PHP中解密URL(以某种方式添加额外的字符)

到目前为止,我已经阅读了很多关于这个主题的主题,我无法理解问题可能在哪里。 我正在从C#winform应用程序加密部分URL。 然后我想用URL读取URL并解密url(全部使用base-64)。 我确实有一些代码要求:

加密URL的代码(C#):

public static string Base64Encode(string str) { byte[] encbuff = Encoding.UTF8.GetBytes(str); return System.Web.HttpServerUtility.UrlTokenEncode(encbuff); } 

解密url的一部分:

 Base64Encode("CND0311J4S68CCU Ver. F.0BHPQOEM - f"); 

返回:

 Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1 

解密URL(PHP)的代码:

 echo base64_decode("Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1"); 

返回:

 CND0311J4S68CCU Ver. F.0BHPQOEM - f5 

那么,回报结束时额外的“5”来自哪里? 我无法想象我的生活,你可以想象的非常令人沮丧。

我感谢任何帮助 – 以及任何建议!

谢谢,

埃文

 "CND0311J4S68CCU Ver. F.0BHPQOEM - f" 

编码为base64不是:

 Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1 

可能还有其他东西在最后添加1 ,因为

 echo base64_decode("Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY"); 

给你你想要的东西。 添加它的东西实际上是System.Web.HttpServerUtility.UrlTokenEncode 。 问题如下( 来自MSDN ):

此( System.Web.HttpServerUtility.UrlTokenEncode )不使用标准编码。 它使用 – 和_字符编码是标准的。 它还删除了=符号。 但是,不是简单地删除它们(它们不需要解码字符串),而是用数字(0,1,2)替换它们,指示被删除的=符号的数量。

所以去吧( 演示 ):

  

该function非常粗糙,可以进行改进以更具体地处理它( Demo2 ):

 function urltoken_decode($token) { $len = strlen($token); if (!$len) return $token; $digit = $token[$len-1]; if (!in_array($digit, range(0,2))) { throw InvalidArgumentException(sprintf('Invalid end digit (%s).', $digit)); } return base64_decode(substr($token, 0, -1)); } 

有趣的是 – 当我在这个站点 (使用JavaScript)编码“CND0311J4S68CCU Ver.F.0BHPQOEM – f”时,它编码为“Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY”。 如果我解码“Q05EMDMxMUo0UzY4Q0NVIFZlci4gRi4wQkhQUU9FTSAtIGY1”,我会得到额外的5。 显然问题在于编码端 – 也许在传递给base64编码器之前尝试输出你编码的值,以确保它正是你认为的那样?