Skip to content

Instantly share code, notes, and snippets.

@eidas
Created November 5, 2011 02:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eidas/1340991 to your computer and use it in GitHub Desktop.
Save eidas/1340991 to your computer and use it in GitHub Desktop.
プチコン暗号 「PETITGMA」VER1.0
'プチコンアンゴウPETITGMA Ver1.0
'プチコン ノ フォントパタ-ンデ アンゴウカ
'アンゴウ バ-ジョン A1.00
CLS
CLEAR
DIM BN$(16),CH(8),T64(256)
GOSUB @PTGINIT
BGMPLAY 27
@PSTART
COLOR 0
?"
?"プチコンアンゴウ 「PETITGMA」"
?" [E] アンゴウ ヲ ツクル"
?" [D] アンゴウ ヲ カイドクスル"
?" [X] オワル"
@LOOP
K$=INKEY$()
IF K$=="E" THEN @ENCRYPT
IF K$=="D" THEN @DECRYPT
IF K$=="X" THEN @EXIT
'IF K$=="%" THEN @PTGTEST
GOTO @LOOP
@ENCRYPT
COLOR 0
INPUT"SEED (1~255)";SD
COLOR 9
INPUT"アンゴウカスル メッセ-ジ";ES$
IF SD<1 OR 255<SD THEN ?"SEEDハ 1~255 ノ ハンイ":GOTO @ENCRYPT
L=LEN(ES$)
IF L>24 THEN ?"メッセ-ジハ 24モジマデ":GOTO @ENCRYPT
GOSUB @PTGXOR
GOSUB @PTG64EN
GOSUB @PTGBELL
COLOR 12
?"アンゴウカ サレタ メッセ-ジ:"
?ES$
GOTO @PSTART
@DECRYPT
COLOR 0
INPUT"SEED (1~255)";SD
COLOR 12
INPUT"カイドクスル メッセ-ジ";ES$
IF SD<1 OR 255<SD THEN ?"SEEDハ 1~255 ノ ハンイ":GOTO @DECRYPT
L=LEN(ES$)
IF L%4!=0 THEN ?"モジスウガ チガイマス":GOTO @DECRYPT
GOSUB @PTG64DE
GOSUB @PTGXOR
GOSUB @PTGBELL
COLOR 9
?"カイドク サレタ メッセ-ジ:"
?ES$
GOTO @PSTART
@EXIT
?"BYE!"
BGMSTOP
END
@PTGINIT
CHRINIT "BGF0"
FOR I=0 TO 15
K=I:BN$(I)=""
FOR J=0 TO 3
BN$(I)=CHR$(48+(K AND 1))+BN$(I)
K=(K/2) AND 7
NEXT
NEXT
FOR M=0 TO 63
N=65+M+(25<M)*6-(51<M)*75-(61<M)*15+(63==M)*3
T64(N)=M+1
NEXT
T64(61)=65
RETURN
@PTG64EN
K$="":J=0
FOR I=0 TO LEN(ES$)-1
M=ASC(MID$(ES$,I,1))
K$=K$+BN$(M/16)+BN$(M%16)
NEXT
ES$=""
FOR I=0 TO LEN(K$)-1 STEP 6
M=VAL("&B"+MID$(MID$(K$,I,6)+"00000",0,6))
N=65+M+(25<M)*6-(51<M)*75-(61<M)*15+(63==M)*3
ES$=ES$+CHR$(N)
NEXT
ES$=ES$+MID$("===",0,(4-LEN(ES$)%4)%4)
RETURN
@PTG64DE
ERN=0
K$=""
L=LEN(ES$)
FOR I=0 TO L-1
M=T64(ASC(MID$(ES$,I,1)))
IF M==65 THEN @PTG64DE1
IF M==0 THEN ERN=1:?"ニュウリョク マチガエ":I=L:GOTO @PTG64DE1
M=M-1
K$=K$+MID$(BN$(M/16),2,2)+BN$(M%16)
@PTG64DE1
NEXT
IF ERN THEN @PSTART
K$=MID$(K$,0,LEN(K$)-LEN(K$)%8)
ES$=""
FOR I=0 TO LEN(K$)-1 STEP 8
ES$=ES$+CHR$(VAL("&B"+MID$(K$,I,8)))
NEXT
RETURN
@PTGXOR
CHRREAD("BGF0",SD),C$
FOR I=0 TO 7
D$=""
FOR J=I*8 TO I*8+7
D$=D$+STR$(MID$(C$,J,1)!="0")
NEXT
CH(I)=VAL("&B"+D$)
NEXT
K$=""
FOR I=0 TO LEN(ES$)-1
K$=K$+CHR$(ASC(MID$(ES$,I,1)) XOR CH(I%8))
NEXT
ES$=K$
RETURN
@PTGBELL
FOR I=0 TO 7
BEEP 50,50+I*4
NEXT
RETURN
@eidas
Copy link
Author

eidas commented Nov 5, 2011

プチコンを使った暗号プログラムです。

【入力についてのアドバイス】
(1)72行と87行は全く同一の内容の行ですので、72行目を入れたら、コピーして87行目に貼り付けるとよいでしょう。
(2)ASC関数がある行で、入力まちがいはないのに、Syntax Errorが出る場合、ASC関数の( )の中に関係した部分がおかしいです。
例えば、124行目でSyntax Errorになるが入力まちがいがない場合、MID$(ES$,I,1)に関係した部分が怪しいです。
123行目のFOR文で最後の -1 が抜けていると、ループの最後でASC関数の中が 長さ0の文字列 "" になり、Syntax Errorになります。
(3)エラーは出ないがどうも結果がおかしい、という場合、別のGist ( ) にあるテストコードを追加入力して原因を調べるとよいです。
テストコードの中でも、最初は、 4行(テストコードへの飛び先ラベル)と 72 ~104 行を入力します。
テストコードを追加入力するほか、本体22行目の先頭の「’」を消してください。
実行後の選択肢で「%」を入力するとテストコードが実行されます。
PTGXOR→PTG64EN→PTG64DE→PTGXORの順に実行され、それぞれの結果が表示されるので、その結果を見てまちがいの箇所にアタリをつけましょう。
必要であれば、その前のテストコードを入力して動かすと、まちがい箇所を特定しやすくなります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment