網路安全-2.3
阿新 • • 發佈:2021-01-08
2.3實現加解密程式。
替代密碼:
替代密碼演算法的原理是使用替代法進行加密,就是將明文中的字元用其它字元替代後形成密文。例如:明文字母a,b,c,d ,用D,E,F,G做對應替換後形成密文。
替代密碼包括多種型別,如單表替代密碼,多明碼替代密碼,多字母替代密碼,多表替代密碼等。下面我們介紹一種典型的單表替代密碼,愷撒(caesar)密碼,又叫迴圈移位密碼。它的加密方法,就是將明文中的每個字母用此字元在字母表中後面第k個字母替代。它的加密過程可以表示為下面的函式:
E(m)=(m+k) mod n
其中:m為明文字母在字母表中的位置數;n為字母表中的字母個數;k為金鑰;E(m)為密文字母在字母表中對應的位置數。
例如,對於明文字母H,其在字母表中的位置數為8,設k=4,則按照上式計算出來的密文為L:
E(8) = (m+k) mod n= (8+4) mod 26 = 12 = L
原始碼(java實現):
import java.util.Scanner; public class MyTiHuan { public final int smalla = 97; public final int bigA = 65; public final int smallz = 122; public final int bigZ = 90; public final int space = 32; public final int smallZero = 96; public final int bigZero = 64; /** * 判斷是否為小寫字母 * * @param a * @return */ public boolean isSmall(char a) { if (a >= 97 && a <= 122) { return true; } else return false; } /** * 判斷是否為大寫字母 * * @param A * @return */ public boolean isBig(char A) { if (A >= 65 && A <= 90) { return true; } else return false; } /** * 判斷是否為空格 * * @param spa * @return */ public boolean isSpace(char spa) { if (spa == space) { return true; } else return false; } /** * 檢查非法字元 * * @param a * @return */ public boolean isPass(char a) { if (a == space) { return true; } else if (a >= smalla && a <= smallz) { return true; } else if (a >= bigA && a <= bigZ) { return true; } return false; } /** * * 加密 * * @param mingwen * 明文 * @param yiwei * 右移的位數 * @return 密文 * */ public String enCode(String mingwen, int yiwei) { StringBuffer sBuff = new StringBuffer(); char[] mw = mingwen.toCharArray(); System.out.println("加密中----"); for (int i = 0; i < mw.length; i++) { char temp = 'a'; char c = mw[i]; if (isPass(c)) { if (isSmall(c)) { temp = (char) (c + yiwei); if (!isPass(temp)) { temp = (char) (temp - smallz + smallZero); } } else if (isBig(c)) { temp = (char) (c + yiwei); if (!isPass(temp)) { temp = (char) (temp - bigZ + bigZero); } } else if (isSpace(c)) { temp = c; } } else { return sBuff.append("輸入中帶有非法字元!").toString(); } sBuff.append(temp); } System.out.println("加密成功!"); return sBuff.toString(); } /** * 解密 * * @param miwen * 密文 * @param yiwei * 左移的位數 * @return 明文 */ public String deCode(String miwen, int yiwei) { StringBuffer sBuff = new StringBuffer(); char[] mw = miwen.toCharArray(); System.out.println("解密中----"); for (int i = 0; i < mw.length; i++) { char temp = 'a'; char c = mw[i]; if (isPass(c)) { if (isSmall(c)) { temp = (char) (c - yiwei); if (!isPass(temp)) { temp = (char) (smallz - smallZero + temp); } } else if (isBig(c)) { temp = (char) (c - yiwei); if (!isPass(temp)) { temp = (char) (bigZ - bigZero + temp); } } else if (isSpace(c)) { temp = c; } } else { return sBuff.append("密文中帶有非法字元!").toString(); } sBuff.append(temp); } System.out.println("解密成功!"); return sBuff.toString(); } public static void main(String[] args) { MyTiHuan mt = new MyTiHuan(); System.out.println("請輸入明文:"); Scanner scan = new Scanner(System.in); String mingw = scan.nextLine(); String miw = mt.enCode(mingw, 3); System.out.println("密文為:"); System.out.println(miw); mingw = mt.deCode(miw, 3); System.out.println("明文為:"); System.out.println(mingw); } }
執行結果: