1程序實現簡單密碼替換java
首先咱們找一篇英文文章安全
加密前app
加密後函數
咱們知道英文中出現頻率最高字母的是e字母,咱們先測試下:測試
測試代碼:ui
主函數輸出:System.out.println(find(readfile("2.txt")));加密
結果果真是eurl
咱們首先統計文章裏出現最多的字母,發現是h 而後用 h-e得3,咱們就知道了偏移量爲3,解密只須要所有-3就能夠獲得原文。spa
解密函數:3d
解密後和原文
package gh; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.HashMap; import java.util.Iterator; /** * 信息安全做業 * @author ganhang * */ public class encrypt { private static HashMap<String, Integer> h=new HashMap<String, Integer>(); public static void main(String[] args) { // System.out.println(readfile("2.txt")); // System.out.println(encode(readfile("2.txt"),3)); // System.out.println(find(readfile("2.txt"))); String encodeString =encode(readfile("2.txt"),3);//加密後的字符串 String decodeString =decode(encodeString);//解密後的字符串 System.out.println(decodeString); } /** * 解密 * @param s */ public static String decode(String s){ String maxString =find(s);//找出出現最多的字母 //System.out.println(maxString); char maxchar='e';//天然狀態下出現最多的字母 char max =maxString.charAt(0);//轉字母 int shift=max-maxchar;//得到偏移量(這裏是+3) return encode(s,0-shift);//(解密只須要偏移-3) } /** * 找出出現頻率最高的字母 * @param s * @return */ public static String find(String s){ //HashMap<String, Integer> h=new HashMap<String, Integer>(); char c[]=s.toCharArray(); int count=0; for(int i=0;i<c.length;i++){ if (c[i] <= 'Z' && c[i] >= 'A' || c[i] <= 'z' && c[i] >= 'a') { if(h.get(""+c[i])!=null)count=h.get(""+c[i]); h.put(c[i]+"",++count); } } int max=-1; String maxString=null; for (String str : h.keySet()) { if (h.get(str) > max) { max = h.get(str); maxString = str; } } return maxString; } /** * 讀文件 * @param url * @return */ public static String readfile(String url){ StringBuilder sb = new StringBuilder(); try { Reader in=new InputStreamReader(new FileInputStream(url)); char []cbuf=new char[1024]; int len; while((len=in.read(cbuf))!=-1){ sb.append(cbuf); } in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } /** * 移位加密 * @param s * @param key * @return */ public static String encode(String s, int key) { StringBuilder sb = new StringBuilder(); char[] c = s.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] <= 'Z' && c[i] >= 'A' || c[i] <= 'z' && c[i] >= 'a') { char ch = (char) (c[i] + key); sb.append(ch); }else sb.append(c[i]); } return sb.toString(); } }
因爲是做業,請勿抄襲哦(滑稽臉)。