如何反推这个加密函数?

qazwsxhai 2016-09-16 08:14:14
string s1 = BitConverter.ToString(AlgHelper.Decrypt(privateKey, Convert.FromBase64String(ConfigurationManager.AppSettings["str"])));

看上现, 已经知道s1等多少, 求 ConfigurationManager.AppSettings["str"] , 我的做法是这样的

byte[] a1= AlgHelper.Encrypt(privateKey,Encoding.Default.GetBytes(s1));
String s2 = Convert.ToBase64String(a1);

s2推算的并不正确, 请问怎么反推算是这个加密的方式呢?
...全文
419 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qazwsxhai 2016-09-16
  • 打赏
  • 举报
回复
引用 9 楼 xuzuning 的回复:
但是我不知道 AlgHelper 是什么玩意,所以无法演示给你看
AlgHelper 类的两个加密码函数放出来了.
xuzuning 2016-09-16
  • 打赏
  • 举报
回复
但是我不知道 AlgHelper 是什么玩意,所以无法演示给你看
qazwsxhai 2016-09-16
  • 打赏
  • 举报
回复
完整的对代码是:


     
        Response.Write("<p>");
        //string machineID = HardwareHelper.GetMachineID();		
		string machineID = "D8-19-C7-8B-7D-32-CF-A9-7A-1F-B6-C2-A3-F7-DF-71";		
        Response.Write(machineID);
        Response.Write("<p>start strValiStr 根据机器id生成validation<p>");
		
		String srcStr  = "tg9sIYKX8mPeYwDf0EcRVOhgzMM6eAoRPWlr2onylSaNQH6Le23+PfrMKhP3LYIMloVqiQtA9qNrv80Pu46wJycG7evqjNzBe1Qt1XlCs6TZFJnGyDeRThnwKWGrpyMW5lZY0VdxI+dYhqoDuROrTYke/NxxMlD87wweLQF23/A=";

        //BitConverter.ToString(MD5.Create().ComputeHash(Encoding.Default.GetBytes(string.Format("{0}-{1}-{2}", "SMS", ConfigurationManager.AppSettings["CopyID"], machineID))));
        String strValiStr = BitConverter.ToString(MD5.Create().ComputeHash(Encoding.Default.GetBytes(string.Format("{0}-{1}-{2}", "SMS","EE-500-3886ee9e-2125-afa8-21b9-f678b12e5d9f", machineID))));
        Response.Write("validation:  "+strValiStr);
        Response.Write("<p>end strValiStr<p>");

        string privateKey = "PFJTQUtleVZhbHVlPjxNb2R1bHVzPjdjdVB6K1Jta0FjWHlZSjBDbWJyZ3VUT3JSajVsakRJbXJxUTZLeUtMZ2ZMTWNzcSt6cWFnMnF3NUlDZWNYalB5NGhsOU5vdHFyYTdxQVc3WmVtVkJuMHZ0NFVrYzdlTFhreEN0TGhsVUtSNHpCc3FEUW5QNnppKzFXejBockorV2RUM2MwSTgyK25SOWRHY2hIMnEwTCthL2IwK01jRjBkbnVHUmRReFl1MD08L01vZHVsdXM+PEV4cG9uZW50PkFRQUI8L0V4cG9uZW50PjxQPis5cHQ3RWk3K1dhTXF0ZDN6aExBYWJuQjBkdGxjWkdOVGlqakRYUVgwYXdWazk2RmZYL3FwbW1ZdmRVOE1obDRWTXZUZTI0QkY2aGc0Nk1wZzF6TUVRPT08L1A+PFE+OGJYZ2g4N1pObDJEUnFjdWlvT1U4N3lZamo4RjZZeUliaGg0S08xanJDdmpSV1VzYXpQaEdWaDh4R3FHN3pheE9zdmFSelI1dnFvcENWb1lGMEwxSFE9PTwvUT48RFA+QTE3SDY4cUpZV3dDNCtKZ1F3eXpNSGNBNWZzR24zOXdJYVNnYlRTcGdPL0psaUg3TFZQQjR4bzBwZzJ0Y1lvdnR3ckhPTGFmSXg3b3RRTWc4aFlTMFE9PTwvRFA+PERRPmJZalJWbG43ZnpLRFlnb3pBaHc4N1BOall0cldrQTdhYUtINEdmdng5anp4UWlwbUpiS2Q2SUY4RVBxQmFYZ3Nlb3VVd0QzY2lmWE1vT3RPRFlTUFZRPT08L0RRPjxJbnZlcnNlUT5uRU1HWEl0cVA0UmFlczZtTURCcmRBQzdNS2k1UmRGTjF4bUM1MWNwWmRFZkhHeTVNd05JS0hRQjhSZ0VhdStlNThyQVduRy9sQnk0MG00YlN3SmZyQT09PC9JbnZlcnNlUT48RD5pTTFPTy9TVFNKSzhEWksrUFdtK1hieFNabVR5MllQUk5LcldTUFZTUFc4QVovSVJGUjArM1JIWkdHd2lPdmVjMitQcGUvYTB4UHlCY3dWeExRMDNUTHR2b3h0TEF3NnNDNWpPSjlMWW1kamRRQjYwdkhockdIMlpGbUVsTVJJbUVhOWNWNFN5QkptZUxwYVpyeWY1Z3l0dERHc0pnQzgvZ2Y3eU5uc0VIRUU9PC9EPjwvUlNBS2V5VmFsdWU+";

        string s1 = BitConverter.ToString(AlgHelper.Decrypt(privateKey, Convert.FromBase64String(srcStr)));
        Response.Write("生成的结果: "+s1);		
		
	    //strValiStr 和 s1 是相等的		

        Response.Write("<p>s2<p>");

        String[] aaa = strValiStr.Split('-');

        byte[] a1 = new byte[aaa.Length];
        for (int i = 0; i < aaa.Length;i++ )
        {
            a1[i] = (byte)Convert.ToByte(aaa[i],16);
        }
        byte[] a2 = AlgHelper.Encrypt(privateKey, a1);            
        String s2 = Convert.ToBase64String(a2);
        Response.Write("反推的结果:"+s2);   //为何反推后 s2 不等于 srcStr  ??   -----问题在这里

        Response.Write("<p>");

反推回来的结果 不等于 srcStr 啊. 另附上加密代码,


public static byte[] Decrypt(string privateKey, byte[] data)
        {
            RSACryptoServiceProvider.UseMachineKeyStore = false;
            using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider())
            {
                provider.FromXmlString(Encoding.Default.GetString(Convert.FromBase64String(privateKey)));
                return provider.Decrypt(data, false);
            }
        }



       public static byte[] Encrypt(string publicKey, byte[] data)
        {
            RSACryptoServiceProvider.UseMachineKeyStore = false;
            using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider())
            {
                provider.FromXmlString(Encoding.Default.GetString(Convert.FromBase64String(publicKey)));
                return provider.Encrypt(data, false);
            }
        }


xuzuning 2016-09-16
  • 打赏
  • 举报
回复
Convert.FromBase64String 是将传入的字符串转换成 base64 编码的 byte[] AlgHelper.Decrypt 是将 传入的 byte[] 和键 privateKey 进行解密,返回 byte[] 那么你主贴中的次序是对的,只是 Encoding.Default.GetBytes(s1) 不对而已
qazwsxhai 2016-09-16
  • 打赏
  • 举报
回复
谢谢 xuzuning 还是有问题 string s1 = BitConverter.ToString(AlgHelper.Decrypt(privateKey, Convert.FromBase64String(ConfigurationManager.AppSettings["str"]))); 应该s1的值, 怎么反推 出 ConfigurationManager.AppSettings["str"] 呢?
xuzuning 2016-09-16
  • 打赏
  • 举报
回复
            var s = "01-02-03-04-ab-CD-0a-0A";
var r = s.Split('-').Select(x => (byte)Convert.ToInt16(x, 16)).ToArray();
Console.WriteLine(string.Join(",", r));
Console.ReadKey();


你的 vs 是什么版本的?
            string s = "01-02-03-04-ab-CD-0a-0A";
string[] ar = s.Split('-');
byte[] r = new byte[ar.Length];
for (int i = 0; i < ar.Length; i++)
{
r[i] = (byte)Convert.ToInt16(ar[i], 16);
}
Console.WriteLine(string.Join(",", r));
qazwsxhai 2016-09-16
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
嗯,太随意了
s1.Split('-').Select(x => (byte)Convert.ToInt16(x, 16)).ToArray()
引用 3 楼 xuzuning 的回复:
嗯,太随意了
s1.Split('-').Select(x => (byte)Convert.ToInt16(x, 16)).ToArray()
引用 3 楼 xuzuning 的回复:
嗯,太随意了
s1.Split('-').Select(x => (byte)Convert.ToInt16(x, 16)).ToArray()
你的回答让我大概懂了什么思路,但其它没多大用, c#没你种语法 . String[] aaa = strValiStr.Split('-'); byte[] a1 = new byte[aaa.Length]; for (int i = 0; i < aaa.Length;i++ ) { //a1[i] = (byte)Convert.ToInt16(aaa[i]); (byte)Convert.ToInt16(aaa[i],8); } 花费了很多时间,实在写不出来了.
xuzuning 2016-09-16
  • 打赏
  • 举报
回复
嗯,太随意了
s1.Split('-').Select(x => (byte)Convert.ToInt16(x, 16)).ToArray()
qazwsxhai 2016-09-16
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
当然不对! BitConverter.ToString返回的是形如 12-34-ab-cd 这样的串,用 Encoding.Default.GetBytes 是不能还原的 s1.Split(-").Select(x => (byte)Convert.ToInt16(x, 16)).ToArray()
谢谢, 你这个是怎么写的? 语法错语. c# 不是熟悉.
xuzuning 2016-09-16
  • 打赏
  • 举报
回复
当然不对! BitConverter.ToString返回的是形如 12-34-ab-cd 这样的串,用 Encoding.Default.GetBytes 是不能还原的 s1.Split(-").Select(x => (byte)Convert.ToInt16(x, 16)).ToArray()

110,533

社区成员

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

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

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