//
/* ---------------------------------------------------------------------------------------------- cipher.java 暗号 ver. 1.10 (JDK 1.02) ueyama@infonet.co.jp 2000.02.27 update: 2007.08.16 ---------------------------------------------------------------------------------------------- */ import java.applet.Applet; import java.awt.*; import java.lang.Math; import java.util.*; public class cipher extends Applet { int Cyp[]= new int[6]; // 暗号鍵データ Image Img; Random Rnd=new Random(); public void init() { String bg=getParameter("bgcolor"); // 背景色の読み込み int c=Integer.valueOf(bg,16).intValue(); setBackground(new Color(c)); MediaTracker mt=new MediaTracker(this); Img=getImage(getCodeBase(), getParameter("figure")); // gif ファイルの読み込み mt.addImage(Img, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; rnd_key(); } public boolean inside(int x, int a, int b) { return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false; } public void dsp_g(int x, int y, int hol, int n) // 画像の表示 { int w=0,h=0, ox=0,oy=0; switch(n) { case 0: w= 32; h= 17; ox= 0; oy= 0; break; // スイッチ case 1: w= 21; h= 21; ox= 64; oy= 0; break; // 電球 case 2: w= 37; h= 24; ox=106; oy= 0; break; // 電池 case 3: w= 14; h= 13; ox=143; oy= 0; break; // 文字 case 4: w= 5; h= 5; ox= 0; oy=17; break; // 黒丸 case 6: w= 26; h= 23; ox=227; oy= 0; break; // ボタン case 7: w= 79; h= 11; ox=143; oy=13; break; // "スクランブラー" } Graphics gx=getGraphics(); gx.clearRect(x,y,w,h); gx.clipRect(x,y,w,h); gx.drawImage(Img,x-(ox+w*hol),y-oy,this); gx.dispose(); } public void rnd_key() // ランダムな鍵を発生 { int i,j,k=0,d=0, ex[]=new int[6];; for(i=0; i<6; i++) ex[i]=Math.abs(Rnd.nextInt()); // ex[i] に乱数を入れる for(i=0; i<6; i++) { for(j=0; j<6; j++) {if(ex[j]>d) {d=ex[j]; k=j;}} ex[k]=0; Cyp[i]=k; d=0; // Cyp[] は ex[] の大きさの順位データ } } public void dsp_w() // 暗号化部配線の表示 { Graphics gr=getGraphics(); gr.setColor(new Color(224,224,240)); gr.fillRect(109,17,133,153); // 長方形を描く gr.setColor(new Color(0)); for(int y=0;y<6;y++) gr.drawLine(242,y*25+31,109,Cyp[y]*25+31); // 線を引く } public void paint(Graphics g) { int i, x, y; for(y=31;y<177;y+=25) g.drawLine(2,y, 364,y); // 水平線を引く g.drawLine(2,201,364,201); for(x=0;x<2;x++) g.drawLine(x*362+2,31,x*362+2,201); // 垂直線を引く dsp_w(); // 暗号化部の表示 dsp_g(136,0,0,7); // "スクランブラー" の表示 for(y=0;y<6;y++) { dsp_g(298,y*25+19,0,0); // スイッチの表示 dsp_g(56,y*25+21,0,1); // 電球の表示 dsp_g(32,y*25+15,y,3); // 文字の表示 dsp_g(274,y*25+15,y,3); // 文字の表示 if(y<5) dsp_g(0,y*25+54,0,4); // 黒丸の表示 if(y<5) dsp_g(362,y*25+54,0,4); // 黒丸の表示 } dsp_g(155,191,0,2); // 電池の表示 dsp_g(261,215,0,6); // ランダムボタンの表示 dsp_g(295,215,4,6); // シーザーボタンの表示 dsp_g(329,215,2,6); // クリアボタンの表示 } public boolean mouseDown(Event e, int mx, int my) { int i,y=(my-19)/25; if(inside(mx,298,330) && my<161) // スイッチをクリック { dsp_g(298,y*25+19,1,0); // スイッチの表示 dsp_g(56,Cyp[y]*25+21,1,1); // 電球の表示 } if(inside(mx,261,355) && inside(my,215,238)) // ボタン { if(inside(mx,261,302)) // ランダムボタン { dsp_g(261,215,1,6); // ランダムボタンの表示 rnd_key(); // 鍵の生成 } if(inside(mx,295,321)) // シーザーボタン { dsp_g(295,215,5,6); // シーザーボタンの表示 y=Math.abs(Rnd.nextInt())%5+1; // 鍵の生成 for(i=0;i<6;i++) Cyp[i]=(i+y)%6; } if(inside(mx,329,355)) // クリアボタン { dsp_g(329,215,3,6); // クリアボタンの表示 for(y=0;y<6;y++) Cyp[y]=y; } dsp_w(); // 暗号化部の表示 } return true; } public boolean mouseUp(Event e, int mx, int my) { int y=(my-19)/25; if(inside(mx,298,330) && my<161) { dsp_g(298,y*25+19,0,0); // スイッチの表示 dsp_g(56,Cyp[y]*25+21,0,1); // 電球の表示 } if(inside(mx,261,355) && inside(my,215,238)) { if(inside(mx,261,287)) dsp_g(261,215,0,6); // ランダムボタンの表示 if(inside(mx,295,321)) dsp_g(295,215,4,6); // シーザーボタンの表示 if(inside(mx,329,355)) dsp_g(329,215,2,6); // クリアボタンの表示 } return true; } } //戻る