凱撒加密算法(最簡單的對稱加密)

凱撒算法 概述

凱撒密碼是羅馬擴(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盟迟,一起剝皮案震驚了整個濱河市秋泳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌攒菠,老刑警劉巖迫皱,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辖众,居然都是意外死亡卓起,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門凹炸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戏阅,“玉大人,你說我怎么就攤上這事啤它∞瓤穑” “怎么了舱痘?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長离赫。 經(jīng)常有香客問我芭逝,道長,這世上最難降的妖魔是什么渊胸? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任旬盯,我火速辦了婚禮,結(jié)果婚禮上翎猛,老公的妹妹穿的比我還像新娘胖翰。我一直安慰自己,他們只是感情好切厘,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布萨咳。 她就那樣靜靜地躺著,像睡著了一般迂卢。 火紅的嫁衣襯著肌膚如雪某弦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天而克,我揣著相機(jī)與錄音,去河邊找鬼怔毛。 笑死员萍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拣度。 我是一名探鬼主播碎绎,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抗果!你這毒婦竟也來了筋帖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冤馏,失蹤者是張志新(化名)和其女友劉穎日麸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逮光,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡代箭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涕刚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗡综。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杜漠,靈堂內(nèi)的尸體忽然破棺而出极景,到底是詐尸還是另有隱情察净,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布盼樟,位于F島的核電站塞绿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏恤批。R本人自食惡果不足惜异吻,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喜庞。 院中可真熱鬧诀浪,春花似錦、人聲如沸延都。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晰房。三九已至求摇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間殊者,已是汗流浹背与境。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留猖吴,地道東北人摔刁。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像海蔽,于是被迫代替她去往敵國和親共屈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容