アイデア
暗号化:ファイルの内容を読み取り、0と1に変換し、数値をピクセルに変換してファイルに書き込みます。
復号化:ファイルを読み取り、各ピクセルの色を決定し、0と1を取得して、テキストを取得してファイルに書き込みます。
さあ始めましょう!
まず、いくつかのユーティリティ関数を作成します。
関数 readln (){
$ stdin = fopen ( 'php:// stdin' 、 'r' );
return trim ( fread ( $ stdin 、 2048 ));
}
関数 ascii_decrypt ( $ encryptedtext )
{
$ encryptedtext = str_replace ( '' 、 '' 、 $ encryptedtext );
$ encryptedtext = str_replace ( " \ n " 、 '' 、 $ encryptedtext );
$ encryptedtext = str_replace ( " \ r " 、 '' 、 $ encryptedtext );
$ blockstack = str_split ( $ encryptedtext 、 8 );
$ plaintext = "" ;
while ( list ( $ key 、 $ val ) = each ( $ blockstack ))
{
$ plaintext 。= bin2ascii( $ val );
}
$ plaintextを 返します。
}
関数 ascii_encrypt ( $ plaintext )
{
$ plaintextlength = strlen ( $ plaintext );
$ i = 0 ;
for ( $ x = 0 ; $ x < $ plaintextlength ; $ x ++ )
{
$ pt 。= ascii2bin( $ plaintext [ $ x ]);
// $ encryptedtext。= "";
}
$ ptを 返します。
}
関数 ascii2bin ( $ char )
{
$ char = decbin ( ord ( $ char ));
$ char = str_pad ( $ char 、 8 、 '0' 、STR_PAD_LEFT);
$ charを 返します。
}
関数 bin2ascii ( $ binary )
{
$ char = substr ( $ binary 、 $ x 、 8 );
$ char = chr ( bindec ( $ char ));
$ charを 返します。
}
説明します。
readln()関数は、コマンドラインから入力テキストを読み取ります。 ascii_encrypt()はテキストを0と1に変換し、 ascii_decrypt()はその逆を行います。 ascii2bin()は 、文字を8個のゼロと1のシーケンスに変換し、もちろんbin2ascii()は、逆のアクションを実行します。
今、主なことは暗号化と復号化です。 コードはすでに十分にコメントされているため、説明しません。
暗号化する
echo "入力ファイル:" ;
$ fl = readln( $ fl );
if ( file_exists ( $ fl )) $ file = stripslashes ( file_get_contents ( $ fl )); else die ( "入力ファイルが見つかりません! \ n " );
// header( 'Content-Type:image / png');
//ファイルの内容をゼロと1に変換します...
//そして、何らかの理由でそれを裏返します)
$ e = strrev (ascii_encrypt( $ file ));
////画像の高さと幅を計算する簡単なコード
$ l = strlen ( $ e );
$ h = floor ( sqrt ( $ l ));
while ( $ l % $ h !== 0 ) $ h- ;
$ w = $ l / $ h ;
//一度に1つのキャラクター全体を壊します
$ wordDot = str_split ( $ e 、 1 );
$ line = 0 ;
$列 = 0 ;
$ image = imagecreate ( $ w 、 $ h );
$ black = imagecolorallocate ( $ image 、 0、0、0 ); //黒色を定義します
$ white = imagecolorallocate ( $ image 、 255、255、255 ); //白
foreach ( $ wordDot as $ val )
{
// 0の場合、白色点を染色し、1の場合-黒
if ( $ val == 0 ) imageline ( $ image 、 $ column 、 $ line 、 $ column 、 $ line 、 $ white );
else imageline ( $ image 、 $ column 、 $ line 、 $ column 、 $ line 、 $ black );
if ( $ column == $ w -1 ){ $ line ++ ; $列 = -1 ;}
$カラム ++ ;
}
//結果を保存します
imagepng ( $ image 、 ' ./'。$ fl 。 '.png' );
imagedestroy ( $ image );
解読
echo "入力ファイル:" ;
$ fly = readln();
if ( file_exists ( $ fly )) $ image = imagecreatefrompng ( $ fly ); それ以外の場合 ( "ファイルが見つかりません! \ n " );
//画像の幅と高さを計算します
$ w = imagesx ( $ image );
$ h = imagesy ( $ image );
// Bはその中のピクセル数です(S = a * b)
$ wh = $ w * $ h ;
$ x = 0 ;
$ y = 0 ;
for ( $ t = 0 ; $ t < $ wh ; $ t ++ )
{
//ポイントの色を定義します。
$ rgb = imagecolorat ( $ image 、 $ x 、 $ y );
$ colors = imagecolorsforindex ( $ image 、 $ rgb );
$ cl = $ colors [ 'red' ] 。 $ colors [ 'green' ] 。 $カラー [ 'blue' ];
//白の場合、0を設定し、黒の場合-1
if ( $ cl == '255255255' ) $ binary 。= '0' ;
if ( $ cl == '000' ) $ binary 。= '1' ;
if ( $ x == $ w -1 ){ $ y ++ ; $ x = -1 ;}
$ x ++ ;
}
//反転してテキストに変換します
$ dt = ascii_decrypt( strrev ( $ binary ));
//ファイルに書き込みます
file_put_contents ( str_replace ( '.png' 、 '' 、 $ fly )、 $ dt );
打ち上げ
PHPインタープリターがインストールされている必要があります。
Linux(Unix):
- chmod + x classic.php
- ./classic.php encrypt#Encrypt
- ./classic.php decrypt#復号化
Windows:
- path_to_php \ php.exe classic.php encript#暗号化
- path_to_php \ php.exe classic.php decrypt#Decrypt
おわりに
すべてのコードを断片的に収集するのが面倒なら、 ここにその全体があります。
このコードは、完全な暗号化にはまだ適していません。 そこで、
以上で、Habréでお会いしましょう! 私のブログをチェックしてください!
PS。 実行可能ファイルを暗号化すると、美しい画像が得られます。
XLiveAchiever.asi
MD5Inside.exe
PPS このメッセージを解読します;)