JAVA實驗一 編寫程序實現凱撒密碼
201352330 潘俊洋
一.實驗說明
凱撒密碼作為一種最為古老的對稱加密體制,在古羅馬的時候都已經很流行,他的基本思想是:通過把字母移動一定的位數來實現加密和解密。
例如,如果字母的位數是3,明文字母B就變成了密文的E,依次類推,X將變成A,Y變成B,Z變成C,
由此可見,位數就是凱撒密碼加密和解密的密鑰。所以在程序中密鑰key=3。
二.實驗分析
1.由於字母表中共26個字符,因此移位前先將移動的位數(key)和26取模。由於Java中字符和整型可自動轉換,因此將字符加上一個正整數即代表在字母表中右移多少位。
如果移動的位數是負值,則代表在字母表中左移多少位。盡管在移動之前已經將移動的位數和26取了模,但通過這種方式實現右移或左移仍可能發生超界。
如字母x右移3位應是字母a,但將字母x增加3后超出26個字母的范圍。
因此移位后使用兩個if語句判斷一下,如果向左超界(c<'a')則增加26;向右超界(c>'z')則減去26。
程序中用戶輸入需要用到Scanner
例: Scanner input = new Scanner(System.in)
import java.util.ScannerScanner
Scanner input = new Scanner();
Scanner對象 是可以 讀取控制台的輸入 這是一般的對象創建方法. 加了一個對象System.in參數,表示傳遞的是鍵盤的輸入
三.流程圖
(本人並不擅長做流程圖 qvq)
四.實驗代碼
import java.util.Scanner;
public class Test
{
void mj()
{
Scanner in = new Scanner(System.in);
System.out.print("請選擇操作(1.加密 2.解密):");
int n=in.nextInt();
if(n == 1)
{
System.out.print("請輸入待加密的字符串:");
String str = in.next();
String jm="";
int key = 3;//凱撒密碼加密,向后移位3位
for(int i = 0;i < str.length();i++)
{
char c = str.charAt(i);
if(c >= 'a'&&c <= 'z')
{
if(c>='x'&&c<='z')
{
c-=26;
c+=key;
}
else
{
c+=key;
}
}
else if(c >= 'A'&&c <= 'Z')
{
if(c>='X'&&c<='Z')
{
c-=26;
c+=key;
}
else
{
c+=key;
}
}
jm += c;
}
System.out.print("加密后的字符串是:"+jm);
System.out.print("\n輸入任意建繼續,0結束程序:");
n=in.nextInt();
if(n==0)
{
System.out.print(" 謝謝使用本程序,歡迎再次使用!");
}
else
{
this.mj();
}
}
else if(n == 2)
{
System.out.print("請輸入待解密的字符串:");
String str = in.next();
String jm="";
int key = -3;//凱撒密碼解密,向前移位3位
for(int i = 0;i < str.length();i++)
{
char c = str.charAt(i);
if(c >= 'a'&&c <= 'z')
{
if(c>='a'&&c<='c')
{
c+=26;
c+=key;
}
else
{
c+=key;
}
}
else if(c >= 'A'&&c <= 'Z')
{
if(c>='A'&&c<='C')
{
c+=26;
c+=key;
}
else
{
c+=key;
}
}
jm += c;
}
System.out.println("解密后的字符串:"+jm);
System.out.print("\n輸入任意建繼續,0結束程序:");
n=in.nextInt();
if(n==0)
{
System.out.print(" 謝謝使用本程序,歡迎再次使用!");
}
else
{
this.mj();
}
}
else
{
System.out.print("請輸入1或2,其他字符無效!\n輸入任意建繼續,0結束程序:");
n=in.nextInt();
if(n==0)
{
System.out.print(" 謝謝使用本程序,歡迎再次使用!");
}
else
{
this.mj();
}
}
}
public static void main(String[] args)
{
Test mj=new Test();
System.out.println("******歡迎使用凱撒密碼******");
mj.mj();
}
}
五.運行測試
六.實驗感受
在JAVA上實現了凱撒密碼程序的設計和運行,結合密碼學和JAVA的知識,同時提高和鞏固了密碼學和JAVA的學習內容。同時,也加強了對Scanner對象的理解(是可以 讀取控制台的輸入)和應用,因為剛開始接觸所以並不熟悉。本次實驗在算法上的難點就是對輸入字符串的超界問題進行判斷區分。
通過此次實驗,對JAVA的興趣越來越濃厚,希望今后能夠更加熟練掌握這項計算機語言。