【算法】Java凯撒密码实现方法
文章目录【算法】Java凯撒密码实现方法1、凯撒密码介绍2、凯撒密码的实现2.1、基于ASCII码实现凯撒密码2.2、基于字母表实现的凯撒密码【算法】Java凯撒密码实现方法1、凯撒密码介绍凯撒密码作为一种最简单的消息加密方式在古罗马的时候都已经很流行他的基本思想是通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后或向前按照一个固定数目进行偏移后被替换成密文。例如当偏移量是3的时候所有的字母A将被替换成DB变成E由此可见位数就是凯撒密码加密和解密的秘钥。2、凯撒密码的实现在此之前我们必须得了解一个基本概念“移位和循环移位”移位和循环移位 移位就是将一段数码按照规定的位数整体性地左移或右移。循环右移就是当右移时把数码的最后的位移到数码的最前头循环左移相反。 例如对十进制数码0123456789右移一位十进制位的结果为9012345678而循环左移一位得到的结果则为1234567890。凯撒密码就是使用的循环移位2.1、基于ASCII码实现凯撒密码加密方法如下Testpublicvoidtest(){StringabcasciiCaesarEncrypt(ABC,125);System.out.println(abc);}publicStringasciiCaesarEncrypt(Stringstr,intoffset){char[]charsstr.toCharArray();for(inti0;ichars.length;i){intoriginalchars[i];inti1originaloffset;if(i1127){i1i1%128;chars[i](char)i1;}elseif(i10){intabsMath.abs(i1)%128;if(abs0){chars[i](char)0;}else{chars[i](char)(128-abs);}}else{chars[i](char)i1;}}returnString.valueOf(chars);}上面的运行结果 ?解密方法如下publicStringasciiCaesarDecrypt(Stringstr,intoffset){char[]charsstr.toCharArray();//循环位移算法for(inti0;ichars.length;i){inti1chars[i]-offset;if(i1127){i1i1%128;chars[i](char)i1;}elseif(i10){intabsMath.abs(i1)%128;if(abs0){chars[i](char)0;}else{chars[i](char)(128-abs);}}else{chars[i](char)i1;}}returnString.valueOf(chars);}2.2、基于字母表实现的凯撒密码加密方法如下Testpublicvoidtest(){StringabclowerCaseCaesarEncrypt(zabc,25);System.out.println(abc);}publicStringlowerCaseCaesarEncrypt(Stringstr,intoffset){char[]charsstr.toCharArray();char[]lowerCasenewchar[26];for(inti0;i26;i){lowerCase[i](char)(ai);}StringlowerCaseStrString.valueOf(lowerCase);for(inti0;ichars.length;i){intidxlowerCaseStr.indexOf(chars[i]);// 非小写字母直接跳过防止index-1乱码if(idx-1)continue;inti1idxoffset;if(i125){i1i1%26;chars[i]lowerCase[i1];}elseif(i10){intabsMath.abs(i1)%26;// 修复越界abs为0时下标直接取0if(abs0){chars[i]lowerCase[0];}else{chars[i]lowerCase[26-abs];}}else{// 统一查表不再直接ASCII加减chars[i]lowerCase[i1];}}returnString.valueOf(chars);}上面的运行结果 yzab解密方法如下publicStringlowerCaseCaesarDecrypt(Stringstr,intoffset){char[]charsstr.toCharArray();char[]lowerCasenewchar[26];for(inti0;i26;i){lowerCase[i](char)(ai);}StringlowerCaseStrString.valueOf(lowerCase);for(inti0;ichars.length;i){intidxlowerCaseStr.indexOf(chars[i]);// 新增非小写字母直接跳过if(idx-1)continue;inti1idx-offset;if(i125){i1i1%26;chars[i]lowerCase[i1];}elseif(i10){intabsMath.abs(i1)%26;chars[i]lowerCase[(26-abs)%26];}else{// 修改统一查表不再直接ASCII相减chars[i]lowerCase[i1];}}returnString.valueOf(chars);}本文到此完毕