版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、package des;/* 加密过程 :* 1、初始置换IP:将明文顺序打乱重新排列,置换输出为64位。* 2、将置换输出的64位明文分成左右凉拌,左一半为L0,右一半称为R0各32位。* 3。计算函数的 16 轮迭代。* a)第一轮加密迭代:左半边输入L0,右半边输入R0:由轮函数f实现子密钥K1对R0的加 密,* 结果为 32 位数据组 f(R0,K1),* b)第二轮加密迭代:左半边输入L仁R0右半边输入R1=L0 f(R0,K1),由轮函数f实现子密 钥* K2对R1的加密结果为32位数据组f(R1,K2),f(R1,K2)与 L1模2相加,得到一个32为 数据组 L1 f(R1,K
2、2)、* c)第3到16轮迭代分别用密钥K3,K4K16进行。4、再经过逆初始置换IP-1,将数据打乱重排 ,生成 64 位密文。* 子密钥生成过程 :* 1、将64位的密钥经过 PC-1置换生成56位密钥。* 2、将 56位的密钥分成左右两部分 ,分别进行移位操作 (一共进行 16轮),产生 16个56位 长度的子密钥。* 3、将16个56位的子密钥分别进行 PC-2置换生成16个48位的子密钥。*轮函数f的工作过程:* 1、在第i次加密迭代过程中,扩展置换E对32位的Ri-1的各位通过置换表置换为48位的输出。* 2、将该48位的输出与子密钥 Ki进行异或操作,运算结果经过S盒代换运算,得
3、到一个32 位比特的输出。* 3。该32位比特输出再经过 P置换表进行P运算,将其各位打乱重排,生成32位的输出。* author Ouyang*/public class Des int byteKey;public Des(int byteKey) this、 byteKey = byteKey; private static final int IP = 58, 50, 42, 34, 26, 18, 10, 2, 60, 52,44, 36, 28,20, 12, 4, 62,54,46,38,30, 22, 14, 6, 64, 56, 48,40, 32, 24,16, 8, 57
4、, 49,41,33,25,17, 9,1, 59, 51, 43, 35,27, 19, 11,3, 61, 53, 45,37,29,21,13, 5,63, 55, 47, 39, 31,23, 15, 7 ;/ 64private static final int IP_1 = 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45,13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35
5、, 3, 43, 11,51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49,17, 57, 25 ; / 64private static final int PC_1 = 57, 49, 41, 33, 25, 17, 9, 1, 58, 50,42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44,36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6,61, 53,
6、45, 37, 29, 21, 13, 5, 28, 20, 12, 4 ; / 56 private static final int PC_2 = 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21,10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47,55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36,29, 32 ; / 48private static final int E = 32, 1, 2,
7、 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9,10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20,21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1 ; / 48 private static final int P = 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23,26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30
8、, 6, 22,11, 4, 25 ; / 32 private static final int S_Box = / S- 盒/ S_Box1 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 , 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 , 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 , 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 , / S_Box
9、2 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 , 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 , 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 , 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 , / S_Box3 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 , 13, 7, 0, 9, 3
10、, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 , 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 , 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 , / S_Box4 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 , 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 , 10, 6, 9, 0, 12, 11, 7, 13, 15
11、, 1, 3, 14, 5, 2, 8, 4 , 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 , / S_Box5 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 , 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 , 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 , 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4
12、, 5, 3 , / S_Box6 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 , 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 , 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 , 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 , / S_Box7 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1
13、, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 , 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 , 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 , / S_Box8 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 , 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 , 7, 11, 4, 1, 9
14、, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 , 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 ; private static final int LeftMove = 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2,2, 2, 2, 1 ;* 对 64 位明文进行 IP 置换处理 ,* param data 需要经过初始 IP 置换的明文* return 64 位经过置换处理的明文*/public int IpReplace(int data) int ipMingWen =
15、new int64;for (int i = 0; i ipMingWen 、 length; i+) ipMingWeni = dataIPi-1;return ipMingWen;public static int StringToBits(String data) byte test = data 、 getBytes(); int IntVa = new int64;int IntDa = new int8;for (int i = 0; i 8; i+) IntDai = testi;if (IntDai 0) IntDai += 256;IntDai %= 256;for (int
16、 i = 0; i 8; i+) for (int j = 0; j 8; j+) IntVa(i * 8) + 7) - j = IntDai % 2; IntDai = IntDai / 2;return IntVa;/*,输出经过左移后的数组28 位 ,然后根据左移表要求* 功能 :对给定的数组按照 offset 指定的位数进行循环左移* 作用 :将经过 pc-1 置换处理后的 56 位密钥先分成左右各 对密钥进行左移* param key 经过 pc-1 处理后的 56 位密钥* return 单个 56 位的子密钥 ( 初步 ,未经过 pc2 置换 )*/public int Lef
17、tMove(int key,int offset)int subKey = new int56;int C0 = new int28;int D0 = new int28;int C1 = new int28;int D1 = new int28;for (int i = 0; i 28; i+) C0i = keyi;D0i = keyi+28;if(offset = 1)for(int i = 0; i 27;i+)C1i = C0i+1;D1i = D0i+1;C127 = C00;D127 = D00;else if(offset = 2)for (int i = 0; i 26; i
18、+) C1i = C0i+2;D1i = D0i+2;C126 = C00;D126 = D00;C127 = C01;D127 = D01;for (int i = 0; i 28; i+) subKeyi = C1i; subKeyi+28 = D1i;return subKey;*根据经过PC-1置换后的56位密钥生成16个56位的子密钥。再经过PC-2置换生成 16 个 48 位的子密钥* param key 经过 pc-1 置换后的 56 位密钥* return 处理完全的 16 个 48 位子密钥 (以二维数组的形式存储 )*/public int SubKeyGenerate(i
19、nt key)int subKeyArrayTemp = new int1656;int subKey = new int1648;int KO = new int56;特别注意:xxxIPi-1等类似变换/对 64 位的密钥进行 pc-1 置换变成 56 位的密钥 for (int i = O; i 56; i+) K0i = keyPC_1i - 1; / 密钥进行 PC-1 变换/ 由经过 pc-1 置换生成的 56 位密钥经过 16 轮左移 ,pc-2 置换等操作生成 16 个 48 位的子密钥for (int i = O; i 16; i+) subKeyArrayTempi = L
20、eftMove(KO,LeftMovei); System、arraycopy(subKeyArrayTempi,O , KO, O, 56);for (int i = O; i 16; i+) for (int j = O; j 48; j+) subKeyij = subKeyArrayTempiPC_2j-1;return subKey;/* 对 64 位明文右半部分 (32 位)进行扩展 ,以进行与子密钥异或的操作* param data 32 位的经过处理的明文* return 扩展后的 48 位明文*/public int EExpend(int data) int dataExp
21、end = new int48;for (int i = O; i dataExpend 、 length; i+) dataExpendi = dataEi-1;return dataExpend;/* 对输入的数据进行按位异或操作后输出,主要用在为明文右半部分(48 位 )与子密钥(48)异或 ,*经过S盒代换后的f函数输出(32位)与明文左半部分(32位)的异或操作* param data 48 位的明文部分* param key 48 位的子密钥* return 48 位进过异或操作的输出*/public int XOR(int data1,int data2)int XORResul
22、t = new intdata1 、 length;for (int i = 0; i data1 、 length; i+) XORResulti = data1i+data2i; if(XORResulti = 2)XORResulti = 0;return XORResult;/* 将 48 位的经过异或处理的明密文进行 S 盒代换 ,然后对产生的 32 位中间结果进行 P 代换* param temp 48 位的经过异或处理的中间结果* return 32位的经过S盒代换与P置换后的中间结果*/public static int SBoxReplace(int temp)int sBo
23、xResult = new int32; 存储经过 S盒代换的32位二进制处理中间结果int pReplaceResult = new int32; 存储经过 S盒代换与 P代换的32位的F函数处 理结果int tempArray = new int86;int tempRowTemp = new int8;int roundCount = temp 、 length/6;/将48位的经过异或处理的中间结果以 6个为一组(共分成 8组)存储在二维数组中 for (int i = 0; i roundCount; i+) for (int j = 0; j 6; j+) tempArrayij
24、= temp(i*6)+j; /将分成的8组(每组6个)数据根据S盒代换规则对每组 6个数据进行拆分并 进行S盒代换tempRowTempi=S_Boxi(tempArrayi01)+(tempArrayi5) (tempArrayi13)+(tempArrayi22)+(tempArrayi31)+(tempArrayi4);/将生成的8个数(每个都就是经过 S盒代换后的十进制数)转换成二进制数,并 按顺序存储到结果数组中for (int j = 0; j 4; j+) sBoxResult(i*4+3)-j=tempRowTempi%2; tempRowTempi = tempRowTem
25、pi/ 2;for (int i = 0; i 32; i+) pReplaceResulti = sBoxResultPi-1;return pReplaceResult;public int Ip1Replace(int data) int ipMingWen = new int64; for (int i = 0; i ipMingWen 、 length; i+) ipMingWeni = dataIP_1i-1;/*return ipMingWen;实现加密与解密工作* param data* param key2* param flag* return*/public int En
26、AndDecrypt(int data, int flag) int mingwen = IpReplace(data); int mingwenTemp = new int64; int miwen = IpReplace(data); int miwenTemp = new int64; int keyArray = SubKeyGenerate(byteKey); int temp = new int48; int tempSBox = new int32; int L0 = new int32; int R0 = new int32; int L1 = new int32; int R
27、1 = new int32; int ER0 = new int48;if(1 = flag)System、 arraycopy(mingwen, 0, L0, 0, 32); System、 arraycopy(mingwen, 32, R0, 0, 32); for (int i = 0; i 16; i+) System、 arraycopy(R0, 0, L1, 0, 32); ER0 = EExpend(R0); temp = XOR(ER0,keyArrayi); tempSBox = SBoxReplace(temp); R1 = XOR(L0,tempSBox);System、
28、 arraycopy(L1, 0, L0, 0, 32); System、 arraycopy(R1, 0, R0, 0, 32);for (int i = 0; i 32; i+) mingwenTempi = R1i; mingwenTempi+32 = L1i;mingwen = Ip1Replace(mingwenTemp);else if(0 = flag)System、 arraycopy(mingwen, 0, L0, 0, 32);System、 arraycopy(mingwen, 32, R0, 0, 32); for (int i = 0; i 16; i+) Syste
29、m、 arraycopy(R0, 0, L1, 0, 32);ER0 = EExpend(R0);temp = XOR(ER0,keyArray15 - i); tempSBox = SBoxReplace(temp); R1 = XOR(L0,tempSBox); System、 arraycopy(L1, 0, L0, 0, 32); System、 arraycopy(R1, 0, R0, 0, 32);for (int i = 0; i 32; i+) miwenTempi = R1i; miwenTempi+32 = L1i;miwen = Ip1Replace(miwenTemp); return (flag=1) ? mingwen : miwen; public static void main(String args) String dataString = 10101001;System、 out 、 println( 明文为 :+dataString); int data = StringToBits(dataStr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度智能停车系统车库交易合同2篇
- 二零二五年度家政服务与家庭旅游策划合同3篇
- 二零二五年度叉车维修保养与维修设备租赁合同2篇
- 2025年度综合体物业房使用及公共设施维护协议3篇
- 二零二五年度大棚养殖废弃物资源化利用合作协议2篇
- 二零二五年度文化旅游项目借款及旅游资源担保服务协议3篇
- 二零二五年度保障性住房置换合同范本
- 二零二五年度ISO9001质量管理体系认证咨询与实施合同3篇
- 二零二五年度加油站油品供应与信息化建设合同3篇
- 船舶管系课程设计
- 女装行业退货率分析
- 领导沟通的艺术
- 纯视觉方案算法
- 道士述职报告
- 绿色贷款培训课件
- 2024年七年级语文上学期期末作文题目及范文汇编
- 云南省昆明市五华区2023-2024学年九年级上学期期末英语试卷+
- 2023年生产运营副总经理年度总结及下一年计划
- 2023年中考语文标点符号(顿号)练习(含答案)
- 施工图审查招标文件范文
- 布袋式除尘器制造工序检验规定
评论
0/150
提交评论