1. 程式人生 > 其它 >網路安全-2.3

網路安全-2.3

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);

 }

}

執行結果: