Jul 23, 2007

JAVA code with Rail fence algorithm


private String RailFenceCipher(String text,int key,boolean encry)
{
String spText="";
char[][] irText;
int row = 1;
int column = 1;
int k=0;
int j=0;
int i=0;

//รับ plaintext จากผู้ใช้เก็บไว้เป็นตัวแปรอาร์เรย์
char[] iText = new char[text.length()];
iText = text.toCharArray();

try {
//เข้าเงื่อนไขนี้ ถ้าต้องการเข้ารหัส
if(encry == true)
{

spText += "Plaintext = "+text;
spText += "\nKey = "+key;

//ถ้าความยาวของจำนวนอักขระเป็นเลขคี่
if(text.length()%key != 0) //check row
{
//ให้บันทึกความยาวของแถว และ คอลัมภ์โดยคิดด้วยการหารกับคีย์ที่ได้มา
//และเพิ่มคอลัมภ์ให้มีมากขึ้นอีกหนึ่งคอลัมภ์

row = key-1;
column =(text.length()/key) ;
} else {
//ให้บันทึกความยาวของแถว และ คอลัมภ์ โดยคิดด้วยการหารกับคีย์ที่ได้มา
row = key-1;
column = (text.length()/key)-1;
}

//ประกาศจำนวนแถวและคอลัมภ์ที่จะจัดเรียงและเข้ารหัส
irText = new char [row+1][column+1];
spText += "\nrow="+(row+1)+" column="+(column+1);

//วนตามจำนวนอักษรที่รับเข้ามา
k=0;
i=0;
j=0;
while(k<=text.length()-1)
{
//ถ้าแถวเกินให้ตั้งแถวใหม่และเปลี่ยนคอลัมภ์
if(i>row)
{
i=0;
j++;
}
//ถ้าคอลัมภ์เกินให้ตั้งคอลัมภ์ไปที่คอลัมภ์แรก
if(j>column)
{
j=0;
}
//นำค่าที่ได้จากการดึงอักษรที่มีมาเก็บไว้ในรูปแบบใหม่ที่ผ่านการเรียงแบบ Rail fence
irText[i][j] = iText[k];

//เพิ่มแถวและเพิ่มตัวชี้ลำดับอักษรที่ป้อนเข้ามา
i++;
k++;
}
spText += "\n\n";

//วนข้อมูลในการอ้างถึงอาร์เรย์โดยสิ้นสุดเมื่อวนครบซึ่ง คิดจาก แถวคูณคอลัมภ์
i=0;
j=0;
k=0;
while(k<((row+1)*(column+1)))
{
//ถ้าแถวมากกว่าแถวทิ่กำหนดให้แถวเริ่มต้นที่ 0 ใหม่
if(i>row)
{
i=0;
}
//ถ้าคอลัมภ์มากกว่าคอลัมภ์ที่กำหนดให้คอลัมภ์เริ่มต้นที่ 0 ใหม่
//และให้มีการเพิ่มค่าแถวอีก 1 และให้มีการเว้นบรรทัดด้วย

if(j>column)
{
j=0;
i++;
spText += "\n";
}
//แสดงอักษรตามการเรียงที่ละคอลัมภ์และทำการเพิ่มค่าหลักและเพิ่มค่าตัวนับอย่างละ 1
spText += "\t"+irText[i][j];
j++;
k++;
}

//แสดง ciphertext โดยเรียงตามแถว
spText += "\n\nCiphertext = ";
for(i=0;i<=row;i++)
for(j=0;j<=column;j++)
{
spText += ""+irText[i][j];
}
}
else //จะกระทำเงื่อนไขนี้ ก็ต่อเมื่อต้องการถอดรหัส
{
spText += "Ciphertext = "+text;
spText += "\nKey = "+key;
//ถ้าความยาวของจำนวนอักขระเป็นเลขคี่
if(text.length()%key != 0) //check row
{
//ให้บันทึกความยาวของแถว และ คอลัมภ์โดยคิดด้วยการหารกับคีย์ที่ได้มา
//และเพิ่มคอลัมภ์ให้มีมากขึ้นอีกหนึ่งคอลัมภ์

row = key-1;
column =(text.length()/key) ;
} else {
//ให้บันทึกความยาวของแถว และ คอลัมภ์ โดยคิดด้วยการหารกับคีย์ที่ได้มา
row = key-1;
column = (text.length()/key)-1;
}

//ประกาศจำนวนแถวและคอลัมภ์ที่จะจัดเรียงและถอดรหัส
irText = new char [row+1][column+1];
spText += "\nrow="+(row+1)+" column="+(column+1);


//วนตามจำนวนอักษรที่รับเข้ามา
i=0;
j=0;
k=0;
while(k<=text.length()-1)
{
//ถ้าแถวมากกว่าแถวทิ่กำหนดให้แถวเริ่มต้นที่ 0 ใหม่
if(i>row)
{
i=0;
}
//ถ้าคอลัมภ์มากกว่าคอลัมภ์ที่กำหนดให้คอลัมภ์เริ่มต้นที่ 0 ใหม่
//และให้มีการเพิ่มค่าแถวอีก 1

if(j>column)
{
j=0;
i++;
}
//ให้ตัวแปรอาร์เรย์เก็บค่าที่ป้อนเข้ามาตามการเรียงแบบแถว
//และทำการเพิ่มค่าคอลัมภ์และตัวนับ

irText[i][j] = iText[k];
j++;
k++;
}
spText += "\n\n";

//วนข้อมูลในการอ้างถึงอาร์เรย์โดยสิ้นสุดเมื่อวนครบซึ่ง คิดจาก แถวคูณคอลัมภ์
i=0;
j=0;
k=0;
while(k<((row+1)*(column+1)))
{
//ถ้าแถวมากกว่าแถวทิ่กำหนดให้แถวเริ่มต้นที่ 0 ใหม่
if(i>row)
{
i=0;
}
//ถ้าคอลัมภ์มากกว่าคอลัมภ์ที่กำหนดให้คอลัมภ์เริ่มต้นที่ 0 ใหม่
//และให้มีการเพิ่มค่าแถวอีก 1 และให้มีการเว้นบรรทัดด้วย

if(j>column)
{
j=0;
i++;
spText += "\n";
}
//แสดงตัวอักษรเรียงตามแถวและเพิ่มตัวนับ
spText += "\t"+irText[i][j];
j++;
k++;
}

//วนแสดงอาร์เรย์ทั้งหมดเพื่อแสดง ciphertext
spText += "\n\nCiphertext = ";
i=0;
j=0;
k=0;
while(k<((row+1)*(column+1)))
{
//ถ้าแถวมากกว่าแถวที่กำหนดให้เริ่มต้นที่แถว 0 ใหม่และเพิ่มคอลัมภ์อีกหนึ่ง
if(i>row)
{
i=0;
j++;
}
//ถ้าคอลัมภ์มากกว่าคอลัมภ์ที่กำหนดให้คอลัมภ็เริ่มต้นใหม่ที 0
if(j>column)
{
j=0;
}
//แสดงตัวอักษรที่ได้จากการถอดรหัส
spText += ""+irText[i][j];
i++;
k++;
}
}//else

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

return spText;
}


No comments:

Post a Comment

Blog Comment

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