我有一个Windows批处理文件,它解码了我的密码(没有narky评论它只是为了看看有什么作用)。
密码是从一个没有问题的文件中读入的,但是我现在试图解码它,除了我不知道如何容纳一小段密码字符的事实之外,我没有任何问题。< / p>
以下作品但仅限于有限数量的字符我如何为不知名(无限制)大小的密码编写类似的东西?
如果你想知道为什么~0,2,因为字母表中的每个字母都由一个双重数字字符集表示,例如00表示A或01表示B thse是在我建立的另一个程序中随机生成的。
IF %MYPASSWORD:~0,2% == %AA% msg * first letter is A
IF %MYPASSWORD:~0,2% == %BB% msg * first letter is B
IF %MYPASSWORD:~0,2% == %CC% msg * first letter is C
IF %MYPASSWORD:~0,2% == %DD% msg * first letter is D
IF %MYPASSWORD:~0,2% == %EE% msg * first letter is E
IF %MYPASSWORD:~0,2% == %FF% msg * first letter is F
IF %MYPASSWORD:~0,2% == %GG% msg * first letter is G
IF %MYPASSWORD:~0,2% == %HH% msg * first letter is H
IF %MYPASSWORD:~0,2% == %II% msg * first letter is I
IF %MYPASSWORD:~0,2% == %JJ% msg * first letter is J
IF %MYPASSWORD:~0,2% == %KK% msg * first letter is K
IF %MYPASSWORD:~0,2% == %LL% msg * first letter is L
IF %MYPASSWORD:~0,2% == %MM% msg * first letter is M
IF %MYPASSWORD:~0,2% == %NN% msg * first letter is N
IF %MYPASSWORD:~0,2% == %OO% msg * first letter is O
IF %MYPASSWORD:~0,2% == %PP% msg * first letter is P
IF %MYPASSWORD:~0,2% == %QQ% msg * first letter is Q
IF %MYPASSWORD:~0,2% == %RR% msg * first letter is R
IF %MYPASSWORD:~0,2% == %SS% msg * first letter is S
IF %MYPASSWORD:~0,2% == %TT% msg * first letter is T
IF %MYPASSWORD:~0,2% == %UU% msg * first letter is U
IF %MYPASSWORD:~0,2% == %VV% msg * first letter is V
IF %MYPASSWORD:~0,2% == %WW% msg * first letter is W
IF %MYPASSWORD:~0,2% == %XX% msg * first letter is X
IF %MYPASSWORD:~0,2% == %YY% msg * first letter is Y
IF %MYPASSWORD:~0,2% == %ZZ% msg * first letter is Z
很好,因为这只涵盖第一个字符。如果我有100个字符,我将不得不做100次1000x以上(sory我认为这是理想的循环,但我总是遇到麻烦)
总之我试图循环到%MYPASSWORD:~998:2%如果密码中有1000个字符或%MYPASSWORD:~9999:2%如果有一百万。显然没有人编码这个数量
答案 0 :(得分:1)
如果颠倒字符映射变量的定义,您的工作会变得更容易。您使用字母作为名称,使用代码作为值。我会使用名称中的代码,并将字母作为值。该名称应以非数字字符为前缀,以便解析器不会将%17%
之类的内容与%1
参数混淆。
例如,在您定义set AA=21
的地方,我会定义set map21=A
批处理变量的长度不是无限制的 - 最大长度为8192个字符。除以2,你有最大的循环次数。 FOR / L命令是一个快速循环的结构。
您还可以通过延迟扩展获益。
如果采用上述建议,只需以下所有内容:
setlocal enableDelayedExpansion
set "decodedPassword="
for /l %%N in (0 2 8191) do (
for /f "delims=" %%C in ("!MYPASSWORD:~%%n,2!") do (
set "decodedPassword=!map%%C!"
)
)
上述代码可以进一步优化。例如,它浪费了处理最后一个代码后继续查找更多代码的时间。但在你的情况下,浪费的时间可能是无关紧要的。