Java分组密码算法DES

Java分组密码算法DES

实验内容

掌握分组密码算法DES方法,能用高级语言实现分组密码算法DES。DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

2  分组密码算法DES算法的基本原理

其入口参数有三个:key、data、mode。 key为加密解密使用的密钥,data为加密  des算法结构解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性

2.1  分组密码算法DES算法概述

2.2  分组密码算法DES算法流程

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法  des算法流程图的主流程图如下

3. 实验结果

❤Java初高级学习分享,共同学习才是最明智的选择,喜欢的话可以我的学习群64弍46衣3凌9,或加资料群69似64陆0吧3(进群备注平台名)

源代码:

public class GetSubKey { 

    private String inKey; 

    private StringBuffer keyBuf; 

    private byte[] key = new byte[64]; // 保存密钥的64位二进制表示 

    private byte[] kwork = new byte[56]; 

    private static byte[] shift = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 

            2, 1 }; 

    protected byte[] k1 = new byte[48]; 

    protected byte[] k2 = new byte[48]; 

    protected byte[] k3 = new byte[48]; 

    protected byte[] k4 = new byte[48]; 

    protected byte[] k5 = new byte[48]; 

    protected byte[] k6 = new byte[48]; 

    protected byte[] k7 = new byte[48]; 

    protected byte[] k8 = new byte[48]; 

    protected byte[] k9 = new byte[48]; 

    protected byte[] k10 = new byte[48]; 

    protected byte[] k11 = new byte[48]; 

    protected byte[] k12 = new byte[48]; 

    protected byte[] k13 = new byte[48]; 

    protected byte[] k14 = new byte[48]; 

    protected byte[] k15 = new byte[48]; 

    protected byte[] k16 = new byte[48]; 

    protected byte[] kn = new byte[48]; 

    public GetSubKey(String inKey) { 

        byte j; 

this.inKey = inKey; 

        int len = inKey.length(); 

keyBuf = new StringBuffer(inKey); 

        if (len <8) { // 密钥必须是8位,若小于8位不够的补空格 ,大于8位取前8位 

            for (int i = 1; i <= 8 - len; i++) 

                keyBuf.append("?"); 

        } 

inKey = keyBuf.toString(); 

        // 将8个字符的密钥转换成64位二进制表示 

        for (int i = 0; i <8; i++) { 

j = (byte) (inKey.charAt(i)); 

            key[8 * i] = (byte) ((j / 128) % 2); 

            key[8 * i + 1] = (byte) ((j / 64) % 2); 

            key[8 * i + 2] = (byte) ((j / 32) % 2); 

            key[8 * i + 3] = (byte) ((j / 16) % 2); 

            key[8 * i + 4] = (byte) ((j / 8) % 2); 

            key[8 * i + 5] = (byte) ((j / 4) % 2); 

            key[8 * i + 6] = (byte) ((j / 2) % 2); 

            key[8 * i + 7] = (byte) (j % 2); 

        } 

        // 初始化键的排列顺序 

        kwork[0] = key[56]; 

        kwork[1] = key[48]; 

        kwork[2] = key[40]; 

        kwork[3] = key[32]; 

        kwork[4] = key[24]; 

        kwork[5] = key[16]; 

        kwork[6] = key[8]; 

        kwork[7] = key[0]; 

        kwork[8] = key[57]; 

        kwork[9] = key[49]; 

        kwork[10] = key[41]; 

        kwork[11] = key[33]; 

        kwork[12] = key[25]; 

        kwork[13] = key[17]; 

        kwork[14] = key[9]; 

        kwork[15] = key[1]; 

        kwork[16] = key[58]; 

        kwork[17] = key[50]; 

        kwork[18] = key[42]; 

        kwork[19] = key[34]; 

        kwork[20] = key[26]; 

        kwork[21] = key[18]; 

        kwork[22] = key[10]; 

        kwork[23] = key[2]; 

        kwork[24] = key[59]; 

        kwork[25] = key[51]; 

        kwork[26] = key[43]; 

        kwork[27] = key[35]; 

        kwork[28] = key[62]; 

        kwork[29] = key[54]; 

        kwork[30] = key[46]; 

        kwork[31] = key[38]; 

        kwork[32] = key[30]; 

        kwork[33] = key[22]; 

        kwork[34] = key[14]; 

        kwork[35] = key[6]; 

        kwork[36] = key[61]; 

        kwork[37] = key[53]; 

        kwork[38] = key[45]; 

        kwork[39] = key[37]; 

        kwork[40] = key[29]; 

        kwork[41] = key[21]; 

        kwork[42] = key[13]; 

        kwork[43] = key[5]; 

        kwork[44] = key[60]; 

        kwork[45] = key[52]; 

        kwork[46] = key[44]; 

        kwork[47] = key[36]; 

        kwork[48] = key[28]; 

        kwork[49] = key[20]; 

        kwork[50] = key[12]; 

        kwork[51] = key[4]; 

        kwork[52] = key[27]; 

        kwork[53] = key[19]; 

        kwork[54] = key[11]; 

        kwork[55] = key[3]; 

        /* 开始计算子键 */ 

        byte nbrofshift; 

        byte temp1, temp2; 

        for (int iter = 0; iter <16; iter++) { 

nbrofshift = shift[iter]; 

            for (int i = 0; i < (int) nbrofshift; i++) { 

temp1 = kwork[0]; 

temp2 = kwork[28]; 

                for (int k = 0; k <27; k++) { 

                    kwork[k] = kwork[k + 1]; 

                    kwork[k + 28] = kwork[k + 29]; 

                } 

                kwork[27] = temp1; 

                kwork[55] = temp2; 

            } 

            /* Permute kwork - PC2 */ 

            kn[0] = kwork[13]; 

            kn[1] = kwork[16]; 

            kn[2] = kwork[10]; 

            kn[3] = kwork[23]; 

            kn[4] = kwork[0]; 

            kn[5] = kwork[4]; 

            kn[6] = kwork[2]; 

            kn[7] = kwork[27]; 

            kn[8] = kwork[14]; 

            kn[9] = kwork[5]; 

            kn[10] = kwork[20]; 

            kn[11] = kwork[9]; 

            kn[12] = kwork[22]; 

            kn[13] = kwork[18]; 

            kn[14] = kwork[11]; 

            kn[15] = kwork[3]; 

            kn[16] = kwork[25]; 

            kn[17] = kwork[7]; 

            kn[18] = kwork[15]; 

            kn[19] = kwork[6]; 

            kn[20] = kwork[26]; 

            kn[21] = kwork[19]; 

            kn[22] = kwork[12]; 

            kn[23] = kwork[1]; 

            kn[24] = kwork[40]; 

            kn[25] = kwork[51]; 

            kn[26] = kwork[30]; 

            kn[27] = kwork[36]; 

            kn[28] = kwork[46]; 

            kn[29] = kwork[54]; 

            kn[30] = kwork[29]; 

            kn[31] = kwork[39]; 

            kn[32] = kwork[50]; 

            kn[33] = kwork[44]; 

            kn[34] = kwork[32]; 

            kn[35] = kwork[47]; 

            kn[36] = kwork[43]; 

            kn[37] = kwork[48]; 

            kn[38] = kwork[38]; 

            kn[39] = kwork[55]; 

            kn[40] = kwork[33]; 

            kn[41] = kwork[52]; 

            kn[42] = kwork[45]; 

            kn[43] = kwork[41]; 

            kn[44] = kwork[49]; 

            kn[45] = kwork[35]; 

            kn[46] = kwork[28]; 

            kn[47] = kwork[31]; 

            switch (iter) { 

            case 0: 

                for (int k = 0; k <48; k++) { 

                    k1[k] = kn[k]; 

                } 

                break; 

            case 1: 

                for (int k = 0; k <48; k++) { 

                    k2[k] = kn[k]; 

                } 

                break; 

            case 2: 

                for (int k = 0; k <48; k++) { 

                    k3[k] = kn[k]; 

                } 

                break; 

            case 3: 

                for (int k = 0; k <48; k++) { 

                    k4[k] = kn[k]; 

                } 

                break; 

            case 4: 

                for (int k = 0; k <48; k++) { 

                    k5[k] = kn[k]; 

                } 

                break; 

            case 5: 

                for (int k = 0; k <48; k++) { 

                    k6[k] = kn[k]; 

                } 

                break; 

            case 6: 

                for (int k = 0; k <48; k++) { 

                    k7[k] = kn[k]; 

                } 

                break; 

            case 7: 

                for (int k = 0; k <48; k++) { 

                    k8[k] = kn[k]; 

                } 

                break; 

            case 8: 

                for (int k = 0; k <48; k++) { 

                    k9[k] = kn[k]; 

                } 

                break; 

            case 9: 

                for (int k = 0; k <48; k++) { 

                    k10[k] = kn[k]; 

                } 

                break; 

            case 10: 

                for (int k = 0; k <48; k++) { 

                    k11[k] = kn[k]; 

                } 

                break; 

            case 11: 

                for (int k = 0; k <48; k++) { 

                    k12[k] = kn[k]; 

                } 

                break; 

            case 12: 

                for (int k = 0; k <48; k++) { 

                    k13[k] = kn[k]; 

                } 

                break; 

            case 13: 

                for (int k = 0; k <48; k++) { 

                    k14[k] = kn[k]; 

                } 

                break; 

            case 14: 

                for (int k = 0; k <48; k++) { 

                    k15[k] = kn[k]; 

                } 

                break; 

            case 15: 

                for (int k = 0; k <48; k++) { 

                    k16[k] = kn[k]; 

                } 

                break; 

            } 

        } 

    } 

❤提问/互动请留言,可直接在最底右下方"写留言即可"

❤Java初高级学习分享,共同学习才是最明智的选择,喜欢的话可以我的学习群64弍46衣3凌9,或加资料群69似64陆0吧3(进群备注平台名)

❤如果觉得写得不错请点击“订阅”,每天更新全新的内容!

❤你们的喜欢和关注就是我最大的动力支撑!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容