中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-14 17:37
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » [思路挑战][讨论]批处理做 Base64 编码运算 理论原型
可打印版本  15,787 / 30
第16楼 electronixtar 发表于 2006-11-18 02:29
铂金会员 发帖 2,672 积分 7,493
不是 加密 ,是编码/解码。用纯文本来传输二进制文件的方法——Base64
第17楼 hxuan999 发表于 2006-11-23 04:51
中级用户 发帖 161 积分 337
牛人还真是多呀,努力!
第18楼 lxmxn 发表于 2006-11-23 05:20
版主 发帖 4,938 积分 11,386

  electronixtar 兄发的关于base64的第一个批处理基本看懂了,但是第二个怎么也搞不懂,严重打击了自信心,汗一个先。
第19楼 tao0610 发表于 2006-11-23 06:06
高级用户 发帖 218 积分 579
位运算反向倒回去果然复杂。
第20楼 redtek 发表于 2006-11-25 03:05
金牌会员 发帖 1,147 积分 2,902
精彩的好贴,欣赏~:)
第21楼 zqygsd 发表于 2006-12-20 23:04
新手上路 发帖 2 积分 4
泡妞密文一定要好好看看。。。
哈哈 !!
第22楼 vptdosme 发表于 2006-12-23 07:49
初级用户 发帖 32 积分 97
此时不应有 ]==[0]。
第23楼 0401 发表于 2007-01-11 01:01
中级用户 发帖 88 积分 435
发个编码解码的例子,局限性很大。因为我不知道如何将解码后的数转换为原来的字符。这个例子只是简单地通过查表来确定几个字符数字,像汉字就没办法了。还有就是我不懂怎么处理特殊字符,所以会出现很多错误的地方(当然是含有特殊字符的时候了。)
如果生成文件时用echo应该可以减少些特殊字符输入时的错误,但却还要判断0D0A(回车换行)这两个数,晕啊,随便了。
第24楼 electronixtar 发表于 2007-01-11 03:05
铂金会员 发帖 2,672 积分 7,493
0401兄十分厉害,佩服
第25楼 vkill 发表于 2007-01-11 07:09
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
0401兄 厉害
第26楼 chenall 发表于 2007-01-25 07:05
银牌会员 发帖 469 积分 1,276 来自 福建泉州
学习了.
试着将0401的代码修改了一下,利用DEBUG将结果得到的16进制写入到文件.
就可以得到原来的字符了.

将0401另外发了一个十进制转十六进制的批处理整进来了.
这个解码长度有限制的.我对DEBUG不熟.
debug这一段是抄 redtek 的 QQ密码转PwdHash的批处理
第27楼 0401 发表于 2007-01-25 09:13
中级用户 发帖 88 积分 435
呵呵,漂亮。讨论又有进展了。不过我对Debug也很陌生,看来得补补了。
第28楼 chenall 发表于 2007-01-25 23:56
银牌会员 发帖 469 积分 1,276 来自 福建泉州
再贴一个比较完美一点的.
接下去将这个再修改一下就可以做成一个
将指定文件用BASE64编码/解码的工具

代码应该还可以再精简一下.



  1. ::code by 0401
  2. ::chenall 修改于 2007.01.25
  3. @echo off
  4. setlocal
  5. setlocal enabledelayedexpansion
  6. set B64CODE=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
  7. set str=
  8. set/p "str=请输入需要编码的字符串:"
  9. if not defined str exit/b

  10. call :enc
  11. call :dec
  12. exit/b

  13. :enc
  14. rem 两个比较的文件名为:
  15. rem 将字符串放到文件中等待比较(fc)并求字符串长度
  16. set/p=%str%<nul>.str
  17. for %%f in (.str) do set strlen=%%~zf
  18. echo 原始字符串长度为: %strlen% 字节
  19. set str_len=%strlen%

  20. rem 生成fc用来与字符串比较的文件
  21. del _*.cmp 2>nul
  22. for /l %%l in (1,1,%strlen%) do (
  23. >>_a.cmp set/p=a<nul
  24. >>_b.cmp set/p=b<nul
  25. )
  26. fc/b _a.cmp .str|find ":">tmp.str
  27. fc/b _b.cmp .str|find ":">>tmp.str
  28. sort tmp.str>_a.cmp

  29. rem 将比较后得到的字符串的16进制存储到变量
  30. for /f "tokens=1,3" %%i in (_a.cmp) do (
  31. if not "!n!"=="%%i" set strhex=!strhex!%%j
  32. set n=%%i
  33. )
  34. ::for /f "tokens=3" %%i in ('fc/b .cmp .str^|find ":"') do (set strhex=!strhex!%%i)
  35. del *.cmp *.str 2>nul
  36. echo 转换后的16进制为: %strhex%

  37. :encloop
  38. if not defined strhex goto :encbreak
  39. set chr1=0x!strhex:~0,2!
  40. set chr2=0x!strhex:~2,2!
  41. set chr3=0x!strhex:~4,2!
  42. set strhex=%strhex:~6%
  43. for %%i in (chr1 chr2 chr3) do if "!%%i!"=="0x" set %%i=0
  44. set/a enc1=%chr1%">>"2
  45. set/a enc2=((%chr1%"&"3)"<<"4)"|"(%chr2%">>"4)
  46. set/a enc3=((%chr2%"&"15)"<<"2)"|"(%chr3%">>"6)
  47. set/a enc4=%chr3%"&"63
  48. ::echo 移位后得到的数据:%enc1% %enc2% %enc3% %enc4%
  49. if %chr3% equ 0 if %chr2% equ 0 (set enc4=64& set enc3=64) else (set enc4=64)
  50. ::echo 移位后的数据编码为:!B64CODE:~%enc1%,1!!B64CODE:~%enc2%,1!!B64CODE:~%enc3%,1!!B64CODE:~%enc4%,1!
  51. set encstr=!encstr!!B64CODE:~%enc1%,1!!B64CODE:~%enc2%,1!!B64CODE:~%enc3%,1!!B64CODE:~%enc4%,1!
  52. ::for %%i in (enc1 enc2 enc3 enc4) do (
  53. :: if !%%i! lss 10 (set/p=0!%%i!<nul>>tmp.bb) else (set/p=!%%i!<nul>>tmp.bb)
  54. ::)
  55. goto :encloop
  56. :encbreak
  57. echo 字符串[%str%]编码后的数据为[%encstr%]
  58. ::echo 字符串编码后的数据为 >>tmp.aa
  59. goto :eof

  60. :dec
  61. rem 并求编码字符串长度
  62. set/p=%encstr%<nul>.str
  63. for %%f in (.str) do set strlen=%%~zf
  64. echo 编码后的字符串长度为: %strlen% 字节
  65. del .str

  66. rem 从编码的字符串encstr中求出编码时偏移的数量
  67. set str=
  68. for /l %%l in (0,1,%strlen%) do (
  69. for /l %%m in (0,1,64) do (
  70. if "!encstr:~%%l,1!"=="!B64CODE:~%%m,1!" (
  71. if %%m lss 10 (
  72. set str=!str!0%%m
  73. ) else (
  74. set str=!str!%%m
  75. )
  76. )
  77. )
  78. )
  79. set a=1&set b=4&set e=0
  80. del debug.src 2>nul

  81. :decloop
  82. if not defined str goto :decbreak
  83. set /a enc1=1!str:~0,2!-100
  84. set /a enc2=1!str:~2,2!-100
  85. set /a enc3=1!str:~4,2!-100
  86. set /a enc4=1!str:~6,2!-100
  87. set str=%str:~8%
  88. for %%i in (enc1 enc2 enc3 enc3 enc4) do (
  89. if !%%i! leq 0 set %%i=0
  90. if !%%i! equ 64 set %%i=0
  91. )
  92. ::echo 4个字节的偏移分别为: %enc1% %enc2% %enc3% %enc4%
  93. set/a chr1=((%enc1%"<<"2)"|"(%enc2%">>"4))
  94. set/a chr2=(((%enc2%"&"15)"<<"4)"|"(%enc3%">>"2))
  95. set/a chr3=(((%enc3%"&"3)"<<"6)"|"%enc4%)
  96. ::echo 4个字节解码后再减去32得到的十进制为: %chr1% %chr2% %chr3%
  97. call :_d2h chr1 %chr1%
  98. call :_d2h chr2 %chr2%
  99. call :_d2h chr3 %chr3%
  100. ::echo 4个字节解码后再减去32得到的十六进制为: %chr1% %chr2% %chr3%
  101. ::echo 解码后的数据为:!ASCII:~%chr1%,1!!ASCII:~%chr2%,1!!ASCII:~%chr3%,1!
  102. set /a ee=0x100+3*e
  103. call :_d2h ee %ee%
  104. >>debug.src echo e %ee% %chr1% %chr2% %chr3%
  105. ::set/p=%chr1%%chr2%%chr3%<NUL >>BB.TXT
  106. set /a e+=1
  107. goto :decloop

  108. :decbreak
  109. pause
  110. set /a str_len+=1
  111. >>debug.src echo rcx
  112. >>debug.src echo %str_len%
  113. >>debug.src echo n tmp.tmp
  114. >>debug.src echo w
  115. >>debug.src echo q
  116. debug<debug.src
  117. del debug.src
  118. chcp 936>nul
  119. echo 编码的数据[%encstr%]
  120. echo.
  121. set/p=解码后为:<nul
  122. type tmp.tmp
  123. del tmp.tmp>nul
  124. echo.
  125. pause
  126. goto :eof

  127. :_d2h
  128. set hex=
  129. set hexstr=0 1 2 3 4 5 6 7 8 9 A B C D E F
  130. set d=0
  131. for %%i in (%hexstr%) do (set d!d!=%%i&set/a d+=1)
  132. set scanf=%2
  133. set tscanf=
  134. call :d2h
  135. if not defined hex set hex=0
  136. set %1=%hex%
  137. goto :eof

  138. :d2h
  139. if %scanf% equ 0 goto :eof
  140. set/a tscanf=%scanf%"&"15
  141. set/a scanf">>="4
  142. set hex=!d%tscanf%!!hex!
  143. goto :d2h
chenall 发表于: 2007-01-25 15:35


[ Last edited by chenall on 2007-1-26 at 04:37 AM ]
第29楼 0401 发表于 2007-01-26 03:03
中级用户 发帖 88 积分 435
to chenall兄:

确实已经可以写个BASE64编码/解码的工具了,我也有此打算了,不过不知道时间允不允许。呵呵
顺便提一下,兄为了用fc比较文件,使用fsutil file createnew命令创建一个等大的文件,但这样fsutil只能是管理员组的成员才能使用,适用性打了点折扣。何不试试5楼的方法,或者用debug的f子命令来填充一个二进制全为0的等大文件。
-------------------------------------------------
补充的:如果用f子命令来填充也得填充2个不同内容的文件,因为如果处理的是一个文件,就不保证不碰到二进制为0的字节。

[ Last edited by 0401 on 2007-1-28 at 01:09 PM ]
第30楼 chenall 发表于 2007-01-26 04:38
银牌会员 发帖 469 积分 1,276 来自 福建泉州
参考了5楼的代码已修改.
上一页  1 2 3  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023