對於Caesar加密算法,存在幾點問題。首先是這個作為密鑰的值是個固定的3,而且字母表又是按順序排列的,所以只要對方知道你是用Caesar加密的,就很容易的脫密成原文,雖然有些麻煩,但是這就和用原文是差不多的,即使對加密要求很低也不能低成這樣不是?然後是這個替換表,因為是基於字母表的,所以對於英文來說只能加密英文字母,這樣就不能被支持了。最後,因為替換是固定的,所以,對於同一個字母,http://www.linuxidc.com加密後的字母也是固定的。比如"AAA"這個文本加密後,就是"DDD",看起來還不夠迷惑人。
基於以上的原因,我這裡實現的Caesar做了一些修改,但是總的思路還是Caesar。
在上面的Caesar實現中,我用一個整數替代了原來作為密鑰的固定值3。其次,可以通過傳入不同的字符集讓這個加密算法的適用性更廣泛。最後,算法類在初始化的時候,會對替換表做一次擾亂操作,這樣的話,即使是相同的替換表,因為初始化傳入的seed不同,加密出來的內容也會不同。至於程序的細節,我想源碼會更直觀的告訴你的。
- public class Caesar {
- private String table;
- private int seedA = 1103515245;
- private int seedB = 12345;
- public Caesar(String table, int seed) {
- this.table = chaos(table, seed, table.length());
- }
- public Caesar(String table) {
- this(table, 11);
- }
- public Caesar() {
- this(11);
- }
- public Caesar(int seed) {
- this("ABCDEFGHIJKLMNOPQRSTUVWXYZ", seed);
- }
- public char dict(int i, boolean reverse) {
- int s = table.length(), index = reverse ? s - i : i;
- return table.charAt(index);
- }
- public int dict(char c, boolean reverse) {
- int s = table.length(), index = table.indexOf(c);
- return reverse ? s - index : index;
- }
- public int seed(int seed) {
- long temp = seed;
- return (int)((temp * seedA + seedB) & 0x7fffffffL);
- }
- public String chaos(String data, int seed, int cnt) {
- StringBuffer buf = new StringBuffer(data);
- char tmp; int a, b, r = data.length();
- for (int i = 0; i < cnt; i += 1) {
- seed = seed(seed); a = seed % r;
- seed = seed(seed); b = seed % r;
- tmp = buf.charAt(a);
- buf.setCharAt(a, buf.charAt(b));
- buf.setCharAt(b, tmp);
- }
- return buf.toString();
- }
- public String crypto(boolean reverse,
- int key, String text) {
- String ret = null;
- StringBuilder buf = new StringBuilder();
- int m, s = table.length(), e = text.length();
- for(int i = 0; i < e; i += 1) {
- m = dict(text.charAt(i), reverse);
- if (m < 0) break;
- m = m + key + i;
- buf.append(dict(m % s, reverse));
- }
- if (buf.length() == e)
- ret = buf.toString();
- return ret;
- }
- public String encode(int key, String text) {
- return crypto(false, key, text);
- }
- public String decode(int key, String text) {
- return crypto(true , key, text);
- }
- public static void main(String[] args) {
- Caesar caesar = new Caesar();
- String data = caesar.encode(32, "APPLE");
- caesar.decode(32, data);
- }
- }