Java之英格瑪簡單實現以及加密驗證碼的應用,java英格瑪
最近看了一部電影《模仿遊戲》,《模仿遊戲》中艾倫·圖靈破譯英格瑪讓我對英格瑪產生了好奇,於是就開始翻閱資料對其進行研究,但是畢竟智慧有限,所以我這裡用Java實現一個簡單的英格瑪。
如若有人對英格瑪感興趣,可以閱讀這篇部落格https://www.0xaa55.com/forum.php?mod=viewthread&tid=1208&extra=page%3D1&page=1。
英格瑪是將每一個字元變成ascii碼進行加密變成另一個字元:
我這裡實現的簡單英格瑪只是娛樂娛樂,主要實現原理是通過控制台輸入Scanner cin=new Scanner(System.in); 然後進行讀取msg=cin.nextLine(); 然後將每一個字元迴圈遍曆對其進行加26,為了增加複雜性,對其進行判斷if((msg.charAt(i)-count)<'a') encodemsg+=(char)(msg.charAt(i)+26-count); else
encodemsg+=(char)(msg.charAt(i)-count); 這樣就實現了一個簡單的英格瑪,其實也就是變動字元的ascii碼。
//具體方法實現
static void encode()
{
String msg="";
String encodemsg="";
int count=0;
System.out.printf("%s","Input the message:");
Scanner cin=new Scanner(System.in); //控制台輸入
msg=cin.nextLine(); //擷取控制台的輸入的資訊
for(int i=0;i<msg.length();i++) //迴圈遍曆資訊的每一個字元
{
System.out.println("msg = "+msg.charAt(i));
if((Character.isSpace(msg.charAt(i)))) //判斷字元是否為空白字元
{
encodemsg+=" ";
}
else if((msg.charAt(i)-count)<'a') //判斷如果msg.charAt(i)-count的ascii碼小於a則+26
encodemsg+=(char)(msg.charAt(i)+26-count);
else
encodemsg+=(char)(msg.charAt(i)-count);
count++;
}
System.out.println(encodemsg);
}
附:我有一個小想法就是結合這個簡單的英格瑪對驗證碼進行加密,這樣的話有利於驗證碼的安全保護。
我這裡實現的驗證碼是通過隨機產生幾位元字或者字母通過random()類,同樣結合ascii碼,話不多說直接上代碼:
//產生隨機數字和字母,
public static String getStringRandom(int length) {
String val = "";
Random random = new Random();
//參數length,表示產生幾位隨機數
for(int i = 0; i < length; i++) {
//判斷輸出的是數字還是字母
String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
//輸出字母還是數字
if( "char".equalsIgnoreCase(charOrNum) ) {
//輸出是大寫字母還是小寫字母
System.out.println(" n 2 = "+random.nextInt(2));
int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
val += (char)(random.nextInt(26) + temp);
} else if( "num".equalsIgnoreCase(charOrNum) ) {
val += String.valueOf(random.nextInt(10));
}
}
return val;
}
然後通過英格瑪方法進行加密那麼只要將之前的英格瑪方法中的控制台輸入換成getStringRandom(4)產生的隨機數。
註:剛開始寫部落格,對這個排版不是太瞭解,感覺好醜,求大神指導。