深夜读书会

 找回密码
 注册
搜索
查看: 1169|回复: 17

[闲聊] 论迷惑度娘的可行性

[复制链接]

28

主题

106

帖子

3220

积分

吃书妖怪

Rank: 5Rank: 5Rank: 5

积分
3220
贡献
3220
金币
3692
发表于 2022-3-8 21:40:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 hoebec 于 2022-3-8 21:50 编辑

度娘出的在线解压功能太过强大,号几乎都被封完了,所以尝试迷惑下度娘

据对rar文件加密的了解,如果加密的压缩包切掉前面的几十个字节,后面的数据就应该解压不出来了.只有几十个字节也很容易用其他路径来传递.

下面是一个自动切割/合并的bat脚本,双击运行,拖放文件/文件夹,ENTER
输入的是文件路径就进入切割模式,下一步是输入切割的文件头长度,默认是32.再下一步是输入另外一个切割长度(剩余文件的分卷大小,默认50M,留空则不分卷),运行后生成目标文件夹
输入的是文件夹路径就进入合并模式,把文件夹内所有文件按文件名排序进行合并(数字的排序要注意补零),运行后生成目标文件
  1. ' 2>nul&cls&@echo off
  2. ' 2>nul&title Binary-Split
  3. ' 2>nul&Setlocal Enabledelayedexpansion
  4. ' 2>nul&Set /p "Input=Input File/Folder:"
  5. ' 2>nul&Start "" Wscript.exe %0 %Input% //Nologo //e:vbs &exit
  6. Set objFSO = CreateObject("scripting.filesystemobject")
  7. Set ADO = CreateObject("Adodb.Stream")
  8. Input = Wscript.Arguments(0)
  9. ADO.Type = 1
  10. ADO.Mode = 3

  11. If objFSO.FileExists(Input) Then
  12.   Splpresize=InputBox("Split Presize",,"32")
  13.   If IsEmpty(Splpresize) Then Wscript.quit
  14.   Splsufsize=InputBox("Split Sufsize",,"50,000,000")
  15.   If IsEmpty(Splsufsize) Then Wscript.quit
  16.   Splpresize=Int(Splpresize)
  17.   If Splsufsize=Empty Then Splsufsize=0
  18.   Splsufsize=Int(Splsufsize)
  19.   OutputFolder=objFSO.GetParentFolderName(Input)&"\"&objFSO.GetBaseName(Input)&"-Split"
  20.   If not objFSO.FolderExists(OutputFolder) Then objFSO.createFolder(OutputFolder)
  21.   BinarySplitLoop Input,Splpresize,Splsufsize,OutputFolder
  22. End If

  23. If objFSO.FolderExists(Input) Then
  24.   For Each i in objFSO.GetFolder(Input).files
  25.     Output=Input&"-Combine."&objFSO.GetExtensionName(i)
  26.     Exit For
  27.   Next
  28.   For Each i in objFSO.GetFolder(Input).files
  29.     n=n+1
  30.     ADO.Open
  31.     ADO.LoadFromFile i
  32.     CombineStr=ADO.Read
  33.     ADO.Close
  34.     ADO.Open
  35.     If n=1 Then
  36.       ADO.Write CombineStr
  37.       ADO.SaveToFile Output,2
  38.      Else
  39.       ADO.LoadFromFile Output
  40.       ADO.position=ADO.size
  41.       ADO.Write CombineStr
  42.       ADO.SaveToFile Output,2
  43.     End If
  44.     ADO.Close
  45.     CombineStr=Empty
  46.   Next
  47. End If

  48. Wscript.Echo "done"

  49. Function BinarySplit(ImpFile,PreSize,ExpPreFile,ExpSufFile)
  50.   ADO.Open
  51.   ADO.LoadFromFile ImpFile
  52.   Splitprestr=ADO.Read(PreSize)
  53.   Splitsuflen=ADO.size-PreSize
  54.   ADO.position=PreSize
  55.   Splitsufstr=ADO.Read(Splitsuflen)
  56.   ADO.Close
  57.   ADO.Open
  58.   ADO.Write Splitprestr
  59.   ADO.SaveToFile ExpPreFile,2
  60.   ADO.Close
  61.   ADO.Open
  62.   ADO.Write Splitsufstr
  63.   ADO.SaveToFile ExpSufFile,2
  64.   ADO.Close
  65. End Function

  66. Function BinarySplitLoop(ImpFile,PreSize,SufSize,ExpFolder)
  67.   Outputnum=0
  68.   Outputpre=ExpFolder&"\part"&Outputnum&"."&objFSO.GetExtensionName(ImpFile)
  69.   Outputnum=Outputnum+1
  70.   Outputsuf=ExpFolder&"\part"&Outputnum&"."&objFSO.GetExtensionName(ImpFile)
  71.   Call BinarySplit(ImpFile,PreSize,Outputpre,Outputsuf)
  72.   If SufSize>0 Then
  73.     Splitsufsize=objFSO.GetFile(ImpFile).size-PreSize
  74.     Do while Splitsufsize>SufSize
  75.       Splitsufsize=Splitsufsize-SufSize
  76.       Outputpre=Outputsuf
  77.       Outputnum=Outputnum+1
  78.       Outputsuf=ExpFolder&"\part"&Outputnum&"."&objFSO.GetExtensionName(ImpFile)
  79.       Call BinarySplit(Outputpre,SufSize,Outputpre,Outputsuf)
  80.     Loop
  81.   End If
  82. End Function
复制代码


切割后的文件头可以使用base64方式转换,直接在帖子上发,下面的bat脚本用来做base64转换/反转
双击运行,输入文件路径或base64编码,ENTER
输入txt文件或base64编码,就会在"我的文档"下生成base64_decode-part0.rar.有些base64编码不能直接通过命令行运行,要先保存到txt文件(不能使用utf-8或unicode)
输入的是非txt文件,就会在文件的同一目录生成base64的txt
  1. ' 2>nul&cls&@echo off
  2. ' 2>nul&title Base64-Transfer
  3. ' 2>nul&Setlocal Enabledelayedexpansion
  4. ' 2>nul&Set /p "Input=Input File/Base64Code:"
  5. ' 2>nul&Start "" Wscript.exe %0 %Input% //Nologo //e:vbs &exit
  6. Set objFSO = CreateObject("scripting.filesystemobject")
  7. Set WshShell = CreateObject("Wscript.Shell")
  8. Set ADO = CreateObject("Adodb.Stream")
  9. Set oXml = CreateObject("MSXML2.DOMDocument")
  10. Set oNode = oXml.CreateElement("tmpNode")
  11. Set RE = CreateObject("vbscript.RegExp")
  12. Input = Wscript.Arguments(0)

  13. If objFSO.FileExists(Input) Then
  14.   If Lcase(objFSO.GetExtensionName(Input))="txt" Then
  15.     Base64Text=objFSO.OpenTextFile(Input,1).ReadAll
  16.     CodeType=1
  17.    Else
  18.     CodeType=2
  19.   End If
  20. Else
  21.   Base64Text=Input
  22.   CodeType=1
  23. End If

  24. If CodeType=1 Then
  25.   BinaryFile=WshShell.SpecialFolders("MyDocuments")&"\base64_decode-part0.rar"
  26.   oNode.dataType = "bin.base64"
  27.   oNode.Text = Base64Text
  28.   ADO.Type = 1
  29.   ADO.Open
  30.   ADO.Position = 0
  31.   ADO.Write(oNode.NodeTypedValue)
  32.   ADO.SaveToFile BinaryFile,2
  33.   ADO.Close
  34. End If

  35. If CodeType=2 Then
  36.   Base64TextFile=objFSO.GetParentFolderName(Input)&"\"&objFSO.GetBaseName(Input)&"-base64.txt"
  37.   oNode.dataType = "bin.base64"
  38.   ADO.CharSet = "ascii"
  39.   ADO.Type = 2
  40.   ADO.Open
  41.   ADO.LoadFromFile(Input)
  42.   ADO.Position = 0
  43.   ADO.Type = 1
  44.   oNode.nodeTypedValue = ADO.Read(-1)
  45.   ADO.Close
  46.   RE.Global = True
  47.   RE.MultiLine = True
  48.   RE.IgnoreCase = True
  49.   RE.Pattern = vbLf
  50.   OutputBase64Text=oNode.Text
  51.   OutputBase64Text = RE.Replace(OutputBase64Text,"")
  52.   Set bt=objFSO.OpenTextFile(Base64TextFile,2,1)
  53.   bt.Write OutputBase64Text
  54.   bt.close
  55. End If

  56. Wscript.Echo "done"
复制代码


理论上说,把文件头去掉,度娘无论如何也猜不出里面有什么东西了,也许能提高某些文件的防聚爆能力
一个自动给文件名数字补零的脚本:http://ritdon.com/forum.php?mod=viewthread&tid=8679

实例:
http://ritdon.com/forum.php?mod=viewthread&tid=9509
http://ritdon.com/forum.php?mod=viewthread&tid=9514
回复

使用道具 举报

23

主题

1678

帖子

3503

积分

吃书妖怪

Rank: 5Rank: 5Rank: 5

积分
3503
贡献
3503
金币
1101
发表于 2022-3-8 22:46:57 | 显示全部楼层
精神可嘉,祝你成功。
回复 支持 反对

使用道具 举报

1

主题

447

帖子

910

积分

小书痴

Rank: 3

积分
910
贡献
910
金币
1693
发表于 2022-3-8 23:08:49 | 显示全部楼层
這個完全看不懂...可以簡單一些
回复 支持 反对

使用道具 举报

8

主题

372

帖子

1401

积分

小书痴

Rank: 3

积分
1401
贡献
1401
金币
741
发表于 2022-3-9 00:02:47 | 显示全部楼层
能不能试试这一招:
把图片和经过加密的压缩包进行二进制合并,再上传到度娘呢?
压缩包可以进行二次加密,甚至第三方二次加密(比如简单的异或加密,将密码进行编码后转二进制,对加密过的压缩包直接进行一次加密)
比起合并,我认为这样做的可行性更高。
而且,可以直接用油猴脚本进行解压,操作比bat方便多了。
回复 支持 反对

使用道具 举报

8

主题

372

帖子

1401

积分

小书痴

Rank: 3

积分
1401
贡献
1401
金币
741
发表于 2022-3-9 00:05:05 | 显示全部楼层
补充说明:图片和压缩包的二进制合并,是很久以前的图种的做法。
只要后缀名是图片,又能读出图片本身,图片后附加的信息或许就会被度娘忽略。

此外,如果是图种的话,也可能通过图床进行传播。
如果图床不会清除额外的二进制信息的话。
回复 支持 反对

使用道具 举报

8

主题

372

帖子

1401

积分

小书痴

Rank: 3

积分
1401
贡献
1401
金币
741
发表于 2022-3-9 00:28:59 | 显示全部楼层
再补充说明:
关于压缩包加密,度娘大概率是会用常用密码去碰瓷解压。此外,也有可能有人不听话进行在线解压。
所以,只要使用第三方加密,而不是压缩包加密,就能基本避开度娘在线解压的功能。

除了网络上的加密算法以外,楼主也可以自己开发加密算法。毕竟目标只是混淆度娘的自动程序,以及避免不听话的人进行在线解压,所以加密算法本身不需要搞得太过复杂。
我个人自己整过一些,只要有心人想破解就会轻易破解,但并非现成算法所以不知道算法的一般人大概率就没法破解的加密算法。这里贴出来给楼主参考

算法1:语言C#,利用一个整形数做密码的算法。这是加密算法的核心来着,算法设计思路是用离散算法扩张初始的整型数,形成一个二进制序列,用二进制序列对原数据进行异或加密,并且并入原数据的内容形成更复杂的异或密码。
  1. public abstract class Int32Encryptor
  2.     {
  3.         /// <summary>
  4.         /// 基础值
  5.         /// </summary>
  6.         protected int baseNumber;


  7.         static byte nc(byte xu, byte xv)
  8.         {
  9.             int u = xu;
  10.             int v = xv;
  11.             v = (u * (u + 1) * (u + 2)) ^ (21401 * (int)Math.Pow(v, 2) + 2531011);
  12.             v ^= ((v >> 16) & 56544866);
  13.             v ^= ((v >> 8) & 226800473);
  14.             v = Math.Abs(v);
  15.             v %= 256;
  16.             return (byte)v;
  17.         }

  18.         /// <summary>
  19.         /// 获取基于基础值扩展得来的扩展密钥组
  20.         /// </summary>
  21.         /// <param name="rank"></param>
  22.         /// <param name="baseNumber"></param>
  23.         /// <returns></returns>
  24.         protected static List<byte[]> GetExtendKey(int rank, int baseNumber)
  25.         {
  26.             uint tm =(uint) baseNumber ;
  27.             var p = new byte[] { 0, 0, 0, 0 };
  28.             p[0] = (byte)((tm & 0xFF000000) >> 24);
  29.             p[1] = (byte)((tm & 0xFF0000) >> 16);
  30.             p[2] = (byte)((tm & 0xFF00) >> 8);
  31.             p[3] = (byte)(tm & 0xFF);

  32.             var ks = new List<byte[]>();
  33.             var mx = 6 + 2 * rank;
  34.             for (var i = 0; i < mx; i++)
  35.             {
  36.                 byte[] b;
  37.                 if (i == 0) b = p;
  38.                 else b = ks[i - 1];
  39.                 var len = b.Length;
  40.                 var a = new byte[b.Length + 1];
  41.                 for (var k = 0; k < len; k++)
  42.                 {
  43.                     byte u = 1;
  44.                     if (k > 0) u = a[k - 1];
  45.                     else if (i > 0) u = b[b.Length - 1];
  46.                     var v = (byte)(b[k] % 256);
  47.                     v = nc(u, v);
  48.                     a[k] = v;
  49.                 }
  50.                 var ax = 0;
  51.                 for (var l = 0; l < len; l++)
  52.                 {
  53.                     var ay = (int)Math.Pow((a[l] + 773) >> 2, 2);
  54.                     ay = ay ^ ((ay >> 4) & 9752438);
  55.                     ax += ay % 16777216;
  56.                 }
  57.                 a[len] = nc(a[0], (byte)(ax % 256));
  58.                 ks.Add(a.ToArray());
  59.             }
  60.             ks.RemoveRange(0, ks.Count - rank);
  61.             return ks;
  62.         }

  63.         /// <summary>
  64.         /// 解密算法
  65.         /// </summary>
  66.         /// <param name="Input"></param>
  67.         /// <param name="ks"></param>
  68.         /// <returns></returns>
  69.         protected static byte[] Decrypt(byte[] Input, List<byte[]> ks)
  70.         {
  71.             var resault = Input.ToArray();

  72.             var l = resault.Length;
  73.             bool mod2 = l % 2 == 0, mod3 = l % 3 == 0;
  74.             bool tcut = !mod2 && !mod3;

  75.             for (var k = ks.Count - 1; k >= 0; k--)
  76.             {
  77.                 //还原交换混淆法。
  78.                 if (l > 3)
  79.                 {
  80.                     if (k % 4 == 0 && mod3)
  81.                     {
  82.                         for (var z = 0; z < l; z += 3)
  83.                         {
  84.                             var t = resault[z];
  85.                             resault[z] = resault[z + 1];
  86.                             resault[z + 1] = resault[z + 2];
  87.                             resault[z + 2] = t;
  88.                         }
  89.                     }
  90.                     if (k % 4 == 1 && mod2)
  91.                     {
  92.                         for (var z = 0; z < l; z += 2)
  93.                         {
  94.                             var t = resault[z];
  95.                             resault[z] = resault[z + 1];
  96.                             resault[z + 1] = t;
  97.                         }
  98.                     }
  99.                     if (k % 4 == 2 && !mod2)
  100.                     {
  101.                         {//将前三条记录进行交换
  102.                             var t = resault[0];
  103.                             resault[0] = resault[1];
  104.                             resault[1] = resault[2];
  105.                             resault[2] = t;
  106.                         }
  107.                         for (var z = 3; z < l; z += 2)
  108.                         {
  109.                             var t = resault[z];
  110.                             resault[z] = resault[z + 1];
  111.                             resault[z + 1] = t;
  112.                         }
  113.                     }
  114.                     if (k % 4 == 3 && tcut)
  115.                     {
  116.                         for (var z = 0; z < l - 3; z += 2)
  117.                         {
  118.                             var t = resault[z];
  119.                             resault[z] = resault[z + 1];
  120.                             resault[z + 1] = t;
  121.                         }
  122.                         {//将后三条记录进行交换
  123.                             var t = resault[l - 3];
  124.                             resault[l - 3] = resault[l - 2];
  125.                             resault[l - 2] = resault[l - 1];
  126.                             resault[l - 1] = t;
  127.                         }

  128.                     }
  129.                 }

  130.                 var key = ks[k];
  131.                 var kl = key.Length;
  132.                 for (var c = 0; c < l; c++)
  133.                 {
  134.                     resault[c] = (byte)(resault[c] ^ key[c % kl]);
  135.                 }
  136.             }
  137.             return resault;
  138.         }

  139.         /// <summary>
  140.         /// 加密算法
  141.         /// </summary>
  142.         /// <param name="source">待加密的数据</param>
  143.         /// <param name="ks">加密所用的密钥组</param>
  144.         /// <returns></returns>
  145.         protected static byte[] Encrypt(byte[] source, List<byte[]> ks)
  146.         {
  147.             var resault = source.ToArray();

  148.             var l = resault.Length;
  149.             bool mod2 = l % 2 == 0, mod3 = l % 3 == 0;
  150.             bool tcut = !mod2 && !mod3;


  151.             for (var k = 0; k < ks.Count; k++)
  152.             {
  153.                 var key = ks[k];
  154.                 var kl = key.Length;
  155.                 for (var c = 0; c < l; c++)
  156.                 {
  157.                     resault[c] = (byte)(resault[c] ^ key[c % kl]);
  158.                 }
  159.                 //使用交换混淆法。
  160.                 if (l > 3)
  161.                 {
  162.                     if (k % 4 == 0 && mod3)
  163.                     {
  164.                         for (var z = 0; z < l; z += 3)
  165.                         {
  166.                             var t = resault[z];
  167.                             resault[z] = resault[z + 2];
  168.                             resault[z + 2] = resault[z + 1];
  169.                             resault[z + 1] = t;
  170.                         }
  171.                     }
  172.                     if (k % 4 == 1 && mod2)
  173.                     {
  174.                         for (var z = 0; z < l; z += 2)
  175.                         {
  176.                             var t = resault[z];
  177.                             resault[z] = resault[z + 1];
  178.                             resault[z + 1] = t;
  179.                         }
  180.                     }
  181.                     if (k % 4 == 2 && !mod2)
  182.                     {
  183.                         {//将前三条记录进行交换
  184.                             var t = resault[0];
  185.                             resault[0] = resault[2];
  186.                             resault[2] = resault[1];
  187.                             resault[1] = t;
  188.                         }
  189.                         for (var z = 3; z < l; z += 2)
  190.                         {
  191.                             var t = resault[z];
  192.                             resault[z] = resault[z + 1];
  193.                             resault[z + 1] = t;
  194.                         }
  195.                     }
  196.                     if (k % 4 == 3 && tcut)
  197.                     {
  198.                         for (var z = 0; z < l - 3; z += 2)
  199.                         {
  200.                             var t = resault[z];
  201.                             resault[z] = resault[z + 1];
  202.                             resault[z + 1] = t;
  203.                         }
  204.                         {//将后三条记录进行交换
  205.                             var t = resault[l - 3];
  206.                             resault[l - 3] = resault[l - 1];
  207.                             resault[l - 1] = resault[l - 2];
  208.                             resault[l - 2] = t;
  209.                         }

  210.                     }
  211.                 }
  212.             }
  213.             return resault;
  214.         }

  215.     }
复制代码


算法2:语言js + c#,这是一个利用数据本身进行加密的算法,优点就是不需要密码,加密解密的速度都挺快的,缺点就是算法被别人知道=密码被别人知道。所以使用时一定要对js进行混淆加密。
算法的思路是:将一段数据的长度作为起始密码,进行离散计算得到一个加密序列,用这个加密序列进行异或加密。并且,可以按需要进行多轮加密,以获得更离散更难破解的序列。
  1. js:
  2.    var Encrypt = function (inputBytes, rank) {
  3.                 var il = inputBytes.length;
  4.                 if (il == 0) {
  5.                     return;
  6.                 }
  7.                 var key0 = il;
  8.                 for (var j = 0; j < rank; j++) {
  9.                     for (var i = 0; i < il; i++) {
  10.                         key0 = (key0 * 16807) % 0x3FFFFFFF;
  11.                         var key = key0 % 256;
  12.                         inputBytes[i] = inputBytes[i] ^ key;
  13.                     }
  14.                 }
  15.             }
复制代码

  1. c#:
  2.   public class WithRandomEncryptor : Int32Encryptor
  3.     {

  4.         public WithRandomEncryptor(int key)
  5.         {
  6.             baseNumber = key;
  7.         }

  8.         public byte[] Encrypt(int Rank, string input)
  9.         {
  10.             if (string.IsNullOrEmpty(input))
  11.             {
  12.                 return new byte[0];
  13.             }

  14.             var ks = GetExtendKey(Rank);

  15.             var e = Encoding.UTF8;
  16.             var b = e.GetBytes(input);

  17.             return Encrypt(b, ks);
  18.         }

  19.         public string Encrypt(string input, int Rank)
  20.         {
  21.             if (string.IsNullOrEmpty(input))
  22.             {
  23.                 return "";
  24.             }
  25.             var b = Encrypt(Rank, input);
  26.             return DataMethods.ConvertArrayTo16String(b);
  27.         }

  28.         public string Decrypt(int Rank, byte[] input)
  29.         {
  30.             if (input == null || input.Length <= 0)
  31.             {
  32.                 return "";
  33.             }

  34.             var ks = GetExtendKey(Rank);

  35.             var b = Decrypt(input, ks);

  36.             if (DataMethods.IsUTF8Bytes(b, out bool unexp))
  37.             {
  38.                 var e = Encoding.UTF8;
  39.                 return e.GetString(b);
  40.             }

  41.             ks = GetExtendKey(Rank);

  42.             b = Decrypt(input, ks);
  43.             if (DataMethods.IsUTF8Bytes(b, out bool unexp2))
  44.             {
  45.                 var e = Encoding.UTF8;
  46.                 return e.GetString(b);
  47.             }
  48.             throw new Exception("解码错误!您没有获得正确的数据。");
  49.         }

  50.         public string Decrypt(int Rank, string input)
  51.         {
  52.             if (string.IsNullOrEmpty(input))
  53.             {
  54.                 return "";
  55.             }
  56.             var bs = DataMethods.Convert16StringToArray(input);

  57.             return Decrypt(Rank, bs);
  58.         }

  59.         List<byte[]> GetExtendKey(int rank)
  60.         {
  61.             ResetKey();
  62.             List<byte[]> ks = new List<byte[]>();

  63.             for (int i = 0; i < rank; i++)
  64.             {
  65.                 generator();
  66.                 var c = extract_number(0) % (18 + rank) + 16;
  67.                 var u = new byte[c];
  68.                 for (int j = 0; j < c; j++)
  69.                 {
  70.                     u[j] = (byte)(extract_number(rank + 2 * j) % 256);
  71.                 }
  72.                 ks.Add(u);
  73.             }
  74.             return ks;
  75.         }

  76.         int[] MT = new int[624];

  77.         void ResetKey()
  78.         {
  79.             MT[0] = baseNumber;
  80.             // 遍历剩下的每个元素
  81.             for (int i = 1; i < 624; i++)
  82.             {
  83.                 MT[i] = (int)(((long)1812433253 * (MT[i - 1] ^ (MT[i - 1] >> 30)) + i) & 0xffffffff);
  84.             }
  85.         }

  86.         void generator()
  87.         {
  88.             for (int i = 0; i < 624; i++)
  89.             {
  90.                 int y = (int)(MT[i] & 0x80000000) ^ (MT[(i + 1) % 624] & 0x7fffffff);
  91.                 MT[i] = MT[(i + 397) % 624] ^ (y >> 1);
  92.                 if (y % 2 != 0)
  93.                 {
  94.                     MT[i] = (int)(MT[i] ^ (2567483615));
  95.                 }
  96.             }
  97.         }

  98.         int extract_number(int index)
  99.         {
  100.             long y = MT[index];
  101.             y = y ^ (y >> 11);
  102.             y = y ^ ((y << 7) & (0x9d2c5680));
  103.             y = y ^ ((y << 15) & (0xefc60000));
  104.             y = y ^ (y >> 18);
  105.             int x = (int)(y & 0xffffffff);
  106.             return Math.Abs(x);
  107.         }

  108.         static void EncryptCliten(ref byte[] inputBytes, int rank)
  109.         {
  110.             var il = inputBytes.Length;
  111.             if (il == 0)
  112.             {
  113.                 return;
  114.             }
  115.             var key0 = il;
  116.             for (var j = 0; j < rank; j++)
  117.             {
  118.                 for (var i = 0; i < il; i++)
  119.                 {
  120.                     key0 = (int)((key0 * (long)16807) % 0x3FFFFFFF);
  121.                     var key = key0 % 256;
  122.                     inputBytes[i] = (byte)(inputBytes[i] ^ key);
  123.                 }
  124.             }
  125.         }

  126.         /// <summary>
  127.         /// 将与客户端交互用的文本加密为16进制文本
  128.         /// </summary>
  129.         /// <param name="input">待加密的文本</param>
  130.         /// <param name="rank">加密层数</param>
  131.         /// <returns></returns>
  132.         static public string EncryptCliten_2Str(string input, int rank)
  133.         {
  134.             if (input == null || input.Length == 0)
  135.             {
  136.                 return "";
  137.             }
  138.             var te = Encoding.UTF8;
  139.             var b = te.GetBytes(input);
  140.             EncryptCliten(ref b, rank);
  141.             return DataMethods.ConvertArrayTo16String(b);
  142.         }

  143.         /// <summary>
  144.         /// 将与客户端交互用的文本加密为字节数组
  145.         /// </summary>
  146.         /// <param name="rank">加密层数</param>
  147.         /// <param name="input">待加密的文本</param>
  148.         /// <returns></returns>
  149.         static public byte[] EncryptCliten_2Bytes( string input,int rank)
  150.         {
  151.             if (input == null || input.Length == 0)
  152.             {
  153.                 return new byte[0];
  154.             }
  155.             var te = Encoding.UTF8;
  156.             var b = te.GetBytes(input);
  157.             EncryptCliten(ref b, rank);
  158.             return b;
  159.         }


  160.         /// <summary>
  161.         /// 将与客户端交互的16进制密文解密为文本
  162.         /// </summary>
  163.         /// <param name="input">16进制密文</param>
  164.         /// <param name="rank">加密层数</param>
  165.         /// <returns></returns>
  166.         static public string DecryptCliten(string input, int rank)
  167.         {
  168.             if (input == null || input.Length == 0)
  169.             {
  170.                 return "";
  171.             }
  172.             var b = DataMethods.Convert16StringToArray(input);
  173.             EncryptCliten(ref b, rank);
  174.             var te = Encoding.UTF8;
  175.             return te.GetString(b);
  176.         }

  177.         /// <summary>
  178.         /// 将与客户端交互的字符数组解密为文本
  179.         /// </summary>
  180.         /// <param name="input">被加密的字节数组</param>
  181.         /// <param name="rank">加密层数</param>
  182.         /// <returns></returns>
  183.         static public string DecryptCliten(byte[] input, int rank)
  184.         {
  185.             if (input == null || input.Length == 0)
  186.             {
  187.                 return "";
  188.             }
  189.             var b = input;
  190.             EncryptCliten(ref b, rank);
  191.             var te = Encoding.UTF8;
  192.             return te.GetString(b);
  193.         }
  194.     }
复制代码

回复 支持 反对

使用道具 举报

28

主题

106

帖子

3220

积分

吃书妖怪

Rank: 5Rank: 5Rank: 5

积分
3220
贡献
3220
金币
3692
 楼主| 发表于 2022-3-9 00:40:31 | 显示全部楼层
香露露 发表于 2022-3-9 00:02
能不能试试这一招:
把图片和经过加密的压缩包进行二进制合并,再上传到度娘呢?
压缩包可以进行二次加密, ...

之前是在找一些不可言说资源时发现,就算有几重加密,仍旧有可能被爆破.
所以研究后,想了一个方法,如果网盘上的东西是不完整的,打不开的,就让人没法聚爆
这个方法的确比插件麻烦,不过度娘要识别出来也一样麻烦,毕竟要假设网盘官方也是知道各种方法的
要是图片和压缩包合并,文件可能会很大?
回复 支持 反对

使用道具 举报

28

主题

106

帖子

3220

积分

吃书妖怪

Rank: 5Rank: 5Rank: 5

积分
3220
贡献
3220
金币
3692
 楼主| 发表于 2022-3-9 00:45:33 | 显示全部楼层
香露露 发表于 2022-3-9 00:28
再补充说明:
关于压缩包加密,度娘大概率是会用常用密码去碰瓷解压。此外,也有可能有人不听话进行在线解 ...

这个太专业了!
回复 支持 反对

使用道具 举报

8

主题

372

帖子

1401

积分

小书痴

Rank: 3

积分
1401
贡献
1401
金币
741
发表于 2022-3-9 00:53:07 | 显示全部楼层
hoebec 发表于 2022-3-9 00:40
之前是在找一些不可言说资源时发现,就算有几重加密,仍旧有可能被爆破.
所以研究后,想了一个方法,如果网盘 ...

文件确实会增大没错。
但你也可以把类似封面这样的图片缩放到一个比较小的尺寸作为表图,这样就算文件稍微增大,也不是不能忍受。

另外,我刚刚想起来,度娘除了会解压外,还会根据文件名智能判断是否是违规文件。
所以,我个人建议,发度娘的时候,文件名本身也要进行混淆。
比如,所有文件名都改成:语文课件 2022.03.09 第一节课   这种奇奇怪怪的名称,并且直到2次加密解密后,才能够看到真实文件名。

关于多重加密被爆破,我个人认为,被他人举报、无论加密几重都用了同一个密码而且还是123456这样的简单密码所以跟一重加密没差、以及直接在文件名上告诉度娘这是违规品(比如直接加上18+的标签),这些情况比起度娘破解多重加密来得合理。
回复 支持 反对

使用道具 举报

8

主题

372

帖子

1401

积分

小书痴

Rank: 3

积分
1401
贡献
1401
金币
741
发表于 2022-3-9 00:54:37 | 显示全部楼层

不,真正专业人士会用效率更高更复杂更难破解的算法。
我这是压根看不懂那些天书一般的算法(连原理都看不懂),才搞了这些简单算法的。
回复 支持 反对

使用道具 举报

8

主题

372

帖子

1401

积分

小书痴

Rank: 3

积分
1401
贡献
1401
金币
741
发表于 2022-3-9 01:01:47 | 显示全部楼层

关于这些算法的应用,如果要用的话,可以这样:
方法一:
如果发布的站点管理员允许你直接在帖子中添加js代码和html代码,可以直接做一个网页版解密器(这个真不难做,需要的话我可以帮忙,但缺点是部分站点中可能只能支持pc,让用户下载后来到解密器这里进行解密)。

方法一又二分之一:
就是如果实在找不到允许你直接贴js和html的站点,也可以花一点小钱或者找免费但有广告的地方建站,站点只放解密器,什么都别说,让人去解密。因为站点只需要一个静态网页,开销应该不会太大才对。

方法二:
制作油猴脚本,让用户安装油猴脚本后,能够自动识别在你在帖子中放置的标记,并改造生成解密器。
回复 支持 反对

使用道具 举报

8

主题

372

帖子

1401

积分

小书痴

Rank: 3

积分
1401
贡献
1401
金币
741
发表于 2022-3-9 01:10:23 | 显示全部楼层
说起来……还有一种理论上的伪装……
docx格式本身是一种zip压缩包。
你可以试着建一个docx文件,在里边随便放一些日记、摘抄、文本这些奇奇怪怪但绝对合法的内容,用压缩包软件打开它,把加密过的真正要发的东西(一定要混淆文件名)丢到docx里边。
这样,在不知道它是什么的情况下,度娘只能识别出一个包含错误、但可修复的docx文件。
回复 支持 反对

使用道具 举报

7

主题

291

帖子

628

积分

小书痴

Rank: 3

积分
628
贡献
628
金币
9122
发表于 2022-3-9 12:19:06 | 显示全部楼层
以前撥接時代就有一堆這種軟體
回复 支持 反对

使用道具 举报

5

主题

195

帖子

1720

积分

图书委员

Rank: 4Rank: 4

积分
1720
贡献
1720
金币
12629
发表于 2022-3-9 15:04:53 | 显示全部楼层
有一个软件 AliShareTool 压缩包伪装 专治在线解压
具体用法可以自行搜索。
回复 支持 反对

使用道具 举报

4

主题

52

帖子

719

积分

小书痴

Rank: 3

积分
719
贡献
719
金币
45
发表于 2022-3-9 15:14:14 | 显示全部楼层
原来,,大家都在学编程,,还是p..
回复 支持 反对

使用道具 举报

1

主题

151

帖子

653

积分

小书痴

Rank: 3

积分
653
贡献
653
金币
903
发表于 2022-3-11 12:38:08 | 显示全部楼层
这就是大佬的世界吗?看不懂
回复 支持 反对

使用道具 举报

142

主题

1万

帖子

1万

积分

图书迷宫

Rank: 7Rank: 7Rank: 7

积分
14161
贡献
14161
金币
10903

空白

发表于 2022-3-11 19:18:22 | 显示全部楼层
這就是神的領域嗎?路人甲還是路過好了
回复 支持 反对

使用道具 举报

2

主题

33

帖子

502

积分

小书痴

Rank: 3

积分
502
贡献
502
金币
1784
发表于 2022-3-11 23:12:47 | 显示全部楼层
只会刷机,别的代码都不会
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|ritdon

GMT+8, 2024-4-29 15:24 , Processed in 0.245709 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表