凱撒算法 概述
凱撒密碼是羅馬擴(kuò)張時期朱利斯? 凱撒(Julius Caesar)創(chuàng)造的藤肢,用于加密通過信使傳遞的作戰(zhàn)命令太闺。它將字母表中的字母移動一定位置而實現(xiàn)加密。例如如果向右移動 2 位嘁圈,則 字母 A 將變?yōu)?C省骂,字母 B 將變?yōu)?D,…最住,字母 X 變成 Z钞澳,字母 Y 則變?yōu)?A,字母 Z 變?yōu)?B温学。
凱撒加密略贮,右移2位對應(yīng)結(jié)果圖
因此,假如有個明文字符串“Hello”用這種方法加密的話,將變?yōu)槊芪模?“Jgnnq” 逃延。而如果要解密览妖,則只要將字母向相反方向移動同樣位數(shù)即可。如密文“Jgnnq”每個字母左移兩位 變?yōu)椤癏ello” 揽祥。這里讽膏,移動的位數(shù)“2”是加密和解密所用的密鑰。
示例
/**
* 凱撒加密
* @author jijs
*/
public class CaesarDemo {
public static String caesar(String s, int offset) throws Exception {
String cipher = "";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z') // 是小寫字母
{
c += offset % 26; // 移動 key%26 位
if (c < 'a')
c += 26; // 向左超界
if (c > 'z')
c -= 26; // 向右超界
} else if (c >= 'A' && c <= 'Z') // 是大寫字母
{
c += offset % 26;
if (c < 'A')
c += 26;
if (c > 'Z')
c -= 26;
}
cipher += c;
}
return cipher;
}
public static void main(String args[]) throws Exception {
String cipher = caesar("Hello", 2);
String text = caesar(cipher, -2);
System.out.println("原文:Hello\r\n加密后:" + cipher + "\r\n解密后:" + text);
}
}
該程序既可用于加密又可用于解密拄丰。只要傳入明文和偏移量即可加密府树,解密需要傳入密文和負(fù)的偏移量就可以解密。
輸出的結(jié)果:
原文:Hello
加密后:Jgnnq
解密后:Hello
安全性
凱撒密碼由于加解密比較簡單料按,密鑰總共只有 26 個奄侠,攻擊者得到密文后即使不知道密鑰,也可一個一個地試過去载矿,最多試 26 次就可以得到明文垄潮。
凱撒變種
/**
* 凱撒加密
* @author jijs
*/
public class CaesarDemo2 {
public static String caesar(String s, int offset) throws Exception {
String cipher = "";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 是小寫字母
if (c >= 'a' && c <= 'z') {
if (offset > 0) {
// 這里不光根據(jù) offset 進(jìn)行加密,還添加了該元素的下標(biāo)進(jìn)行加密闷盔。
c += (offset + i) % 26;
} else {
// 這里不光根據(jù) offset 進(jìn)行加密弯洗,還添加了該元素的下標(biāo)進(jìn)行加密。
c += (offset - i) % 26;
}
if (c < 'a')
c += 26; // 向左超界
if (c > 'z')
c -= 26; // 向右超界
}
// 是大寫字母
else if (c >= 'A' && c <= 'Z') {
if (offset > 0) {
// 這里不光根據(jù) offset 進(jìn)行加密逢勾,還添加了該元素的下標(biāo)進(jìn)行加密牡整。
c += (offset + i) % 26;
} else {
// 這里不光根據(jù) offset 進(jìn)行加密,還添加了該元素的下標(biāo)進(jìn)行加密溺拱。
c += (offset - i) % 26;
}
if (c < 'A')
c += 26;
if (c > 'Z')
c -= 26;
}
cipher += c;
}
return cipher;
}
public static void main(String args[]) throws Exception {
String cipher = caesar("Hello", 2);
String text = caesar(cipher, -2);
System.out.println("原文:Hello\r\n加密后:" + cipher + "\r\n解密后:" + text);
}
}
這里不光根據(jù) offset 偏移進(jìn)行加密逃贝,還加上了字符所在的下標(biāo)進(jìn)行混合加密。
輸出的結(jié)果:
原文:Hello
加密后:Jhpqu
解密后:Hello