凯撒加密+Base64--打造安全又高效的加密算法

博学,切问,近思--詹子知 (https://jameszhan.github.io)

在密码学中,恺撒密码(或称恺撒加密、恺撒变换、变换加密)是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

恺撒密码的加密、解密方法还能够通过同余的数学方法进行计算。首先将字母用数字代替,A=0,B=1,...,Z=25。此时偏移量为n的加密方法即为: E(x) = (x + n) mod 26.
解密就是:
D(x) = (x - n) mod 26.
显而易见,一旦确定了某两个字母的对应关系(即n的值),这种移位密码很容易被破解。
因此,为了使密码有更高的安全性,单字母替换密码就出现了。
明码表:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密码表:T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
但是这种加密方式依然可以破解,根据字母使用频度表,分析密文中的字母频率,将其对照即可破解。

不仅如此,凯撒加密对加密数据也是有要求的,一般情况下,它只支持对基本的英文字母进行加密,如果对中文等亚太地区的文字进行加密,结果可想而知,你的隐私将毫无保留的出现在众人面前。有人说,我们可以扩展这个算法,使它支持所有的文字,这么做是可行的,如果采用同余式的方式实现,代码几乎不怎么需要改动,只要字符集本身是Unicode就可以了。但是这种加密的安全性很难满足应用的要求。如果采用单字母替换的方式,程序将需要构建两个巨大的字符数组去保存他们的映射关系,而且扩展性也不好,当然也是不可行的。这样看来,凯撒加密岂不是一无是处了,其实对于一般的应用,凯撒加密还是足以应付的,只要我们对它稍作改进。

那么有什么样改进的方法呢?试想一下,如果被加密的数据本身就杂乱无章,毫无意义,那么人们就无法利用字母频度表来对数据进行破解攻击。如果有个工具能把我们需要加密的数据转换成简单的字符并杂乱无章,这样不就可以解决我们前面提到的问题了吗。看过前文的朋友一定还记得,有个叫Base64的字符编码工具,它刚好可以胜任这个工作。

到这里,大家一定知道我们这种加密方法的思路了。分两步走:

  1. 利用Base64对需要加密的字符串进行编码,生成毫无意义的Base64 String。
  2. 利用凯撒加密方式对Base64 String进行加密。

这时我们已经得到了加密后的字符串了,这个密文已经很难被破解了,是不是很Cool啊,这种方式已经足以满足大部分应用的安全需求。有人可能会问,Base64本身不是可以达到一种加密效果吗,为什么还要对他进行再次加密呢。这个问题的原因在于,Base64算法本身是公开的,拿到Base64 String后,它只要使用Base64对其进行解码就可以看到你的信息。而在这里,凯撒加密算法是我们自己的定制的,这个映射关系一定需要保密,否则我们的算法将起不到任何的加密效果。

public class CaesarCipher
{
private static final char[] UC_ENCRYPT_CHARS = { 'M', 'D', 'X', 'U', 'P', 'I', 'B', 'E', 'J', 'C', 'T', 'N',
'K', 'O', 'G', 'W', 'R', 'S', 'F', 'Y', 'V', 'L', 'Z', 'Q', 'A', 'H' };

private static final char[] LC_ENCRYPT_CHARS = { 'm', 'd', 'x', 'u', 'p', 'i', 'b', 'e', 'j', 'c', 't', 'n',
'k', 'o', 'g', 'w', 'r', 's', 'f', 'y', 'v', 'l', 'z', 'q', 'a', 'h' };

private static char[] UC_DECRYPT_CHARS = new char[26];

private static char[] LC_DECRYPT_CHARS = new char[26];

static {
for (int i = 0; i < 26; i++) {
char b = UC_ENCRYPT_CHARS[i];
UC_DECRYPT_CHARS[b - 'A'] = (char) ('A' + i);

b = LC_ENCRYPT_CHARS[i];
LC_DECRYPT_CHARS[b - 'a'] = (char) ('a' + i);
}
}

public static char encrypt(char b) {
if (b >= 'A' && b <= 'Z') {
return UC_ENCRYPT_CHARS[b - 'A'];
} else if (b >= 'a' && b <= 'z') {
return LC_ENCRYPT_CHARS[b - 'a'];
} else {
return b;
}
}

public static char decrypt(char b) {
if (b >= 'A' && b <= 'Z') {
return UC_DECRYPT_CHARS[b - 'A'];
} else if (b >= 'a' && b <= 'z') {
return LC_DECRYPT_CHARS[b - 'a'];
} else {
return b;
}
}

public static String encrypt(String input){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < input.length(); i++){
sb.append(encrypt(input.charAt(i)));
}
return sb.toString();
}

public static String decrypt(String input){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < input.length(); i++){
sb.append(decrypt(input.charAt(i)));
}
return sb.toString();
}

}

关于Base64大家可以参照:Base64算法实现

我们看一个例子:

public static void main(String[] args) throws UnsupportedEncodingException
{
String plainText = "There is a tree!";
String base64String = Base64.encode(plainText.getBytes("utf-8"));
//base64 String = VGhlcmUgaXMgYSB0cmVlIQ==
System.out.println(CaesarCipher.encrypt(base64String));
}

这时可以的到加密后的字符串:LBenxkVbmQKbAFD0xkLnJR==

 

解密的过程与之刚好相反。

  1. 利用凯撒加密方式对加密后的数据进行解密,得到Base64 String。
  2. 利用Base64对Base64 String进行解码,得到最终的明文。

public static void main(String[] args) throws UnsupportedEncodingException
{
String cipherText = "LBenxkVbmQKbAFD0xkLnJR==";
String base64String = CaesarCipher.decrypt(cipherText);
//base64 String = VGhlcmUgaXMgYSB0cmVlIQ==
System.out.println(new String(Base64.decode(base64String), "utf-8"));
}

得到加密前的明文:There is a tree!

 

同样,我们也可以采用这种方式对多字节的字符串进行加密:

public static void main(String[] args) throws UnsupportedEncodingException
{
String plainText = "中华人民共和国万岁!";
String base64String = Base64.encode(plainText.getBytes("utf-8"));
//base64String = 5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu95LiH5bKB77yB
System.out.println(CaesarCipher.encrypt(base64String));
}

得到密文:5Njy5A2G5Nr65sXS5AZq5HTK5Hv95NjE5dTD77aD

 

解密过程如下:

public static void main(String[] args) throws UnsupportedEncodingException
{
String cipherText = "5Njy5A2G5Nr65sXS5AZq5HTK5Hv95NjE5dTD77aD";
String base64String = CaesarCipher.decrypt(cipherText);
//base64String = 5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu95LiH5bKB77yB
System.out.println(new String(Base64.decode(base64String), "utf-8"));
}

得到明文:中华人民共和国万岁!

 

注意:本文示例的算法中,没有加入对数字和及一些常用字符的加密支持,如果输入的明文是纯数字串,将不能起到加密效果。当然,你完全可以修改以上代码,加入对Base64所有64个基本字符的支持。

时间: 2024-10-31 18:33:59

凯撒加密+Base64--打造安全又高效的加密算法的相关文章

java用凯撒加密为什么对汉字无效呢,本人刚接触java,希望大家多多指教。

问题描述 package课堂;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.util.*;importjava.lang.*;importjava.math.*;publicclass用户注册界面{staticinti;staticchar[]a=newchar[10];;privatestaticScannerin;publicstaticvoidmain(String[]agrs

PHP脚本实现凯撒加(解)密

原文:PHP脚本实现凯撒加(解)密 今天在看某ctf时候遇到一题凯撒加密的题,然后看到write up里有这样一句 顿时感觉这题目有点坑啊,这要不写个脚本来跑要推到啥时候啊,于是又了本文: 1 <?php 2 $text=" the text "; //需要解密的文本 3 echo $text."<hr>"; 4 for($j=0;$j<25;$j++) 5 { 6 for ($i=0;$i<strlen($text);$i++) 7

三亚龙沐湾动向:凯撒来了

凯撒娱乐公司来到中国.不过此次进入中国业务并不是其博彩主业,而是酒店业. 9月底,凯撒娱乐公司在海南凯撒皇宫龙沐湾酒店宣布,拓展其亚太业务.此业务由凯撒环球生活业务部负责,包括豪华酒店.度假村.住宅.别墅.零售及娱乐场所. 凯撒娱乐公司国际业务发展部总裁史蒂夫·泰特表示,"凯撒的目标是未来5年在中国发展25家度假村酒店." 值得关注的是,凯撒皇宫龙沐湾酒店,由凯撒娱乐和江苏省国信资产管理集团有限公司(下称江苏国信)合作,是整个海南龙沐湾国际旅游度假区地标项目.酒店共投资30亿元,由国信

用VBS实现的凯撒密码算法_vbs

在密码学中,恺撒密码(或称恺撒加密.恺撒变换)是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文中的所有字母都在字母表上向後(或向前)按照一个固定数目进行偏移後被替换成密文.例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推.这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系. 例如,当偏移量是左移3的时候(解密时的密钥就是3): 复制代码 代码如下: 明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHI

如何解决:java-一个凯撒密码的char运算的问题

问题描述 一个凯撒密码的char运算的问题 这是从原问题中扩展出来的,因为还有更多不明白的地方,而且不容易在评论里讨论,所以重新开一个题目.问题背景: 可以运行的原代码 CODE[A] return ( (char) ('A' + ((ch -'A' + key) % 26)) );运行位置在 private char encryptChar(char ch int key){} 中. 无法输出的代码 CODE [B] return ( (char) ((ch+ key) % 26) );按@x

微医:建立中国式凯撒模式 连接医院、医生、患者

 我是微医赵宇,在微医负责战略市场工作.最近好多朋友都说有些公司做的跟微医很类似,但是从我们的角度来看,真的没有找到一家跟微医做得很类似的企业,因为很多企业做的只是微医整个体系中的一部分,从最早的信息化.院内流程自动化.到现在的AI. 上一周在广州,在由国家发改委和广东省政府共同举办,包括广东省委书记胡春华在内的嘉宾参与的中国创新大会上,微医策划了大会的健康论坛,就是健康中国创新峰会,宣布微医在经过将近七年时间的努力工作后,成立了由专科加全科加保险在内的微医新型健康保障体系,也就是我们两年前提出

凯撒旅游VPN弱口令到内网漫游(N多内部系统从SQL注入到后台登录)

一般内网外网的安全等级都很大,一旦边界有问题进了内网,安全往往不太好 1.访问到vpn链接: https://vpn.caissa.com.cn/por/login_psw.csp?rnd=0.16235555938372026#https%3A%2F%2Fvpn.caissa.com.cn%2F 弱口令test/test登录成功 2.下载easyconnect,直接入内网 3.N多内部系统 4.内部N多系统使用同一架构,且登录处存在SQL注入,而且使用同一套登录用户系统 可登录ERP: 大量订

base64加密-base64 +异或加密问题,,如何解密??在线等

问题描述 base64 +异或加密问题,,如何解密??在线等 eNqlm92P7Fpa3v+VuYi054gJ8ke755TQkdK1q2y3q7y6yx9r2Q5c2Gt5tqu8XOWucrddFleJSGAQEMQEJkS5CAQlICAkFyggBASI+BoCE8j8PXne2owyHJgkKBdb5/TpbXt5rfd9nt+zls8HfapK/YV/8Es//Yf/+od+9Gd/4hd/5fu+49//8bvf+u1f/dZXf/mf/OIP//m7H/jsL7/+l7/wo7/

众包找人模式推出电话加密,打造安全通话模式

不能直接看到对方的手机号,但又能通畅地联系对方.开源中国众包平台"找人"模式近期上线了电话号码加密的功能,尽可能地保护了用户隐私安全.登陆众包平台,在"我的工作台"里面点击"联系对方",在接听到回拨号码后等待对方接听,对方的来电号码将收到随机号码 "找人"是开源中国众包平台推出的最"轻量级别"的众包模式,甲方通过平台预约,购买开发者的服务时间,按时间支付费用给开发者,购买订单生效后,甲方向开发者发送具体的开