如何用C#实现PHP的PACK和sha1

liangzhiweiaa 2018-01-15 10:34:15
$simple_nonce = "224486403";
$tm_created = "2016-03-03T10:56:42Z";
$ecshipPassword = "Password2014";

echo base64_encode(pack('H*', sha1(pack('H*', $simple_nonce). pack('a*', $tm_created). pack('a*', $ecshipPassword))));

用C#怎么都不能输出一样的结果,求大神
...全文
388 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
转16进制然后按asc码转成对应字符
  • 打赏
  • 举报
回复
simple_nonce转16进制+tm_created + ecshipPassword 进行sha1摘要,然后转成base64字符串试试 单独pack能看懂,但pack.pack 不懂啥意思
liangzhiweiaa 2018-01-16
  • 打赏
  • 举报
回复
引用 1 楼 DOwnstairs 的回复:
如果没有直接调用的API。可以尝试调用PHP脚本来返回值。曲线救国 不知道你能明白我的意思么 就是例如PHP一个指定的路径 aa.php?a=1这样的 调用这个脚本进行获取你要得到的值,和调用函数一样,不过变成了外部HTTP调用。
不不不,我要加密后调用PHP的API。现在问题就是不清楚怎么用C#来还原PHP的加密方式
xuzuning 2018-01-16
  • 打赏
  • 举报
回复
php 的 pack('H*', sha1... 在 C# 中不需要,H* 的含义是说参数串是一组十六进制数 C# 中都用的是 byte[] 数组,没必要转来转去
xuzuning 2018-01-16
  • 打赏
  • 举报
回复
$simple_nonce = "224486403";
$tm_created = "2016-03-03T10:56:42Z";
$ecshipPassword = "Password2014";
echo base64_encode(pack('H*', sha1(pack('H*', $simple_nonce). pack('a*', $tm_created). pack('a*', $ecshipPassword))));
KGuhthJTlT2SOH03oXFmfoHjMwE=
        static void Main(string[] args)
        {
            var simple_nonce = "224486403";
            var tm_created = "2016-03-03T10:56:42Z";
            var ecshipPassword = "Password2014";
            var r = pack("H*", simple_nonce).Concat(pack("a*", tm_created)).Concat(pack("a*", ecshipPassword)).ToArray();
            r = Sha1(r);
            Console.WriteLine(Convert.ToBase64String(r));

        }
        static byte[] pack(string fmt, string s)
        {
            switch (fmt)
            {
                case "a*":
                    return s.Select(x => (byte)x).ToArray();                    
                case "H*":
                    if (s.Length % 2 == 1) s += "0";
                    byte[] byteArray = new byte[s.Length / 2];
                    for (int i = 0, k = 0; i < s.Length; i += 2, k++)
                    {
                        byteArray[k] = Convert.ToByte(s.Substring(i, 2), 16);
                    }
                    return byteArray;                    
            }
            return s.Select(x => Convert.ToByte(x)).ToArray();
        }
        static byte[] Sha1(byte[] str)
        {
            //建立SHA1对象 using System.Security.Cryptography;
            SHA1 sha1 = new SHA1CryptoServiceProvider();
            return sha1.ComputeHash(str);
        }
KGuhthJTlT2SOH03oXFmfoHjMwE=
liangzhiweiaa 2018-01-16
  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
http://bbs.csdn.net/topics/391926590?page=1#post-400990923 你可以看下这个
看过不行才来发帖的
SoulRed 2018-01-15
  • 打赏
  • 举报
回复
如果没有直接调用的API。可以尝试调用PHP脚本来返回值。曲线救国 不知道你能明白我的意思么 就是例如PHP一个指定的路径 aa.php?a=1这样的 调用这个脚本进行获取你要得到的值,和调用函数一样,不过变成了外部HTTP调用。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧