密碼學第一次作業(yè)DES算法

內(nèi)容###

編程統(tǒng)計DES算法中明文(或密鑰)改變1位旬盯,2位誊爹。。瓢捉。64位的情況下频丘,密文位數(shù)的變化量情況具體要求: 編程實現(xiàn)
1。在密鑰不變情況下泡态,明文改變1位搂漠,2位。某弦。桐汤。64位,觀察并統(tǒng)計密文位數(shù)變化規(guī)律靶壮。
2怔毛。在明文不變情況下,密鑰改變1位腾降,2位拣度。。螃壤。64(56)位抗果,觀察并統(tǒng)計密文位數(shù)變化規(guī)律。
為了使統(tǒng)計局有客觀性奸晴,上述每種情況可以重復多次冤馏,然后求平均值。
編程語言不限寄啼,建議采用java 或 C#等高級語言逮光,因為這些語言中有內(nèi)置的DES算法包代箭,如果采用C/C++則需要自己到網(wǎng)上搜索DES算法庫,
提交方式:將程序源代碼和運行結(jié)果截圖以電子文檔的形式提交涕刚。

電子版作業(yè)上交要求###

注意:每個人的郵件標題和附件文件名要帶上自己的編號203 姓名馮光平嗡综,學號3114006176,比如 001_31012xxx_張三_信息安全第X次作業(yè) 副女。這樣便于管理蛤高。注意:直接發(fā)送到我的QQ郵箱蚣旱,不要通過通過QQ傳輸碑幅。
特別要注意,附件的文件名也要采用上述命名格式塞绿,不要使用“文檔1.docx”等默認文件名沟涨,如果包含多個文件,請先用壓縮...

源代碼###

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class des {
     private static byte[][] b;

    /**
     * 加密方法
     * @param datasource 明文
     * @param password 秘鑰
     * @return 密文
     */
    public static byte[] desCrypto(byte[] datasource, String password) {
        try{
            SecureRandom random = new SecureRandom();
            DESKeySpec desKey = new DESKeySpec(password.getBytes());
            //創(chuàng)建一個密匙工廠异吻,然后用它把DESKeySpec轉(zhuǎn)換成
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey securekey = keyFactory.generateSecret(desKey);
            //Cipher對象實際完成加密操作
            Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
            //用密匙初始化Cipher對象
            cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
            //現(xiàn)在裹赴,獲取數(shù)據(jù)并加密
            //正式執(zhí)行加密操作
            return cipher.doFinal(datasource);
        }catch(Throwable e){
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 初始化輔助數(shù)組 b是需要初始化的數(shù)組
     */
    public static void initBytes() {
        //64代表的是含有1-64個1的串,8代表8個字節(jié)(64位)
        b = new byte[64][8];
        b[0][0] = -128; // 10000000
        for(int i = 1; i < 64; i++) {
            for(int j = 0; j < 8; j++) {
                b[i][j] = b[i-1][j];
            }
            int k = i/8;
            int z = (i+1)%8; z = z == 0 ? 8 : z;
            b[i][k] ^= (byte) Math.pow(2, (8-z));
        }
    }
    
    /**
     * 循環(huán)右移一個byte數(shù)組
     * @param num 右移位數(shù)
     * @param b 數(shù)組
     * @return 右移后數(shù)組
     */
    public static byte[] bytesMoveToRight(int num , byte[] b) {
        byte[] bytes = b;
        for(int i = 0; i < num; i++) { //每次循環(huán)右移一位诀浪,實現(xiàn)比較簡單棋返,但是效率比較慢
            byte low = (byte)(bytes[bytes.length-1] & 1); //記錄最后一個字節(jié)的最低1位
            for(int j = 0; j < bytes.length; j++) { //從第一個字節(jié)開始
                byte loww = (byte)(bytes[j] & 1); //記錄最低一位
                bytes[j] = (byte)(bytes[j]>>1&127); //右移一位,高位補0雷猪,可以用>>>代替睛竣,但是不知道為啥我的開發(fā)環(huán)境>>>失效了
                bytes[j] = (byte) (bytes[j] ^ (low<<7) ); //把高位補上之前記錄的最低1位
                low = loww; //替換成新的最低1位
            }
        }
        return bytes;
    }
    
    /**
     * 求兩個字節(jié)數(shù)組的二進制中不同的位數(shù)
     * @param m 
     * @param n
     * @return 返回不同的位數(shù)的個數(shù)
     */
    public static int countBitDiff(byte[] m, byte[] n) {
        if(m.length != n.length) return -1;

        byte[] ans = new byte[m.length];
        for(int i = 0; i < m.length; i++) { //異或操作
            ans[i] =(byte) (m[i] ^ n[i]);
        }
        int count = 0;
        for(int i = 0; i < ans.length; i++) { //統(tǒng)計1的個數(shù)
            while(ans[i] != 0){
                ans[i] &= (byte)(ans[i] -1);
                count++;
            }
        }
        return count;
    }
    
    public static void main(String[] args) {
        //初始化輔助數(shù)組
        initBytes();
        //初始明文
        String word = "AAAAAAAA";
        printTo8Binary( word.getBytes());
        //初始秘鑰
        String password = "12345678";
        printTo8Binary( password.getBytes());
        //加密
        byte[] result = desCrypto(word.getBytes(),password);
        printTo8Binary(result);

        /**改變明文位數(shù)**/
        for(int i = 1; i <= 64; i++) { //改變1-64位
            System.out.print("明文改變"+i+"位: ");
            byte[] origin = word.getBytes(); //原始明文
            int digits = 0; //改變位數(shù)
            for(int j = 0; j < 10; j++) { //10種情況取平均
                byte[] now = new byte[8]; //現(xiàn)在明文
                for(int k = 0; k < origin.length; k++) { //用輔助數(shù)組進行變位(i-1位)
                    now[k] = (byte)(origin[k] ^ b[i-1][k]);
                }
                bytesMoveToRight(1 , b[i-1]); //右移一下輔助數(shù)組,供下種情況使用
//                printTo8Binary("改變"+(j+1)+"后明文: " , now);
                //加密
                byte[] r = desCrypto(now,password);
//                printTo8Binary("改變"+(j+1)+"后密文: " , r);
                digits += countBitDiff(r , result);//和原始密文比較求摇,記錄改變位數(shù)
//                System.out.println("密文改變了"+countBitDiff(r , result)+"位");
            }
            System.out.println("密文平均改變了"+(double)digits/10.0+"位");
        }

        /**改變秘鑰位數(shù)**/
        for(int i = 1; i <= 64; i++) { //改變1-64位
            System.out.print("秘鑰改變"+i+"位: ");
            byte[] origin = password.getBytes();//原始秘鑰
            int digits = 0; //改變位數(shù)
            for(int j = 0; j < 10; j++) { //10種情況取平均
                byte[] now = new byte[8]; //現(xiàn)在秘鑰
                for(int k = 0; k < origin.length; k++) { //用輔助數(shù)組進行變位(i-1位)
                    now[k] = (byte)(origin[k] ^ b[i-1][k]);
                }
                bytesMoveToRight(1 , b[i-1]); //右移一下輔助數(shù)組射沟,供下種情況使用
//                printTo8Binary("改變后秘鑰: " , now);
                //加密
                byte[] r = desCrypto(now,password);
//                printTo8Binary("改變后密文: " , r);
                digits += countBitDiff(r , result);//和原始密文比較,記錄改變位數(shù)
            }
            System.out.println("密文平均改變了"+(double)digits/10.0+"位");
        }
    }
    
    /**
     * 把byte數(shù)組類型轉(zhuǎn)換為8位二進制類型字符串輸出
     * @param tByte 字節(jié)數(shù)組
     * @return
     */
    public static void printTo8Binary( byte[] tByte) {
        for(int i=0; i<tByte.length; i++) {
            String tString = Integer.toBinaryString((tByte[i] & 0xFF) + 0x100).substring(1);
            System.out.print(tString + " ");
        }
        System.out.println();
    }
    
    /**
     * 字節(jié)循環(huán)右移
     * @param num 右移位數(shù)
     * @param b 原字節(jié)
     * @return
     */
    public static byte cycleToRight(int num , byte b) {
        byte low = (byte) (b & (byte)(Math.pow(2 , num) - 1)); //記錄低num位
        byte temp = (byte)~( (byte)(Math.pow(2 , num) - 1) << (8 - num) );
        byte result = (byte) (b >> num & temp); //右移num位与境,高num位補0验夯,同>>>
        result ^= low << (8 - num);
        return result;
    }
}

結(jié)果截圖###

結(jié)果截圖一
結(jié)果截圖二
結(jié)果截圖三
結(jié)果截圖四
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摔刁,隨后出現(xiàn)的幾起案子挥转,更是在濱河造成了極大的恐慌,老刑警劉巖共屈,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扁位,死亡現(xiàn)場離奇詭異,居然都是意外死亡趁俊,警方通過查閱死者的電腦和手機域仇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寺擂,“玉大人暇务,你說我怎么就攤上這事泼掠。” “怎么了垦细?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵择镇,是天一觀的道長。 經(jīng)常有香客問我括改,道長腻豌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任嘱能,我火速辦了婚禮吝梅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惹骂。我一直安慰自己苏携,他們只是感情好,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布对粪。 她就那樣靜靜地躺著右冻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪著拭。 梳的紋絲不亂的頭發(fā)上纱扭,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機與錄音儡遮,去河邊找鬼乳蛾。 笑死,一個胖子當著我的面吹牛峦萎,可吹牛的內(nèi)容都是我干的屡久。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼爱榔,長吁一口氣:“原來是場噩夢啊……” “哼被环!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起详幽,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤筛欢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后唇聘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體版姑,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年迟郎,在試婚紗的時候發(fā)現(xiàn)自己被綠了剥险。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡宪肖,死狀恐怖表制,靈堂內(nèi)的尸體忽然破棺而出健爬,到底是詐尸還是另有隱情,我是刑警寧澤么介,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布娜遵,位于F島的核電站,受9級特大地震影響壤短,放射性物質(zhì)發(fā)生泄漏设拟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一久脯、第九天 我趴在偏房一處隱蔽的房頂上張望纳胧。 院中可真熱鬧,春花似錦桶现、人聲如沸躲雅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至相寇,卻和暖如春慰于,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唤衫。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工婆赠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佳励。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓休里,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赃承。 傳聞我的和親對象是個殘疾皇子妙黍,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

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

  • 0x01 目錄 常見編碼: ASCII編碼 Base64/32/16編碼 shellcode編碼 Quoted-p...
    H0f_9閱讀 12,728評論 2 17
  • 本文主要介紹移動端的加解密算法的分類、其優(yōu)缺點特性及應(yīng)用瞧剖,幫助讀者由淺入深地了解和選擇加解密算法拭嫁。文中會包含算法的...
    蘋果粉閱讀 11,479評論 5 29
  • 這篇文章主要講述在Mobile BI(移動商務(wù)智能)開發(fā)過程中,在網(wǎng)絡(luò)通信抓于、數(shù)據(jù)存儲做粤、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 2,369評論 0 6
  • CTF中那些腦洞大開的編碼和加密 0x00 前言 正文開始之前先閑扯幾句吧,玩CTF的小伙伴也許會遇到類似這樣的問...
    查無此人asdasd閱讀 5,988評論 0 19
  • 姓名:李俊秀 公司:寧波大發(fā)化纖有限公司 期數(shù):六項精進259期學員 組別:感謝一組 【日精進打卡第41天】 【知...
    花語花香9閱讀 169評論 0 0