-1

ファイルを「暗号化」したい。これは単なる遊びであり、この「暗号化」を使用して重要なデータを保存または送信するつもりはありません。

このコード例は、私がやりたいことを説明するためのものです...

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

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

テキスト ABCD が DSQG insted として表示されます (意味のあるものを書いた場合、「暗号化された」結果は何の意味もありません)。

私の質問は:

ファイル内のすべての文字の前後に「%」を追加できますか?

バッチを使用してファイルを読み取る方法を検索したところ、これが見つかりました(jebの回答): バッチファイル:ファイルを読み取る方法は?

通常のファイルを読み取って暗号化し、暗号化されたバージョンとしても保存できるソリューションはありますか?

答えてくれてありがとう!

4

1 に答える 1

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."
于 2013-07-08T14:56:51.293 に答える