Board logo

标题: [文本处理] 批处理用维热纳尔方阵给文本加密 [打印本页]

作者: pusofalse    时间: 2008-7-29 23:20     标题: 批处理用维热纳尔方阵给文本加密

如下,维热纳尔方阵,请发现每行变化的规律。
  1.        A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  2.        a b c d e f g h i j k l m n o p q r s t u v w x y z
  3. -----------------------------------------------------------
  4. 1      B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
  5. 2      C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
  6. 3      D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
  7. 4      E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
  8. 5      F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
  9. 6      G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
  10. 7      H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
  11. 8      I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
  12. 9      J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
  13. 10     K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
  14. 11     L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
  15. 12     M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
  16. 13     N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
  17. 14     O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
  18. 15     P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
  19. 16     Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
  20. 17     R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
  21. 18     S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
  22. 19     T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
  23. 20     U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
  24. 21     V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
  25. 22     W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
  26. 23     X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
  27. 24     Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
  28. 25     Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
  29. 26     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
复制代码
加密实例:
用forset来加密better to do well than to say well

密 匙 F O R E S T F O R E S T F O R E S T F O R E S T F O R  
明 文 b e t t e r t o d o w e l l t h a n t o s a y w e l l  
密 文 G S K X W K Y C U S O X Q Z K L S G Y C J E Q P J Z C  
(看第5行,F开头,明文是b,要用G来加密;第14行,O开头,明文是e,要用S来  
加密,如此类推......)

以下。
密匙:trust
明文:believe
密文:U V F A X O V

密匙: false
明文: believe
密文: G E W A I A E

密匙:batch
明文:bbsbathome
密文:C B L D H U H H O L


要求:
一,输入任意密匙和明文,用维热纳尔方阵加密,输出正确结果。
二,如能正确解答出要求一,写出相应的解密程序,只是一个逆推理。

[ 本帖最后由 pusofalse 于 2009-5-1 20:53 编辑 ]
作者: batman    时间: 2008-7-30 01:39

  1. @echo off&setlocal enabledelayedexpansion
  2. rem 生成方阵
  3. set "codes=a b c d e f g h i j k l m n o p q r s t u v w x y z"
  4. set "code=%codes: =%"
  5. set "_a=%code%"
  6. for /l %%i in (1,1,25) do (
  7.     set "code=!code:~1!!code:~,1!"
  8.     set  "_!code:~,1!=!code!"
  9. )
  10. echo.&set /p str=请输入明文:
  11. echo.&set /p pss=请输入密匙:
  12. echo.&set /p=生成的密文:<nul
  13. :again
  14. set "a1=%str:~,1%"&set "a2=%pss:~,1%"
  15. set "str=%str:~1%"&set "pss=%pss:~1%%a2%"
  16. call :lp
  17. if defined str goto again
  18. pause>nul&goto :eof
  19. :lp
  20. for %%i in (%codes%) do (
  21.       set /a n+=1
  22.       if /i "%%i" equ "%a1%" goto next
  23. )
  24. :next
  25. set /a n-=1
  26. set "var=!_%a2%!"
  27. set "var=!var:~%n%,1!"
  28. set /p=%var% <nul&set "n=0"
复制代码
[attach]1235[/attach]

[ 本帖最后由 Batcher 于 2009-5-1 20:56 编辑 ]
作者: pusofalse    时间: 2008-7-30 02:03

batman兄的代码没有密匙,密文只是通过右移一位而来的。 另外有一处错误,是导致每次都右移一位的根本所在。
for %%i in (codes) do (
      set /a n+=1
      if /i "%%i" equ "%1" goto next
)

维热纳尔方阵加密出的密文非常牢固,要解开,必须要有双方协定好的密匙(可以是个有意义的英文单词)。
可能是我说的太模糊了,已修正。

[ 本帖最后由 pusofalse 于 2008-7-30 02:38 编辑 ]
作者: pusofalse    时间: 2008-7-30 02:59

我出这道题的初衷是希望写出代码之后可以作为一个实用的加密文本的工具,然后再由自己写解密工具,这是挺好的一件事情。
维热纳尔的加密意义不仅在于加密一个单词或一句英文,而是即使加密很长的一段文章也不会被频率破解。

既然是这样,那batman兄的代码也是不通用了,因为一个文本内容的长度问题。。。而密匙的长度就只有那几位,乘以10也不能保证多于明文的长度。

当然如果作为一个工具来讲,要想加密正确,要保证明文中只有字母,空格也不得包括。
作者: batman    时间: 2008-7-30 08:07

原帖由 pusofalse 于 2008-7-30 02:59 发表
我出这道题的初衷是希望写出代码之后可以作为一个实用的加密文本的工具,然后再由自己写解密工具,这是挺好的一件事情。
维热纳尔的加密意义不仅在于加密一个单词或一句英文,而是即使加密很长的一段文章也不会被频 ...

确实是没考虑周全,要通用也容易,只要按生成方阵的办法来循环密文就可以了,已修改于上。
作者: pusofalse    时间: 2008-7-30 08:52

set "pss=%pss:~1%%a2%"
高!
作者: batman    时间: 2008-7-30 12:02

解密程序:
  1. @echo off&setlocal enabledelayedexpansion
  2. rem 生成方阵
  3. set "codes=a b c d e f g h i j k l m n o p q r s t u v w x y z"
  4. set "code=%codes: =%"
  5. for %%i in (%codes%) do set /a n+=1&set "_!n!=%%i"
  6. set "_a=%code%"
  7. for /l %%i in (1,1,25) do (
  8.     set "code=!code:~1!!code:~,1!"
  9.     set  "_!code:~,1!=!code!"
  10. )
  11. echo.&set /p str=请输入密文:
  12. echo.&set /p pss=请输入密匙:
  13. echo.&set /p=解密的明文:<nul
  14. :again
  15. set "a1=%str:~,1%"&set "a2=%pss:~,1%"
  16. set "str=%str:~1%"&set "pss=%pss:~1%%a2%"
  17. set "var=!_%a2%!"&set "n=0"&call :lp
  18. if defined str goto again
  19. pause>nul&goto :eof
  20. :lp
  21. set "a=%var:~,1%"&set /a n+=1
  22. if /i "%a%" equ "%a1%" set /p=!_%n%!<nul&goto :eof
  23. set "var=%var:~1%"
  24. goto lp
复制代码
[attach]1236[/attach]

[ 本帖最后由 Batcher 于 2009-5-1 20:57 编辑 ]
作者: 都市浪子666    时间: 2008-8-3 19:52

厉害呀,我看都看不起懂
作者: lygwdyanzi    时间: 2008-8-22 20:46

到底是什么跟什么啊,一头雾水
作者: mkl    时间: 2008-8-23 13:54

将方阵从右向左用
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 1、加密  2、解密
  3. set /p bs=
  4. set var=1
  5. for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  6.     set ve=%%i
  7.     set "%%i=!var!"
  8. set "!var!=!ve!"
  9. set /a var=!var!+1
  10. )
  11. goto %bs%
  12. :1
  13. set /p vaa=请输入明文 :
  14. goto ss
  15. :2
  16. set /p vaa=请输入密文 :
  17. :ss
  18. set /p vab=请输入密钥 :
  19. :st
  20. set va1=%vaa:~0,1% &set vaa=%vaa:~1%
  21. set va2=%vab:~0,1% &set vab=%vab:~1%%vab:~0,1%
  22. goto %bs%%bs%
  23. :11
  24. set /a vav=%va2%+%va1%
  25. if %vav% gtr 26 set /a vav=%vav%-26
  26. goto js
  27. :22
  28. set /a vav=%va1%-%va2%
  29. if %vav% lss 1 set /a vav=%vav%+26
  30. :js
  31. set /p=!%vav%!<nul
  32. if not "%vaa%"=="" goto st
  33. pause >nul
复制代码
虽然有些地方和batman相似但绝非抄袭

[ 本帖最后由 mkl 于 2008-8-23 13:57 编辑 ]
作者: pusofalse    时间: 2008-8-23 14:03     标题: 回复 10楼 的帖子

测试如下
  1. 1、加密  2、解密
  2. 1
  3. 请输入明文 :bbsbathome
  4. 请输入密钥 :batch
  5. dcmeiviipm
复制代码
而正确结果应该是
  1. 请输入密匙:batch
  2. 加密明文:bbsbathome
  3. C B L D H U H H O L
复制代码

作者: dishuo    时间: 2008-8-23 14:06

另一种思路,不生成方阵,只计算索引数,加解密支持空格.
密匙:key with space
文本:this is a simple test this is a simple test this is a simple test
模式(1.加密[默认] 2.解密):1
结果:DMGSWRLHASHJPUWJYTAAMHT YTCNCEZ ORFXLXPUHXDERHEATQSSQAVNXUJEWBY T
请按任意键继续. . .
密匙:key with space
文本:DMGSWRLHASHJPUWJYTAAMHT YTCNCEZ ORFXLXPUHXDERHEATQSSQAVNXUJEWBY T
模式(1.加密[默认] 2.解密):2
结果:THIS IS A SIMPLE TEST THIS IS A SIMPLE TEST THIS IS A SIMPLE TEST
请按任意键继续. . .
  1. cls&@echo off&SETLOCAL ENABLEDELAYEDEXPANSION
  2. set "str=. ABCDEFGHIJKLMNOPQRSTUVWXYZ" & set sMAX=27
  3. :main
  4. set/p keystring=密匙:
  5. set/p string=文本:
  6. set/p mode=模式(1.加密[默认] 2.解密):
  7. set/p=结果:<nul
  8. set mode=%mode%1
  9. set mode=%mode:~0,1%
  10. call :getkeyword
  11. set/a i=0,l=1
  12. :loop
  13. call :index !string:~%i%,1!
  14. if %mode% equ 2 (
  15. set/a idx=index+sMAX-offset%l%
  16. ) else (
  17. set/a idx=index+offset%l%
  18. )
  19. if %idx% gtr %sMAX% set/a idx%%=sMAX
  20. set/p=!str:~%idx%,1!<nul
  21. set/a i+=1,l= l %% keylength + 1
  22. if not "!string:~%i%,1!"=="" goto:loop
  23. echo.&pause&goto:main
  24. :getkeyword
  25. set i=0
  26. :lp
  27. if "!keystring:~%i%,1!"=="" goto:eof
  28. call :index !keystring:~%i%,1!
  29. set/a i+=1
  30. set/a offset!i!=%index%-1,keylength=i
  31. goto:lp
  32. :index
  33. set index=1
  34. if "%1"=="" goto:eof
  35. for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do if %1 geq %%a set/a index+=1
复制代码

[ 本帖最后由 dishuo 于 2008-8-23 15:35 编辑 ]
作者: pusofalse    时间: 2008-8-23 15:03

如果从右向左,那就不是维热纳尔了。
你的结果可以理解为在用维热纳尔加密之后再向右移一位。
与凯撒移位相结合,虽然又牢固了一些,但看题目,只使用维热纳尔方针加密而已。
作者: mkl    时间: 2008-8-23 15:19

OMG审题错误真是粗心,不过也巧,怎么就变成什么凯撒移位相了,嘿嘿!
作者: mkl    时间: 2008-8-23 15:32

不过
将 set /a vav=%va2%+%va1% 改成 set /a vav=%va2%+%va1%-1
将 set /a vav=%va1%-%va2%  改成 set /a vav=%va1%-%va2% +1
不就符合要求了吗
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 1、加密  2、解密
  3. set /p bs=
  4. set var=1
  5. for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  6. set ve=%%i &set "%%i=!var!" &set "!var!=!ve!"
  7. set /a var=!var!+1)
  8. goto %bs%
  9. :1
  10. set /p vaa=请输入明文 :
  11. goto ss
  12. :2
  13. set /p vaa=请输入密文 :
  14. :ss
  15. set /p vab=请输入密钥 :
  16. :st
  17. set va1=%vaa:~0,1% &set vaa=%vaa:~1%
  18. set va2=%vab:~0,1% &set vab=%vab:~1%%vab:~0,1%
  19. goto %bs%%bs%
  20. :11
  21. set /a vav=%va2%+%va1%-1
  22. if %vav% gtr 26 set /a vav=%vav%-26
  23. goto js
  24. :22
  25. set /a vav=%va1%-%va2%+1
  26. if %vav% lss 1 set /a vav=%vav%+26
  27. :js
  28. set /p=!%vav%!<nul
  29. if not "%vaa%"=="" goto st
  30. pause >nul
复制代码

[ 本帖最后由 mkl 于 2008-8-23 15:44 编辑 ]
作者: lhjoanna    时间: 2008-11-19 01:11

方法:把26位字母与1-26相应的数字对应起来,密文即为明文字母对应的数字与密钥字母对应的数字相加-1所对应的字母。
  1. @echo off&setlocal enabledelayedexpansion
  2. set "code=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
  3. for %%i in (%code%) do (
  4.     set /a num+=1
  5.     set t!num!=%%i
  6.     set p%%i=!num!
  7. )
  8. :begin
  9. set /p text=请输入明文:&set /p key=请输入密钥:&set /p=密文:<nul
  10. :loop
  11. set "_text=%text:~,1%"&set "_key=%key:~,1%"
  12. set "text=%text:~1%"&set "key=%key:~1%%_key%"
  13. set /a n=!p%_text%!+!p%_key%!
  14. set /a n=!n!%%26-1
  15. set /p=!t%n%! <nul
  16. if defined text goto loop
  17. echo.&echo.&goto begin
复制代码
set "key=%key:~1%%_key%"一句借鉴了batman的,感觉好多种方法这种最简洁。
  1. 哦,好像和上楼的思想一样啊,不好意思啊,发表以后才仔细看。把标头去了!
复制代码

[ 本帖最后由 lhjoanna 于 2008-11-19 01:24 编辑 ]
作者: hkmhd    时间: 2009-5-13 13:16

翻了一个不得了的帖子出来, 有很多东西可以学
作者: 随风    时间: 2009-5-13 14:45

  1. @echo off&setlocal enabledelayedexpansion
  2. set "x=ABCDEFGHIJKLMNOPQRSTUVWXYZ"&set code=!x!&set "miwen="
  3. for /l %%a in (1 1 26) do (
  4.    set /a .!x:~0,1!=%%a
  5.    set code2=!code2! !x:~0,1!
  6.    set "x=!x:~1!"
  7. )
  8. set /p my=请输入密匙
  9. set /p mw=请输入明文
  10. for %%a in (!code2!) do set mw=!mw:%%a= %%a !
  11. for %%a in (!mw!) do (
  12.    if not defined my_ set "my_=!my!"
  13.    set /a yum=.!my_:~0,1!,w=.%%a-1
  14.    for %%i in (!yum!) do set "codex=!my_:~0,1!!code:~%%i!!code:~0,%%i!"
  15.    for %%i in (!w!) do set "miwen=!miwen!!codex:~%%i,1!"
  16.    set "my_=!my_:~1!"
  17. )
  18. echo 密文:  !miwen!
  19. pause
复制代码

作者: netbenton    时间: 2009-5-13 19:47

  1. @echo off&setlocal enabledelayedexpansion
  2. set x=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  3. set miwen=&set yum=miwen
  4. for /l %%a in (0 1 25) do (
  5.    set /a n=%%a+1,#!x:~%%a,1!=n
  6.    set #!n!=!x:~%%a,1!
  7. )
  8. set /p my=请输入密匙
  9. set /p mw=请输入明文
  10. set m=0
  11. :lp
  12. set/a mm=m+99
  13. for /l %%a in (!m!,1,!mm!) do (
  14. for %%b in (!yum!) do (
  15.   set miwen=!miwen!!#%%b!
  16.   if "!mw:~%%a!" equ "" goto :ok
  17.   set /a "yum=(#!my:~0,1!+#!mw:~%%a,1!+24)%%26+1",m=%%a+1
  18.   set my=!my:~1!!my:~0,1!
  19. )
  20. )
  21. goto :lp
  22. :ok
  23. echo 密文:  !miwen!
  24. pause
复制代码

[ 本帖最后由 netbenton 于 2009-5-14 12:54 编辑 ]
作者: woshixuso1    时间: 2012-6-7 11:21

我来学习下
作者: woshixuso1    时间: 2012-6-8 13:20

为什么不能加解密带数字的字符串啊
作者: 狱渊    时间: 2013-5-1 11:17

我彻底晕了   明文密钥是做什么的?
作者: CrLf    时间: 2013-5-1 19:27

回复 22# 狱渊



解密算法是动态的,有“无限种”可能
密钥能确定其中的一种,并以此推算出明文
作者: 906053584    时间: 2015-8-29 21:18

话说怎么把加密好的密文输出到比如c:\123.txt
作者: salad    时间: 2018-2-27 19:10

回复 1# pusofalse
看看我这行吗




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2