Jul 23, 2007

JAVA code with Shift cipher algorithm

วันนี้ผมมี แนวคิดการเข้ารหัสและถอดรหัสมาฝากนะครับ
เป็นโปรแกรมที่ผมพัฒนาขึ้นมาเองนะครับ สำหรับภาษาที่ใช้ก็คือ ภาษาจาวานะครับ
เป็น Java windows application เครื่องมือที่ใช้ในการพัฒนาคือ
NetBeans IDE 5.5.1 นะครับ

งานนี้เริ่มต้นขึ้นได้เพราะเป็นการบ้านที่ต้องทำส่งในรายวิชา Computer Security
ที่ผมกำลังเรียนอยู่ อาจารย์ก็เลยให้โจทย์ และให้งานมาทำนะครับ
ผมคิดว่าจะทยอยเอา ส่วนที่เป็นหัวใจหลักของโปรแกรมมาแสดงไว้ที่นี่นะครับ
ว่าลักษณะการเขียนโปรแกรมของผมนั้น ถูกต้อง ดีแล้วหรือยัง

อย่างไรก็ตาม ขอบคุณสำหรับเพื่อนๆ ทุกคนที่ช่วยอธิบายแนวคิดให้ผม
จนสามารถนำมาเปิดเผย เพื่อให้บุคคลที่สนใจได้ศึกษาต่อไปด้วย
ซึ่งสำหรับผู้สนใจท่านใดยังไม่เข้าใจในแนวคิดหรือกระบวณการทำงานของโปรแกรม
สามารถแสดงความคิดเห็นมาได้ทันทีนะครับ
สำหรับ Code ที่เป็นแบบ Visual Basic .Net
ลองดูได้ที่เว็บพี่เดช นะครับ




private String shiftCipher(String text,int key,boolean encry) {

String spText="";

int index = 0;

int num = 0;



//กำหนดค่าให้กับตัวแปรเพื่อเป็น plaintext ทั้งหมดที่อนุญาติให้เข้ารหัสและถอดรหัส

char[] pText = new char[180] ;

try{

//A=>z 94

for (int i=32; i<=126; i++) {

pText[i-32] = (char)i;

}

//ก=>ฮ 58

for (int i=160; i<=218; i++) {

pText[i-160+94] = (char)i;

}

//0=>9 28

for (int i=223; i<=251; i++) {

pText[i-223+94+58] = (char)i;

}

}catch(Exception e){System.out.println(e);}



//รับข้อความ plaintext ที่ได้จากผู้ใช้โปรแกรมเก็บไว้ในตัวแปร

char[] iText = new char[text.length()];

try{

text = new String(text.getBytes("TIS-620"),"ISO8859_1");

} catch(java.io.UnsupportedEncodingException e) {

e.printStackTrace();

}

iText = text.toCharArray();



//กำหนดจำนวนที่มีของ plaintext

int maxChar = pText.length-1 ;



//วนเก็บค่าไปยังชุดข้อมูลใหม่โดยให้มีการ shift เกิดขึ้นตาม key ที่รับมา

//โดยที่ถ้าตัวลำดับที่อ้างถึงน้อยกว่าหรือเท่ากับจำนวนทั้งหมดของ plaintext ให้เข้าเงื่อนไขนี้


num = 0;

char[] xText = new char[pText.length];

while(num <= maxChar) {

//ให้ตัวชี้มีค่าตาม Key

index = num+key;



//ถ้าวนจนตัวชี้เกินค่ามากที่สุดของชุดข้อมูลให้ทำการ

//นำค่าที่มีลบออกด้วยค่าที่มากที่สุดของชุดข้อมูล

//ดังนั้นก็จะสามารถนำข้อมูลเข้ากล่องข้อมูลกล่องแรกได้ และถัดต่อไปเรื่อยๆ


if(index > maxChar) {

index = index - pText.length;

}

//เก็บค่าข้อมูลที่มีการ Shift แล้ว

xText[num] = pText[index];

num++;

}



//ถ้าผู้ใช้ต้องการเข้ารหัสจะเข้าเงื่อนไขนี้

if(encry == true) {



spText += "Plaintext = "+text+"\n";

spText += "key = "+key+"\n\n";



//แสดง plaintext ทั้งหมดที่หน้าจอ

num = 0;

for(int i=0; i<=maxChar; i++) {

spText += pText[i]+" ";

}

spText += "\n";



//แสดง plaintext ที่ผ่านการ shift ตาม key

for(int i=0; i<= maxChar; i++) {

spText += xText[i]+" ";

}



spText += "\n";

spText += "\nEncryption Algorithm :: C_i = E(P_i) = P_i + key";



//แสดงการเข้ารหัส

spText += "\nCiphertext = ";

for(int j=0; j<iText.length; j++)

for(int i=0; i<=maxChar; i++) {

//ถ้าวนมาเจออักษร plaintext ที่กำหนดไว้ในโปรแกรมและ

//ตรงกับอักษรที่รับเข้าไปก็ให้นำอักษรที่มีลำดับตรงกันแสดงทางหน้าจอ

//โดยที่อักษรดังกล่าวนั้นได้ผ่านการ shift ไว้แล้ว


if(pText[i] == iText[j]) {

spText += xText[i];

}

}

} else //ถ้าผู้ใช้ต้องการถอดรหัส จะเข้าเงื่อนไขนี้

{

spText += "Ciphertext = "+text+"\n";

spText += "key = "+key+"\n\n";



//แสดงอักษรที่มีการ shift แสดงที่หน้าจอ

for(int i=0; i<=maxChar; i++) {

spText += xText[i]+" ";

}

spText += "\n";



//แสดงอักษรที่ไม่มีการ shift ซึ่งเป็น plaintext ทั้งหมด

for(int i=0; i<=maxChar; i++) {

spText += pText[i]+" ";

}



//แสดงอักษร plaintext ที่มาจากการรับค่าและผ่านการถอดรหัส

spText += "\n\nPlaintext = ";

for(int j=0; j<iText.length; j++)

for(int i=0; i<=maxChar; i++) {

//ถ้าค่าที่รับเข้ามาตรงกับค่าที่ถูก shift แล้ว

//ให้แสดงตัวอักษร plaintext ที่ยังไม่ผ่านการ shift


if(iText[j] == xText[i]) {

spText += pText[i];

}

}

}



try{

spText = new String(spText.getBytes("ISO8859_1"),"TIS-620");

} catch(java.io.UnsupportedEncodingException e) {

e.printStackTrace();

}



return spText;

}



1 comment:

  1. ช่ายอย่างที่พี่พูดครับ
    ที่ว่า ไม่ชอบการชนะโดยไม่ได้พยายาม เลย

    ReplyDelete

Blog Comment

บทความที่ได้รับความนิยม