ファイル暗号化

 投稿者:しばっち  投稿日:2015年 1月29日(木)19時11分49秒
  XOR(排他的論理和)を2度繰り返すと元に戻る性質を利用して
任意のファイルを暗号化します。
ここでは暗号化した時の拡張子をbinとしています。

OPTION CHARACTER BYTE
FILE GETOPENNAME F$,"任意ファイル|*.*"
IF F$="" THEN STOP
INPUT  PROMPT "暗号・復号キー":KEY$
FILE GETSAVENAME G$,"保存ファイル|*.*"
IF G$="" THEN STOP
IF POS(G$,".")=0 THEN LET G$=G$&".bin"
OPEN #1:NAME F$
OPEN #2:NAME G$
DO
   CHARACTER INPUT #1,IF MISSING THEN EXIT DO:A$
   LET J=MOD(J,LEN(KEY$))+1
   LET X$=CHR$(BITXOR(ORD(A$),ORD(KEY$(J:J))))
   PRINT #2:X$;
LOOP
CLOSE #1
CLOSE #2
END
 

Re: ファイル暗号化

 投稿者:島村1243  投稿日:2015年 2月 5日(木)14時38分56秒
  しばっちさんへのお返事です。

> XOR(排他的論理和)を2度繰り返すと元に戻る性質を利用して
> 任意のファイルを暗号化します。
> ここでは暗号化した時の拡張子をbinとしています。

大変有益なプログラムで、Windows版のBASICでは正常に動作しました。
しかし、Linux(32bit)版-0.6.4.4のBASICでRUNし、ファイル保存を行うと次の様なエラーダイアログが表示され異常終了してしまいます。

実行時内部エラー
Access violation
BASICのバージョン番号および現在のプログラムとともにご連絡ください。

 

Re: ファイル暗号化

 投稿者:しばっち  投稿日:2015年 2月 5日(木)17時10分50秒
  > No.3585[元記事へ]

島村1243さんへのお返事です。


> 大変有益なプログラムで、Windows版のBASICでは正常に動作しました。
> しかし、Linux(32bit)版-0.6.4.4のBASICでRUNし、ファイル保存を行うと次の様なエラーダイアログが表示され異常終了してしまいます。
>
> 実行時内部エラー
> Access violation
> BASICのバージョン番号および現在のプログラムとともにご連絡ください。
>

私の実行環境は、Windowに限られていて、Linux環境でのテストは行っておりません。
また、私自身がLinuxを扱ったことがないため、島村1243さんへアドバイスすることもできません。
大変申し訳ありませんが、どなたかこの掲示板をご覧の方でアドバイスできる方がいらっしゃいましたら、宜しくお願いします。
 

Re: ファイル暗号化

 投稿者:白石和夫  投稿日:2015年 2月 5日(木)18時11分49秒
  > No.3585[元記事へ]

ご報告ありがとうございました。
バグを見つけることができました。
近日中に修正版を作成します。


> しばっちさんへのお返事です。
>
> > XOR(排他的論理和)を2度繰り返すと元に戻る性質を利用して
> > 任意のファイルを暗号化します。
> > ここでは暗号化した時の拡張子をbinとしています。
>
> 大変有益なプログラムで、Windows版のBASICでは正常に動作しました。
> しかし、Linux(32bit)版-0.6.4.4のBASICでRUNし、ファイル保存を行うと次の様なエラーダイアログが表示され異常終了してしまいます。
>
> 実行時内部エラー
> Access violation
> BASICのバージョン番号および現在のプログラムとともにご連絡ください。
>
>
 

Re: ファイル暗号化

 投稿者:島村1243  投稿日:2015年 2月 6日(金)12時25分53秒
  しばっちさんへのお返事です。

> XOR(排他的論理和)を2度繰り返すと元に戻る性質を利用して
> 任意のファイルを暗号化します。
> ここでは暗号化した時の拡張子をbinとしています。

Windows版BASICでファイル暗号化を完了させ、暗号化された.binファイルの拡張子を.txt或いは.docに変更すると、Wordでファイルの中身を表示させることが出来ました(勿論、読めない文字になっています)。
そして、その表示された中身を見ると、ファイルの先頭領域と末端領域に、暗号化に使用したパスワード文字が埋め込まれているのが分かり、パスワードを読めてしまいました。

暗号化したファイルの先頭領域と末端領域に、パスワード文字を埋め込まない処置は出来るのでしょうか?
 

Re: ファイル暗号化

 投稿者:しばっち  投稿日:2015年 2月 6日(金)23時10分52秒
  > No.3588[元記事へ]

島村1243さんへのお返事です。

> Windows版BASICでファイル暗号化を完了させ、暗号化された.binファイルの拡張子を.txt或いは.docに変更すると、Wordでファイルの中身を表示させることが出来ました(勿論、読めない文字になっています)。
> そして、その表示された中身を見ると、ファイルの先頭領域と末端領域に、暗号化に使用したパスワード文字が埋め込まれているのが分かり、パスワードを読めてしまいました。
>
> 暗号化したファイルの先頭領域と末端領域に、パスワード文字を埋め込まない処置は出来るのでしょうか?

パスワード文字を特定領域に埋め込んでいるわけではなく、ファイル全体に対して単純に
XORで処理しているだけなので、例えば文字コード0に対してXORを計算すればそのままの
文字コードが出てきてしまいます。

BITXOR(0,65)=65 BITXOR(0,96)=96 など

そこで解読をもう少し難しくしたいのなら、文字順の通りに処理していくのではなく
乱数を使用して撹乱します。
ただ暗号化と復号化で同じ乱数列が出るようにRANDOMIZE文に引数を与えます。

RANDOMIZE N ←パスワード文字と同時に引数も与える(0~4294967296)
DO
    CHARACTER INPUT #1,IF MISSING THEN EXIT DO:A$
    J=INT(RND*LEN(KEY$))+1 ←ここを変更
    LET X$=CHR$(BITXOR(ORD(A$),ORD(KEY$(J:J))))
    PRINT #2:X$;
LOOP

更にパスワード文字を複数に拡張するなどの方法も考えられると思います。

LET A$="ABCDE" !'パスワード1
LET B$="VWXYZ" !'パスワード2
LET N$="BASIC" !'暗号化する文字
!'LET N$="UTHT\"
FOR I=1 TO LEN(N$)
   LET N=ORD(N$(I:I))
   LET A=ORD(A$(I:I))
   LET B=ORD(B$(I:I))
   PRINT CHR$(BITXOR(BITXOR(N,A),B));
NEXT I
END

なお、パスワード文字を埋め込まない処置についてですが、これはXORを計算した結果、そのままの文字が見えてしまっただけで、元通りに復元させるためには必要な処理ですので、解読を分かりにくくしたいのなら、プログラム側での工夫次第と言うことでしょうか

 

Re: ファイル暗号化

 投稿者:島村1243  投稿日:2015年 2月 7日(土)08時04分5秒
  しばっちさんへのお返事です。

> そこで解読をもう少し難しくしたいのなら、文字順の通りに処理していくのではなく
> 乱数を使用して撹乱します。
> ただ暗号化と復号化で同じ乱数列が出るようにRANDOMIZE文に引数を与えます。
>
> 更にパスワード文字を複数に拡張するなどの方法も考えられると思います。
>
> なお、パスワード文字を埋め込まない処置についてですが、これはXORを計算した結果、そのままの文字が見えてしまっただけで、元通りに復元させるためには必要な処理ですので、解読を分かりにくくしたいのなら、プログラム側での工夫次第と言うことでしょうか
>

丁寧なご回答、有難うございました。
パスワードが見えてしまう理由と対策方法例が良く分かりました。
 

Re: ファイル暗号化

 投稿者:島村1243  投稿日:2015年 2月 7日(土)13時42分58秒
  白石和夫さんへのお返事です。

> ご報告ありがとうございました。
> バグを見つけることができました。
> 近日中に修正版を作成します。

白石先生、Linux版のバージョンアップ版(0.6.4.5)の作成有難うございます。
早速、Vine6.2Linux上で、Linux(i386)版BASIC-0.6.4.5を使用し、しばっちさんからご教示頂いた下記プログラムをRUNしましたが、DO-LOOPが抜け出せず、動作異常でした。

OPTION CHARACTER BYTE
FILE GETOPENNAME F$,"任意ファイル|*.*"
IF F$="" THEN STOP
INPUT  PROMPT "暗号・復号キー":KEY$
FILE GETSAVENAME G$,"保存ファイル|*.*"
IF G$="" THEN STOP
IF POS(G$,".")=0 THEN LET G$=G$&".bin"
OPEN #1:NAME F$
OPEN #2:NAME G$
RANDOMIZE 2469 !←パスワード文字と同時に引数も与える(0~4294967296)
DO
   CHARACTER INPUT #1,IF MISSING THEN EXIT DO:A$
   LET J=INT(RND*LEN(KEY$))+1
   LET X$=CHR$(BITXOR(ORD(A$),ORD(KEY$(J:J))))
   PRINT #2:X$;
LOOP
CLOSE #1
CLOSE #2
END

操作状況の推移は下記のとおりです。
1)プログラムを開始すると、直ぐに「NoName.txt」というテキストウィンドウが表示され、続いて「開くファイルを選択するダイアログ」が表示される。
2)開くファイル名を選択し、開くボタンをクリックすると、暗号・復号キー入力ダイアログが表示される。
3)パスワードを入力してOKボタンをクリックすると、保存ファイル名選択ダイアログが表示される。
4)保存ファイル名を入力して保存ボタンをクリックするとRUN状態になるが、いつになっても終了しない。(DO-LOOPが停止しない様です)
5)ブレークボタンをクリックして中止ボタンをクリックして強制終了させる。
6)保存ファイルは作成されていたが、暗号化前のファイル大きさは522バイトであるにもかかわらず、作成保存された(異常中断)ファイルは192キロバイトの大きさになっていた。

私はVine6.2Linuxでテストしダメでしたが、FedoraやUbuntsでは正常動作するでしょうか?
 

Re: ファイル暗号化

 投稿者:白石和夫  投稿日:2015年 2月 7日(土)21時28分12秒
  > No.3591[元記事へ]

Linux上だとファイルの終わりを検知してくれないようです。
調べます(時間がかかるかも)。

島村1243さんへのお返事です。

> 白石和夫さんへのお返事です。
>
> > ご報告ありがとうございました。
> > バグを見つけることができました。
> > 近日中に修正版を作成します。
>
> 白石先生、Linux版のバージョンアップ版(0.6.4.5)の作成有難うございます。
> 早速、Vine6.2Linux上で、Linux(i386)版BASIC-0.6.4.5を使用し、しばっちさんからご教示頂いた下記プログラムをRUNしましたが、DO-LOOPが抜け出せず、動作異常でした。
>
> OPTION CHARACTER BYTE
> FILE GETOPENNAME F$,"任意ファイル|*.*"
> IF F$="" THEN STOP
> INPUT  PROMPT "暗号・復号キー":KEY$
> FILE GETSAVENAME G$,"保存ファイル|*.*"
> IF G$="" THEN STOP
> IF POS(G$,".")=0 THEN LET G$=G$&".bin"
> OPEN #1:NAME F$
> OPEN #2:NAME G$
> RANDOMIZE 2469 !←パスワード文字と同時に引数も与える(0~4294967296)
> DO
>    CHARACTER INPUT #1,IF MISSING THEN EXIT DO:A$
>    LET J=INT(RND*LEN(KEY$))+1
>    LET X$=CHR$(BITXOR(ORD(A$),ORD(KEY$(J:J))))
>    PRINT #2:X$;
> LOOP
> CLOSE #1
> CLOSE #2
> END
>
> 操作状況の推移は下記のとおりです。
> 1)プログラムを開始すると、直ぐに「NoName.txt」というテキストウィンドウが表示され、続いて「開くファイルを選択するダイアログ」が表示される。
> 2)開くファイル名を選択し、開くボタンをクリックすると、暗号・復号キー入力ダイアログが表示される。
> 3)パスワードを入力してOKボタンをクリックすると、保存ファイル名選択ダイアログが表示される。
> 4)保存ファイル名を入力して保存ボタンをクリックするとRUN状態になるが、いつになっても終了しない。(DO-LOOPが停止しない様です)
> 5)ブレークボタンをクリックして中止ボタンをクリックして強制終了させる。
> 6)保存ファイルは作成されていたが、暗号化前のファイル大きさは522バイトであるにもかかわらず、作成保存された(異常中断)ファイルは192キロバイトの大きさになっていた。
>
> 私はVine6.2Linuxでテストしダメでしたが、FedoraやUbuntsでは正常動作するでしょうか?
 

Re: ファイル暗号化

 投稿者:白石和夫  投稿日:2015年 2月 8日(日)17時32分18秒
  > No.3592[元記事へ]

MACでも同様でした。
修正版を作りました。
BASICAccのLinux版,MAC版にも同様の不具合がありました。


> Linux上だとファイルの終わりを検知してくれないようです。
> 調べます(時間がかかるかも)。
>
> 島村1243さんへのお返事です。
>
> > 白石和夫さんへのお返事です。
> >
> > > ご報告ありがとうございました。
> > > バグを見つけることができました。
> > > 近日中に修正版を作成します。
> >
> > 白石先生、Linux版のバージョンアップ版(0.6.4.5)の作成有難うございます。
> > 早速、Vine6.2Linux上で、Linux(i386)版BASIC-0.6.4.5を使用し、しばっちさんからご教示頂いた下記プログラムをRUNしましたが、DO-LOOPが抜け出せず、動作異常でした。
> >
> > OPTION CHARACTER BYTE
> > FILE GETOPENNAME F$,"任意ファイル|*.*"
> > IF F$="" THEN STOP
> > INPUT  PROMPT "暗号・復号キー":KEY$
> > FILE GETSAVENAME G$,"保存ファイル|*.*"
> > IF G$="" THEN STOP
> > IF POS(G$,".")=0 THEN LET G$=G$&".bin"
> > OPEN #1:NAME F$
> > OPEN #2:NAME G$
> > RANDOMIZE 2469 !←パスワード文字と同時に引数も与える(0~4294967296)
> > DO
> >    CHARACTER INPUT #1,IF MISSING THEN EXIT DO:A$
> >    LET J=INT(RND*LEN(KEY$))+1
> >    LET X$=CHR$(BITXOR(ORD(A$),ORD(KEY$(J:J))))
> >    PRINT #2:X$;
> > LOOP
> > CLOSE #1
> > CLOSE #2
> > END
> >
> > 操作状況の推移は下記のとおりです。
> > 1)プログラムを開始すると、直ぐに「NoName.txt」というテキストウィンドウが表示され、続いて「開くファイルを選択するダイアログ」が表示される。
> > 2)開くファイル名を選択し、開くボタンをクリックすると、暗号・復号キー入力ダイアログが表示される。
> > 3)パスワードを入力してOKボタンをクリックすると、保存ファイル名選択ダイアログが表示される。
> > 4)保存ファイル名を入力して保存ボタンをクリックするとRUN状態になるが、いつになっても終了しない。(DO-LOOPが停止しない様です)
> > 5)ブレークボタンをクリックして中止ボタンをクリックして強制終了させる。
> > 6)保存ファイルは作成されていたが、暗号化前のファイル大きさは522バイトであるにもかかわらず、作成保存された(異常中断)ファイルは192キロバイトの大きさになっていた。
> >
> > 私はVine6.2Linuxでテストしダメでしたが、FedoraやUbuntsでは正常動作するでしょうか?
 

Re: ファイル暗号化

 投稿者:島村1243  投稿日:2015年 2月 9日(月)10時30分19秒
  > No.3593[元記事へ]

白石和夫さんへのお返事です。

> MACでも同様でした。
> 修正版を作りました。
> BASICAccのLinux版,MAC版にも同様の不具合がありました。
>

Linux(i386)修正版 BASIC-0.6.4.6 をダウンロードし、「Vine6.2_Linux」で使用してみました。
その結果、しばっちさんからご教示いただいた「ファイルの暗号化・復号化プログラム」は正常に動作しました。
お忙しい中にも関わらず、素早い修正版の作成を賜り有難う御座いました。
 

戻る