public class EncryptionUtil { //偏移量-100内的质数 private static final int[] offset = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97}; /** * 加密 * @param text * @return */ public static String encode(String text){ int distance_period = offset.length; char[]cs = text.toCharArray(); char[]cs2 = new char[cs.length]; for (int i = 0; i < cs.length; i++) { if(i+1>distance_period){ int remainder = (i+1)%distance_period; cs2[i]=(char)(cs[i]+offset[remainder]); }else{ cs2[i]=(char)(cs[i]+offset[i]); } } return new String(cs2); } /** * 解密 * @param text * @return */ public static String decode(String text){ int distance_period = offset.length; char[]cs = text.toCharArray(); char[]cs2 = new char[cs.length]; for (int i = 0; i < cs.length; i++) { if(i+1>distance_period){ int remainder = (i+1)%distance_period; cs2[i]=(char)(cs[i]-offset[remainder]); }else{ cs2[i]=(char)(cs[i]-offset[i]); } } return new String(cs2); } /** * 合数composite提取约数approximate * 约数公因子:肯定是质数,只需考虑除了2以外的奇数 * @param x * @return */ public static Integer[] getFactors(int x){ double max = (x+1.0)/2; List<Integer> list = new ArrayList<Integer>(); int i = 2; while (i<max) { int remainder = x%i; if(remainder==0){ int quotients = x/i; x=quotients; list.add(i); continue; } if(i>2){ i+=2; }else{ i++; } } Integer[]t = new Integer[list.size()]; t = list.toArray(t); return t; } /** * 是否质数 * @param x * @return */ public static boolean prime(int x){ if(x==2){ return true; } if(x%2==0){ return false; } double max = x/2.0; for (int i = 3; i < max; i+=2) { int remainder = x%i; if(remainder==0){ return false; } } return true; } public static void main(String[] args) { String text = "根据会议日程安排,成员国元首先举行小范围。"; System.out.println(encode(text)); System.out.println(decode(encode(text))); //质数除了2都是奇数, // int n = 2; // System.out.println(prime(n)); // Integer s[] = getFactors(n); // for (int i : s) { // System.out.println(i); // } //一亿里面每一百个数中质数的数量 // 1671800-1671900=0 // for (int j = 1; j < 1000000; j++) { // List<Integer> list = new ArrayList<Integer>(); // int start = (j-1)*100; // int end = j*100; // for (int i = start; i < end; i++) { // if (prime(i)) { // list.add(i); // } // } // if(list.size()<3){ // System.out.println(start+"-"+end+"="+list.size()); // } // } } }
质数加密
猜你喜欢
转载自itace.iteye.com/blog/1971946
今日推荐
周排行