2013-07-08 61 views
-1

我想「加密」文件。這只是爲了好玩,不打算使用這種「加密」來存儲或發送任何感知數據。在文件中的每個字符之前和之後添加字符 - 使每個字符變爲可變

此代碼示例是爲了ilistrate我想做些什麼......

SET A=D 
SET B=S 
SET C=Q 
SET D=G 

ECHO %A%%B%%C%%D% 

文本ABCD爲DSQG insted的現在將顯示(如果我寫的東西meaningfull的「加密」結果不會意味着什麼)。

我的問題是:

我可以(如果有的話,怎麼樣?)之前,文件中的每個字符之後添加「%」?

我搜索瞭如何讀取使用批處理文件,發現這個(傑布的答案): Batch files: How to read a file?

是否有soulution在那裏我可以讀一個正常的文件,並將其存儲加密的加密版本藏漢?

非常感謝您的回答!

+0

您的問題太多問題。答案不值得。 – Endoro

+0

你試圖實現'ROT13',smaples在[Simple batch Cryptography:howto crypt/decrypt ROT13:](http://www.dostips.com/forum/viewtopic.php?f=3&t=1226) – jeb

+0

我是對不起,如果我的問題有點不確定,並且你認爲我事先做了一些小事情:(在我尋求幫助之前,我會盡力在我的下一個問題上做更多的努力,謝謝! – Espen

回答

2

此借用jeb的strlen,

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 

SET PT_FILE=plain.txt 
IF NOT "%~1"=="" SET "PT_FILE=%~1" 

CALL :INIT_CIPHER 

FOR /F "tokens=*" %%l IN ('findstr.exe /R /N "^" "%PT_FILE%"') DO @(
    REM @ECHO(
    REM @ECHO(%%l 
    SET "LINE=%%~l" 
    SET "LINE=!LINE:*:=!" 
    REM @ECHO(!LINE! 
    CALL :strlen LINE_LEN LINE 
    REM @ECHO(Length(!LINE_LEN!^) 
    IF !LINE_LEN! EQU 0 (
     ECHO(
    ) ELSE (
     SET OUTLINE_E= 
     FOR /L %%i IN (0,1,!LINE_LEN!) DO (
      SET "CHAR=!LINE:~%%i,1!" 
      IF "!CHAR!"==" " (
       SET "OUTLINE_E=!OUTLINE_E! " 
      ) ELSE (
       @ECHO !CHAR!|findstr.exe /R "[A-Za-z]" >NUL 
       IF ERRORLEVEL 1 (
        SET "OUTLINE_E=!OUTLINE_E!!CHAR!" 
       ) ELSE (
        SET CHAR_E= 
        CALL :ENC "!CHAR!" "CHAR_E" 
        REM @ECHO '!CHAR!' =^> E(!CHAR_E!^) 
        SET "OUTLINE_E=!OUTLINE_E!!CHAR_E!" 
       ) 
      ) 
     ) 
     ECHO(!OUTLINE_E! 
    ) 
) 



GOTO :EOF 

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 


:ENC 
CALL SET "%~2=!%~1!" 
REM ECHO E(!%~2!^) 
EXIT /B 


:: https://stackoverflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file 
:strlen <resultVar> <stringVar> 
( 
    setlocal EnableDelayedExpansion 
    set "s=!%~2!#" 
    set "len=0" 
    for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
     if "!s:~%%P,1!" NEQ "" ( 
      set /a "len+=%%P" 
      set "s=!s:~%%P!" 
     ) 
    ) 
) 
( 
    endlocal 
    set "%~1=%len%" 
    exit /b 
) 


:: Substitution Cipher 
:: ABCDEFGHIJKLMNOPQRSTUVWXYZ 
:: ZYXWVUTSRQPONMLKJIHGFEDCBA 
:: perl -e "@a=('a'..'z');for ($i=0; $i<@a; $i++) { print('SET '.uc($a[$i]).'='.uc($a[$#a-$i]).qq(\n)); }" 

:INIT_CIPHER 
SET A=Z 
SET B=Y 
SET C=X 
SET D=W 
SET E=V 
SET F=U 
SET G=T 
SET H=S 
SET I=R 
SET J=Q 
SET K=P 
SET L=O 
SET M=N 
SET N=M 
SET O=L 
SET P=K 
SET Q=J 
SET R=I 
SET S=H 
SET T=G 
SET U=F 
SET V=E 
SET W=D 
SET X=C 
SET Y=B 
SET Z=A 
EXIT /B 

注:

  • 這是非常緩慢的。
  • 它失去了源明文的情況。
  • 它不會在每個字符周圍插入%(這對於特殊字符不起作用),但是它聽起來像是你想要的。

結果:

>>> type plain.txt 
This is a simple file to be encrypted. 
This is a second line. A blank line follows. 

This is the fourth line. 
This line has a colon (:) in the middle of it. 
This line has quotes: "I said, 'Pass the bread, please,' as politely as possible." 


>>> enc plain.txt 
GSRH RH Z HRNKOV UROV GL YV VMXIBKGVW. 
GSRH RH Z HVXLMW ORMV. Z YOZMP ORMV ULOOLDH. 

GSRH RH GSV ULFIGS ORMV. 
GSRH ORMV SZH Z XLOLM (:) RM GSV NRWWOV LU RG. 
GSRH ORMV SZH JFLGVH: "R HZRW, 'KZHH GSV YIVZW, KOVZHV,' ZH KLORGVOB ZH KLHHRYOV." 


>>> enc > cipher.txt 
enc > cipher.txt 


>>> enc cipher.txt 
THIS IS A SIMPLE FILE TO BE ENCRYPTED. 
THIS IS A SECOND LINE. A BLANK LINE FOLLOWS. 

THIS IS THE FOURTH LINE. 
THIS LINE HAS A COLON (:) IN THE MIDDLE OF IT. 
THIS LINE HAS QUOTES: "I SAID, 'PASS THE BREAD, PLEASE,' AS POLITELY AS POSSIBLE." 
+0

+1;這是個好主意: )[here](http://ss64.org/viewtopic.php?pid=6478#p6478),你可以找到更多關於'strlen'的信息。 – Endoro

+0

非常感謝你這個偉大的答案:) – Espen

+0

如上所述,非常感謝你這個答案!我比我希望成批的可能性要好。我很高興你分享了這段代碼;)如果我的問題有點不確定,並且你認爲我已經事先做了一些小事情,我很抱歉:(我會盡力在我的下一個問題上做更多的努力,然後再請求幫助(這個評論意味着你們所有人) – Espen

相關問題