精华内容
下载资源
问答
  • 在通信网络两端,双方约定一致Key,在通信源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络终点,数据到达目的地后,用同样Key对密码数据进行解密,便再现了明码...
  • Android 3DES 进行加密解密 **我就直接进入主题了哈** **很粗糙一个页面 希望不要介意** **下面是xml 很简陋一个参考 大家随意** <LinearLayout android:layout_width="match_parent" android:layout_...

    Android 3DES 进行加密解密

    **我就直接进入主题了哈**
    

    在这里插入图片描述

    **很粗糙的一个页面 希望不要介意**
    
    **下面是MainActivity里面的操作**
    
        private EditText et_raw;
        private TextView tv_des;
        //加密解密
            et_raw = (EditText) findViewById(R.id.et_raw);
            tv_des = (TextView) findViewById(R.id.tv_des);
    
                findViewById(R.id.btn_3des).setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                         String raw = et_raw.getText().toString();
                         String key = "a";
                         String jiami= Des3Util.encrypt(key, raw);
                         String jiemi= Des3Util.decrypt(key, jiami);
                         String zong= String.format("3DES加密结果是:%s\n3DES解密结果是:%s", jiami, new String(jiemi));
                         tv_des.setText(zong);
                    }
                });
    
    **`下面是 Des3Util工具类`**
    
    package com.example.util;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    public class Des3Util {
    
        // 定义加密算法,DESede即3DES
        private static final String Algorithm = "DESede";
    
        //加密函数。key为密钥
        public static String encrypt(String key, String raw) {
            byte[] enBytes = encryptMode(key, raw.getBytes());
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(enBytes);
        }
    
        //解密函数。key值必须和加密时的key一致
        public static String decrypt(String key, String enc) {
            try {
                BASE64Decoder decoder = new BASE64Decoder();
                byte[] enBytes = decoder.decodeBuffer(enc);
                byte[] deBytes = decryptMode(key, enBytes);
                return new String(deBytes);
            } catch (IOException e) {
                e.printStackTrace();
                return enc;
            }
        }
    
        private static byte[] encryptMode(String key, byte[] src) {
            try {
                SecretKey deskey = new SecretKeySpec(build3DesKey(key), Algorithm);
                Cipher cipher = Cipher.getInstance(Algorithm);
                cipher.init(Cipher.ENCRYPT_MODE, deskey);
                return cipher.doFinal(src);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
        private static byte[] decryptMode(String key, byte[] src) {
            try {
                SecretKey deskey = new SecretKeySpec(build3DesKey(key), Algorithm);
                Cipher cipher = Cipher.getInstance(Algorithm);
                cipher.init(Cipher.DECRYPT_MODE, deskey);
                return cipher.doFinal(src);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
        //根据字符串生成密钥24位的字节数组
        private static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException {
            byte[] key = new byte[24];
            byte[] temp = keyStr.getBytes("UTF-8");
    
            if (key.length > temp.length) {
                System.arraycopy(temp, 0, key, 0, temp.length);
            } else {
                System.arraycopy(temp, 0, key, 0, key.length);
            }
            return key;
        }
    }
    
    **下面是util里面用到的类**
    **可以直接下载**
    
    链接:https://pan.baidu.com/s/15UZ7cGDiifhp8ZEBMbjohg 
    提取码:2xq4 
    
    给大家看一下效果图吧
    

    在这里插入图片描述

    来自一个 Beautiful Girl 的总结 没有了 没有了  到底啦
    
    展开全文
  • DES加密Verilog模块设计

    2011-03-04 12:14:28
    DES加密工作原理中只详细介绍了DES一轮,其中对DES一轮中各个步骤进行了比较详细的简介。对DES加密算法进行了图解和说明,并用表格形式对DES置换规则,放大换位,单纯换位进行了描述。且对DES算法框图中选择...
  • 3des加密(双倍长)(ECB,CBC)详细介绍

    千次阅读 2017-04-13 16:04:50
    网上查了下关于ECB和CBC加密,只有一些图文介绍,没有详细步骤,现在在这里记录一下自己使用过程。 参考资料:http://blog.csdn.net/aaaaatiger/article/details/2525561 需要详细了解朋友请自行查找...

    网上查了下关于ECB和CBC加密,只有一些图文介绍,没有详细步骤,现在在这里记录一下自己的使用过程。

    参考资料:http://blog.csdn.net/aaaaatiger/article/details/2525561



    需要详细了解的朋友请自行查找其它资料,我只在这里介绍一下中间加密器的过程,以16字节密钥为例。

    一、DES加密和解密

    /**
    	 * DES加密
    	 * 
    	 */
    	public static byte[] encryptDes(byte[] key, byte[] src) {
    		try {
    			// 创建一个DESKeySpec对象
    			DESKeySpec desKey = new DESKeySpec(key);
    			// 创建一个密匙工厂
    			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    			// 将DESKeySpec对象转换成SecretKey对象
    			SecretKey secretKey = keyFactory.generateSecret(desKey);
    			// Cipher对象实际完成解密操作
    			Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
    			// 用密匙初始化Cipher对象
    			cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    			// 现在,获取数据并加密
    			// 正式执行加密操作
    			return cipher.doFinal(src);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * des解密
    	 * 
    	 * @param key
    	 * @param src
    	 * @return
    	 */
    	public static byte[] decryptDes(byte[] key, byte[] src) {
    		try {
    			// DES算法要求有一个可信任的随机数源
    			SecureRandom random = new SecureRandom();
    			// 创建一个DESKeySpec对象
    			DESKeySpec desKey = new DESKeySpec(key);
    			// 创建一个密匙工厂
    			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    			// 将DESKeySpec对象转换成SecretKey对象
    			SecretKey secretKey = keyFactory.generateSecret(desKey);
    			// Cipher对象实际完成解密操作
    			Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
    			// 用密匙初始化Cipher对象
    			cipher.init(Cipher.DECRYPT_MODE, secretKey, random);
    			// 现在,获取数据并加密
    			// 正式执行加密操作
    			return cipher.doFinal(src);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}

    这是java自带的des加密

    二、ECB加密

    /**
    *加密
    */
    public static String encryptECB3Des(String key, String src) {
    		System.out.println("encryptECB3Des->" + "key:" + key);
    		System.out.println("encryptECB3Des->" + "src:" + src);
    		int len = key.length();
    		if (key == null || src == null) {
    			return null;
    		}
    		if (src.length() % 16 != 0) {
    			return null;
    		}
    		if (len == 32) {
    			String outData = "";
    			String str = "";
    			for (int i = 0; i < src.length() / 16; i++) {
    				str = src.substring(i * 16, (i + 1) * 16);
    				outData += encECB3Des(key, str);
    			}
    			return outData;
    		}
    		return null;
    	}
    
    	public static String encECB3Des(String key, String src) {
    		byte[] temp = null;
    		byte[] temp1 = null;
    		temp1 = encryptDes(stringToHexBytes(key.substring(0, 16)), stringToHexBytes(src));
    		temp = decryptDes(stringToHexBytes(key.substring(16, 32)), temp1);
    		temp1 = encryptDes(stringToHexBytes(key.substring(0, 16)), temp);
    		return byte2HexString(temp1, "");
    	}
    
    	public static String decECB3Des(String key, String src) {
    		byte[] temp2 = decryptDes(stringToHexBytes(key.substring(0, 16)), stringToHexBytes(src));
    		byte[] temp1 = encryptDes(stringToHexBytes(key.substring(16, 32)), temp2);
    		byte[] dest = decryptDes(stringToHexBytes(key.substring(0, 16)), temp1);
    		return byte2HexString(dest, "");
    	}
    
    	/**
    	 * 3DES(双倍长) 解密
    	 * 
    	 * @param keybyte
    	 * @param src
    	 * @return
    	 */
    	public static String decryptECB3Des(String key, String src) {
    		if (key == null || src == null) {
    			return null;
    		}
    		if (src.length() % 16 != 0) {
    			return null;
    		}
    		if (key.length() == 32) {
    			String outData = "";
    			String str = "";
    			for (int i = 0; i < src.length() / 16; i++) {
    				str = src.substring(i * 16, (i + 1) * 16);
    				outData += decECB3Des(key, str);
    			}
    			return outData;
    		}
    		return null;
    	}

    加密的原理是:1、使用密钥的前8个字节对数据的8个字节进行des加密得到temp1。

    2、使用密钥的后8个字节对temp1进行des解密得到temp2。

    3、使用密钥的前8个字节对temp2做des加密得到最后的密文。

    代码中间有几处转换,转换原理为“0x11“转换成字符串“11”,和将字符串“11”转换成字节“0x11”。

    三、CBC加密和解密

    public static String encryptCBC3Des(String key, String src) {
    		String IV = "0000000000000000";
    		return encryptCBC3Des(IV, key, src);
    	}
    
    	/**
    	 * 3DES(双倍长) 加密
    	 * 
    	 * @param keybyte
    	 * @param src
    	 * @return
    	 */
    	public static String encryptCBC3Des(String IV, String key, String src) {
    		String outData = "";
    		String enc = IV;
    		byte[] strBs = null;
    		byte[] encBs = null;
    		byte[] b2 = new byte[8];
    		for (int i = 0; i < src.length() / 16; i++) {
    			strBs = stringToHexBytes(src.substring(i * 16, (i + 1) * 16));
    			encBs = stringToHexBytes(enc);
    			for (int j = 0; j < b2.length; j++) {
    				b2[j] = (byte) (encBs[j] ^ strBs[j]);
    			}
    			enc = encECB3Des(key, byte2HexString(b2, ""));
    			outData += enc;
    		}
    		return outData;
    	}
    
    	public static String decryptCBC3Des(String key, String src) {
    		String IV = "0000000000000000";
    		return decryptCBC3Des(IV, key, src);
    	}
    
    	/**
    	 * 3DES(双倍长) 解密
    	 * 
    	 * @param keybyte
    	 * @param src
    	 * @return
    	 */
    	public static String decryptCBC3Des(String IV, String key, String src) {
    		String outData = "";
    		String enc = IV;
    		String str = "";
    		byte[] encBs = null;
    		byte[] decBs = null;
    		byte[] b2 = new byte[8];
    		for (int i = 0; i < src.length() / 16; i++) {
    			str = src.substring(i * 16, (i + 1) * 16);
    			decBs = stringToHexBytes(decECB3Des(key, str));
    			encBs = stringToHexBytes(enc);
    			for (int j = 0; j < b2.length; j++) {
    				b2[j] = (byte) (encBs[j] ^ decBs[j]);
    			}
    			enc = str;
    			outData += byte2HexString(b2, "");
    		}
    		return outData;

    ECB和CBC对8字节数据的加密过程相同,CBC方式会把后面一组数据的明文和前面一组数据的密文异或,只是不同的地方。



    展开全文
  • DES加密工作原理中只详细介绍了DES一轮,其中对DES一轮中各个步骤进行了比较详细的简介。对DES加密算法进行了图解和说明,并用表格形式对DES置换规则,放大换位,单纯换位进行了描述。且对DES算法框图中选择...

    本文对DES加密模块的设计进行了详细的介绍,对DES加密技术的工作原理及DES的算法进行了详细的介绍。DES算法的3个入口参数为keydatamodekey为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。本文只对key-gen模块进行了详细的讲解。DES加密工作原理中只详细介绍了DES的一轮,其中对DES的一轮中各个步骤进行了比较详细的简介。对DES加密算法进行了图解和说明,并用表格形式对DES的置换规则,放大换位,单纯换位进行了描述。且对DES算法框图中的选择函数S1S8进行了表格描述。另外本文还对采用的硬件描述语言Verilog HDL进行了简介,对其语法和源代码等进行了介绍。

    数据加密标准(DES,Data Encryption Standard)也称为数据加密算法(DEA,Data Encryption Algrithm)(ANSI)和DEA-1(ISO),是近20年来使用的加密算法。后来,人们发现DES在强大攻击下太脆弱,因此使DES的应用有所下降。但是,任何一本安全书籍都不得不提到DES,因为它曾经是加密算法的标志。介绍DES的细节还有两个作用:第一,介绍DES;第二,更重要的是分析和理解实际加密算法。利用这个方法,我们还要从概念上介绍其他加密算法,但不准备深入介绍,因为通过DES介绍已经可以了解计算机加密算法的工作原理。DES通常使用ECB,CBC,或CFB模式。

    DES产生可以追溯到1972年,美国的国家标准局(NBS,即现在的国家标准与技术学会,NIST)启动了一个项目,旨在保护计算机和计算机通信中的数据。它们想开发一个加密算法。两年之后,NBS发现IBM公司的Lucifer相当理想,没有必要从开头开发一个新的加密算法。经过几次讨论,NBS于1975年发布了这个加密算法的细节。到1976年底,美国联邦政府决定采用这个算法,并将其更名为数据加密标准。不久,其他组织也认可和采用DES作为加密算法。

    DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。其密钥长度为56位,明文按64位进行分组,将分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

    DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用DES加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在某些场合,仍然发挥着余热。

    DES是个块加密法,按64位块长加密数据,即把64位明文作为DES的输入,产生64位密文输出。加密与解密使用相同的算法和密钥,只是稍作改变。密钥长度为56位。基本原理图如3-1。

    前面曾经介绍过,DES使用56位密钥。实际上,最初的密钥位64位,但在DES过程开始之前放弃密钥的每个第八位,从而得到56位密钥,即放弃第8,16,24,32,40,48,56和64位,如表3-1所示,阴影部分表示放弃的位。

    这样,64位密钥丢弃每个第8位即得到56位密钥,如图3-2所示。

    简单地说,DES利用加密的两个基本属性:替换(也称混淆)和变换(也称扩散)。DES共16步,每一步称为一轮,每一步进行替换与变换步骤。

    表3-1 放弃密钥中的每个第8位

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    下面介绍DES中主要步骤。

    1. 将64位明文块送入初始置换(Initial Permutation,IP)函数。
    2. 对明文进行初始置换。
    3. 初始置换产生转换块的两半,假设为左明文(LPT)和右明文(RPT)。
    4. 每个左明文与右明文经过16轮加密过程,各有自己的密钥。
    5. 将左明文和右明文重接起来,对组成的块进行最终置换(Final Permutation,FP)
    6. 这个过程的结果得到64位密文。

      图3-3显示了这个过程。

    3.2  初始置换

    初始置换只发生一次,是在第一轮之前进行的,指定初始置换中的变换如何进行,如表3-2所示。例如,它指出初始置换将原明文块的第一位换成原明文块的第58位,第2位换成原明文块的第50位,等等,这只是把原明文块进行移位。

    表3-2 初始置换

    明文块中各位位置

    换成该位置的内容

    1

    2

    3

    64

    58

    50

    42

    7

    表3-3显示了IP使用的完整变换表。这个表要从左向右、从上到下读。例如,我们发现第一个位置的58表示原明文块中第58位的内容在初始置换时改写第一位的内容,同样,1放在表中第40位,表示第一位改写原明文块中第40位,所有其他位一样。

    IP完成后,得到的64位置换文本块分成两半,各32位,左块成左明文(LPT),右块成右明文(RPT)。然后对两块进行16轮操作。

    表3-3  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

    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

    3.3  DES的一轮

    DES的一轮包括图3-4所示步骤。

     

    P盒替换

    异或交换

     

    密钥变换

     

    扩展置换

    S盒替换

    图3-4  DES的一轮

         第一步:密钥变换

    最初64位密钥通过放弃每个第8位而得到56位密钥。这样,每一轮有个56位密钥。每一轮从这个56位密钥产生不同的48位子密钥,称为密钥变换。为此,56位密钥分成两半,各为28位,循环左移一位或两位。例如,如果轮号为1、2、9、16,则只移一位,否则移两位。表3-4显示了每一轮移动的密钥位数。

    相应移动后,选择56位中的48位。选择56位中的48位时使用表3-5所示,如果仔细看看表格则可发现其中只有48位。位号18放弃(表中没有),另外7位也是,从而将56位减到48位。由于密钥变换要进行置换和选择56位中的48位,因此称为压缩置换(compression permutation)。

    表3-4 每一轮移动的密钥位数

    轮号

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    位数

    1

    1

    2

    2

    2

    2

    2

    2

    1

    2

    2

    2

    2

    2

    2

    1

    表3-5 压缩置换

    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

    第2步 扩展置换

    经过初始置换后我们得到两个32位明文区,分别称为左明文和右明文。扩展置换将右明文从32位扩展到48位,除了从32位扩展到48位之外,这些位也进行置换,因此称为扩展置换(expansion permutation)。过程如下:

    1. 将32位右明文分成8块,每块各有4位,如图3-5所示。
    2. 将上一步的每个4位块扩展为6位块,即每个4位块增加2位。这两位实际上是重复4位块的第1位和第4位。第2位和第4位口令输入一样写出。注意第一个输入位在第二个输出位重复,并在第48位重复。同样,第32个输入位在第47个输出位和第1个输出位。

    显然,这个过程在生成输出时扩展和置换输入位。

      

    原始32位右明文

    块1(4位)

    块2(4位)

    块8(4位)

     

    图3-5 扩展置换

    右明文扩展置换过程如图3-6所示。

     

     

    1

    2

    3

    4

    5

    6

    输出块1

    输出块2

    输出块8

    2

    1

    3

    4

    5

    6

    7

    8

    输入块1

    输入块2

    输入块8

     

            图3-6 右明文扩展置换过程

    由扩展置换过程图可以知:第一个输入位出现在第二个输出位和第48位,第二个输入位到第三个输出位,等等。因此,扩展置换实际上使用表3-6所示。

     

     

     

    表3-6 右明文扩展置换表

    32

    1

    2

    3

    4

    5

    6

    7

    8

    9

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    24

    25

    26

    27

    28

    29

    30

    31

    32

    1

    由表3-5可知密钥变换将56位密钥压缩成48位,而扩展置换将32位右明文扩展为48位。现在,48位密钥与48位右明文进行异或运算,将结果传递到下一步,即S盒替换。

    S盒替换如图3-7所示。

     

    S盒替换

    密钥变换(将密钥从56位压缩为48位)

    扩展置换(将右明文从32位扩展为48位)

    48位密钥

    48位右明文

    XOR

     

    图3-7  S盒替换

    第3步: S盒替换

    替换使用8个替换盒(substitution boxes)(也称为S盒),每个S盒有6位输入和4位输出。48位输入块分成8个子块(各有6位),每个子块指定一个S盒。S盒将6位输入变成4位输出。

    第4步:P盒置换

    所有S盒的输出组成32位块,对该32位要进行P盒置换(P-box  Permutation)。P盒置换机制只是进行简单置换(即按P表指定把一位换成另一位,而不进行扩展的压缩)。表3-7显示了P盒。例如,第一块的16表示原输入的第16位移到输出的第1位,第16块的10表示原输入的第10位移到输出的第16位。

    表3-7  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

    6

    22

    11

    4

    25

    第5步:异或与交换

    注意上述所有操作只是处理了64位明文的右边32位,还没有处理左边部分。这时,最初64位明文的大部分与P盒置换的结果进行异或运算,结果成为新的右明文,并通过交换将旧的右明文变成为新的左明文。

    3.4  最终置换

    16轮结束后,进行最终置换(只一次),即按表3-8进行变换。例如,第40位输入代替第1位输出等等。

    最终置换的输出就是64位加密块。

    表3-8 最终置换

    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

    3

    43

    11

    51

    19

    59

    27

    34

    2

    42

    10

    50

    18

    58

    26

    33

    1

    41

    9

    49

    17

    57

    25

                

    第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换规则、放大换位、单纯换位分别见表4-2、表4-3、表4-4。

    表4-2 DES算法逆置换规则

    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

    3

    43

    11

    51

    19

    59

    27

    34

    2

    42

    10

    50

    18

    58

    26

    33

    1

    41

    9

    49

    17

    57

    25

    表4-3 DES算法放大换位表

    32

    1

    2

    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

    表4-4 DES算法单纯换位表

    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

    6

    22

    11

    4

    25

    在f(R,K)算法描述图中,S1,S2,…,S8为选择函数,其功能是把6bit数据变为4bit数据。S1、S8,分别见表4-5,表4-6。

    表4-5 算法描述图中选择函数S1

    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

    表4-6 算法描述图中选择函数S8

    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

    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

     在此,以S1为例说明其功能。我们可以看到:在S1中,共有4行数据,命名为0、1、2、3行;每行有16列,命名为0、1、2、3…14、15列。

    现设输入为:D=D1D2D3D4D5D6

    令:列=D2D3D4D5

        行=D1D6

    然后在S1表中查得对应的数,以4位二进制表示,此即为选择函数S1的输出。下面给出子密钥(48bit)的生成算法。从子密钥的生成算法描述图中我们可以看到:初始Key值为64位,但DES算法规定,其中第8、16、…64位是奇偶校验位,不参与DES运算。故Key实际可用位数便只有56位。即经过缩小选择换位后,Key的位数由64位变成56位,此56位分为C0、D0两部分,各28位,然后分别进行第1次循环左移,得到C1、D1,将C1(28位)、D1(28位)合并得到56位。即经过缩小换位,从而得到了密钥(48位)。以此类推其他密钥。

    DES算法的解密过程是一样的,区别仅仅在于第一次迭代时用子密钥K15,第二次用K14,…,最后一次用K0,算法本身并没有任何变化。

     

     

    key_gen模块核心程序如下:

    ……

    prev_key_var=previous_key;               ---iteration CASE 选择

    new_key_var=0;

    new_key=(0);

    non_perm_key_var=0;

    non_perm_key=(0);

    if(!decrypt)

    begin

      case(iteration)

      0,1,8,15;

      begin

        semi_key= prev_key_var[55:28];

        prev0= semi_key[27];

        semi_key= semi_key<<1;

        semi_key[0]=prev0;

        non_perm_key_var[55:28]= semi_key;

        semi_key= perv_key_var[27:0];

        non_perm_key_var[27:0]= semi_key;

        ……

      default:

      begin

        semi_key= prev_key_var[55:28];

        prev0= semi_key[27];

        prev0= semi_key[26];

        semi_key= semi_key<<2;

        semi_key[1]=prev0;

        semi_key[0]=prev1;

        non_perm_key_var[55:28]= semi_key;

        semi_key= perv_key_var[27:0];

        ……

    else

    begin

    case(iteration)

    0:

      begin

        semi_key= prev_key_var[55:28];

        non_perm_key_var[55:28]= semi_key;

        ……

    non_perm_key=(non_perm_key_var);     ---new_key_var产生电路

    new_key_var[47]= non_perm_key_var[42];

    new_key_var[46]= non_perm_key_var[39];

    new_key_var[45]= non_perm_key_var[45];

    new_key_var[44]= non_perm_key_var[32];

    ……

    new_key_var[2]= non_perm_key_var[20];

    new_key_var[1]= non_perm_key_var[27];

    new_key_var[0]= non_perm_key_var[24];

    new_key=( new_key_var);

    ……

    在decrypt=1、decrypt=0条件下,key_gen仿真波形分别如图4-5、图4-6所示。

     

       图4-5  decrypt=1时key_gen部分仿真波形

     

       图4-6  decrypt=0时key_gen部分仿真波形

    4.2.3   S部件代换模块设计

    扩展器输出的48bit数据和密钥K模2相加得到48bit的数据A,这个数据必须代换为32bit的数据B,再经过重排P(B),然后才能和L进行运算。S代换部件就是完成从48bit到32bit的代换并重排。

    S代换部件是一个十分复杂的非线性函数,正是经过它的非线性变换才使明文实现了较好的混乱(confusion),达到加解密效果,从而具有较强的安全性。S代换部件在整个DES算法中所占比重较大,一共有8个模块,是设计中需要关注的部分。

    S盒的设计准则如下:

    1. 没有一个S代换部件的输出位是接近输入位的线性函数。
    2. 如果将输入位的最左或最右端的位固定,变化中间的4位,每个可能的4位输出只能得到一次。
    3. 如果S部件两个输入仅有1位的差异,则其输出必须至少有2位不同。
    4. 如果S代换部件的两个输入仅有中间2位不同,则其输出必须至少有2位不同。
    5. 如果S代换部件的两个输入前2位不同,后2位已知,则其输出必不同。
    6. 对于输入之间的任何非零的G位差分,32对中至多有8对显示出的差分导致了相同的输出差分。

    对于S代换部件的实现,主要有两种方法:查表法,逻辑电路法。本章节通过逻辑电路法实现S代换部件。使用逻辑电路法来设计的时候,通常使用硬件描述语言Verilog HDL编写程序作为设计输入。S部件代换模块S1,S8仿真波形分别如图4-7和图4-8所示。

    4.2.4   desround 模块设计

    desround模块执行DES算法中的一轮非线性变换。一轮非线性变换的作用过程:第i步非线性变换的输入信号是32bit的右寄存器R(i),首先把它加到扩展器E上,扩展器把32bit的输入扩展为48bit的输出,

    图4-7  S1部件代换模块仿真图

     

    图4-8  S8部件代换模块仿真图

    然后与第i步的第48bit内部变换子密钥K(i)按位模2相加。接着输出的48bit,被划分为8组,每组6bit,分别加到8个代换部件S1,S2,…,S8上,经查表代换后输出4bit。8个部件共输出32bit,这32bit又经过换位重排,再与变换信号的左半部分L(i-1)按位模2相加,就成为下一步变换信号的右半部分R(i).

    相应的左半部分则为L(i)=R(i-1)。

    其中扩展器的工作原理如下。

    假设32bit的输入为:

                        R=r,r,…,r

    32bit的输入被分为8组,每组4bit,再把每组4bit前后各加一个bit,从而扩展为6bit。每组前面的一个bit是复制上一组扩展前的最后一个bit,后面加的一个bit是复制下一组扩展前的最开始的一个bit。而第一组加的一个bit是扩展前的第32bit,第八组后面加上的一个bit则是扩展前第一组的头一个bit。

    本模块调用了密钥生成模块,它的输出除了左半信号和右半信号,还有密钥信号。在这一轮运算中,密钥产生器产生了一个没有经PC-2重排的56bit的数据(它是由preious_key移位而得)。这个信号会输出给Key_o,作为下轮运算的一个输入,用以产生下一轮运算所需的密钥。

    desround模块核心程序如下:

    key_gen1(.previous_key(previous_key),        ---key_gen 调用

             .iteration(iteration),.decrypt(decrypt),

             .new_key(new_key),.non_perm_key));

    always@(posedge clk or negedge reset)

     begin                         ---L_o、R_o、Key_o产生逻辑

      if(!reset)

      begin

        L_o=(0);

        R_o=(0);

        Key_o=(0);

        end

      else

      begin

        L_o=(R_i);

        R_o=(next_R);

        Key_o=(non_perm_key);

        end

      end

    always@(R_i or L_i or Key_i or iteration_i or decrypt_i or new_key or s1_i or s2_i or s3_i or s4_i or s5_i or s6_i or s7_i or s8_i)

    begin

      R_i_var=R_i;                        --- expandedR产生逻辑

      expandedR[47]=R_i_var[0];

      ……

      expandedR[1]=R_i_var[0];

      expandedR[0]=R_i_var[31];

       previous_key=(Key_i);

      iteration=(iteration_i);

      decrypt=(decrypt_i);

      round_key=new_key;

      KER=expandedR^round_key;

      s1_o=(KER[47:42]);                      --- s1_o产生逻辑

      ……

      s8_o=(KER[5:0]);

      Soutput[31:28]=s1_i;                 --- Soutput、f产生逻辑

       ……

       f[0]=Soutput[7];

      next_R=(L_i^f);

      expanRSig=(L_i^f);

      end

    4.2.5   DES顶层模块des设计

    在DES模型的顶层模块中,实例化了desround模块和8个S代换部件,综合之后各模块之间连接关系:输入密钥key_i、待加密数据data_i的左半信号及右半信号各经过一个两路数据选择器后连接到desround模块的数据输入端(Li[31:0])和密钥输入端(Key_i[55:0])。这里之所以需要数据选择器,是因为模块仅在load_i为高电平时接受外部数据,待加/解密数据和外部密钥通过数据选择器输入到desround模块的数据输入端和密钥输入端。load_i信号持续一个时钟周期以后会变为低电平,在此之后数据选择器将选择输出另一路数据,desround模块每轮变换之后的输出密钥和数据,将被送到desround模块的密钥输入端和数据输出端执行下一轮变换。

    16轮变换结束之后,ready_o会变为高电平,这时整个模块的输出data_o才为有效数据。ready_o信号持续一个时钟周期以后又变为低电平,load_i再次上跳为高电平,模块对下一个明文分组进行加密。

     

    4.3  DES加密方案设计                                                 

    4.3.1  资源优先设计方案

    资源优先方案就是通过硬件设计出一个密钥变换轮函数和一个明文变换轮函数,通过16轮反复调用这一个硬件系统实现一次DES加密运算。由于16轮运算都只占用一轮运算所需的硬件资源,使硬件的开销大大减少。但是,一个时钟周期只能进行一轮加密运算,要完成整个加密过程要花费16个时钟周期,从而在速度性能上大打折扣。而采用循环法实现DES加密算法能达到减少资源占用的目的。

    4.3.2  性能优先设计方案

    性能优先设计方案刚好与资源优先设计方案相反。传统方案是将循环全部打开配合流水线结构进行设计,即将16轮函数进行硬件级联构成一个16级的流水线结构,提前生成16个子密钥,随着流水线的进程发送给相对应的流水级,从而达到16个数据块同时加密的目的。这样,从第一个数据块开始加密起,每一个时钟周期延时都会有一个数据块进行加密,经16个时钟周期延时后,得到最终的密文。流水线结构设计通过一个时钟周期即可进行一个数据块的加密,通过占用资源换取速度性能的提高。  本文通过子密钥的简化和S盒的优化来改进传统的流水线结构,实现一个占用资源少、加密速度快的加密系统。

    (1) 子密钥的简单生成

    由DES加密算法原理可知,一个64bit的初始密钥输入后通过一次压缩变换、移位变换、二次压缩变换后得到第一轮子密钥,其密钥为48bit。由第一轮子密钥变换结果可以看出:第一轮子密钥的第1、2、3、…、46、47、48位分别为初始密钥的第10、51、34、…、62、55、31位。每一轮子密钥产生的方法是一样的,如果采用硬件描述语言按照其子密钥产生的原理一步步地推导出16次DES迭代的密钥,不仅仅是语言表述繁琐,而且占用了很多的硬件资源。同时,由于每一轮子密钥产生的时间并不相同,会给DES密码的迭代运算带来很多不必要的麻烦。

    对密钥变换原理进行分析可以发现,每一轮子密钥的产生只是将初始密钥经过置换和不同次数的循环移位。每一轮循环移位的次数对原始密钥是固定的,其每一位相对于初始密钥的每一位存在着固定的关系,由此可以列出每一轮子密钥与初始密钥之间的关系表,通过关系表采用硬件描述语言可同时产生16轮子密钥。采用此方法大大简化了程序语言、节约了硬件的资源开销。

    (2) S盒的优化

    S盒的设计是DES算法的关键部分, S盒设计的优劣将影响整个算法的性能。S盒是DES加密算法中唯一的非线性函数,S盒的非线性变换使算法达到很好的“混乱”效果,从而具有较强的安全性。

    S盒的原理是输入6bit的数据,其中第1位和第6 位确定行,中间4bit确定列,通过行、列查表确定对应的4 bit的输出。根据S盒的工作原理,可直接使用输入为6变量、输出为4变量的case语句进行描述,构成一个4bit 64个存储空间的表。然而这样的语句虽然可读性很强,但综合的效率往往不高,占用资源过多,速度也比较低,使S盒成为系统速度的瓶颈。

     

     

     

     

    展开全文
  • 深入理解DES加密

    2021-05-29 14:54:09
    每一步详细步骤 大家看时候,把每一个步骤都对着这张图来看。 对64bit明文进行初始置换 根据IP置换表来置换 可能很多人不理解IP置换意思,这些表到底怎么置换,怎么压缩?下面解释 第一个58:就是将第58...

    深入理解DES

    大致步骤

    1. 将明文按bit为分组,每组64bit,最后一组不足的补0
    2. 密钥:56bit的密钥
    3. 用56bit的密钥对64bit的明文加密,每组都这样执行

    每一步详细步骤

    大家看的时候,把每一个步骤都对着这张图来看。

    1. 对64bit明文进行初始置换

      • 根据IP置换表来置换

        可能很多人不理解IP置换的意思,这些表到底怎么置换,怎么压缩?下面解释

        • 第一个58:就是将第58bit放到第一位的意思
        • 第二个50:就是将第50bit放到第二位的意思
        • 以此类推…
        • 此表的作用就是将64bit按照一定的规律进行打乱
    2. 将56bit进行置换选择1

      利用此表置换,跟置换IP一样的流程

      • 将密钥的第57bit放到第一位
      • 将密钥的第49bit放到第二位
      • 以此类推
      • 此表的作用就是将56bit按照一定的规律进行打乱
    3. 将打乱的56bit分成左右两部分,各28bit

    4. 将左右部分各自循环左移,循环左移的位数按照左循环移位位数表来左移

      • 第一轮则循环左移1次
      • 第二轮也是
      • 第三轮则循环2次
      • 以此类推…
    5. 左循环后的56bit将会给到下一轮继续做轮变换

    6. 做循环的56bit经过PC-2置换压缩成48bit

      注意到这张表没有9 18 22 25 35 38 43 54,所以会达到压缩的效果

      • 将第14位放到第一位的位置
      • 以此类推
      • 由于没有9 18 22 25 35 38 43 54,所以会达到压缩的效果
    7. 将之前置换的64bit明文,分成左右两半部分,将右半部分32bit经过E盒拓展成48bit

      置换规则跟之前一样不在阐述

    8. 将6和7的64bit做异或操作 ,再交给S盒作拓展
      S盒的压缩是这样的:

      1. 将48bit分成8组,每一组的6bit都用一个S盒来压缩
      2. 6bit的首末两位用来选择行数,中间四位用来选择列数
      3. 例:101101就是11是行数,0110是列数
      4. 即用Si盒中的第3行第6列来替换调原来的101101,从6bit压缩到4bit
      5. 8组各自用各自的S盒来压缩
      6. 最终变成32bit
    9. 压缩后的32bit用P置换,再跟左32bit异或作下一轮的Ri

    10. 原来的Ri-1作为Li

    再看看这张表,会觉得特别清晰

    展开全文
  • DES加密算法难点总结

    2020-07-27 15:17:41
    之前在实验中学到了DES算法,但是实验手册中对DES的原理讲述不是很清楚,于是我又查了一下资料,详细步骤可见该博客DES算法原理。这篇文章主要对其中一些可能还不太清楚点进行记录。 1.IP变换,PC-1变换意义。...
  • 这篇文章主要介绍了Python Des加密解密如何实现软件注册码机器码,文中通过示例代码介绍非常详细,对大家学习或者工作具有一定参考学习价值,需要朋友可以参考下 原理 判断路径下是否存在识别文件,若存在就...
  • 上一篇文章和大家讲了一下加密算法的...如果真的要去深究DES加密的详细步骤,可能再来几篇文章写也不够,毕竟这种加密算法是经过很多人千锤百炼发明出来的,所以在这里我们就不详细的介绍了。
  • 步骤:unity3D(C#)​//对数据进行DES加密public static String Encrypt(String str){string Key = "98344334";//自行设置,随便8个数字(字母应该也行),作为加密解密密匙byte[] bStr = Encoding.UT...
  • 代码里面都带有详细的注释,首先是三重DES的加密接口,每一步都是细分,步骤特别清晰(Des1.java): package com.zmn.main; /** * @author zhuangmingnan * DES的接口 */ public interface Des1 { ...
  • c语言实现des

    2015-07-08 16:11:45
    DES加密算法,c语言实现。对于每个 64 位长度明文分组加密过程如下: ( 1 )初始置换:输入分组按照初始置换表重排次序,进行初始置换。 ( 2 ) 16 轮循环: DES 对经过初始置换 ...
  • 详细步骤解决小程序解决:为什么添加上面代码就可以解密?拓展参考 目标 java端采用DES/CBC/PKCS5Padding 加密,前端,小程序 js,如何进行加解密。 js解析库下载地址 原版下载地址 二次开发版本 我用是二...
  • linux openssl使用简析

    2015-01-21 10:03:25
    问题:怎么打开openssl加密文件(加密文件为:logs.tar.gz.des) 解决步骤(考虑到公司利益,不能很详细描述有关问题): 1 通过 which openssl命令查看系统是不是安装了 openssl 2 确保系统安装了...
  • 分析了PCI加解密卡软硬件结构和原理,详细介绍了DESX加解密算法原理、步骤和硬件实现、PCI接口模块IP核设计以及USB接口模块电路连接。系统硬件以FPGA为核心,使用QuartusⅡ7.2软件和VHDL语言设计,软件由...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    DES加密算法源代码 如题。 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 如题。 DirectShow开发指南源码 如题。 directUI_D DirectUI界面...
  • asp.net知识库

    2015-06-18 08:45:45
    利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试...
  • Microsoft SQL Server 2005 Express Edition SP3

    热门讨论 2012-03-04 10:55:14
    Windows 加密服务提供程序 (CSP) 是执行身份验证、编码和加密服务代码,基于 Windows 应用程序通过 Windows Server 2003 中 CryptoAPI 访问这些服务。如果停止或禁用 CSP 服务,则 SQL Server 安装程序会失败...
  • 搜集有关渗透测试中用到POC、脚本、工具、文章等姿势分享,作为笔记吧,欢迎补充。 Penetration_Testing_POC 请善用搜索[Ctrl+F]查找 IOT Device&Mobile Phone Web APP 提权辅助相关 PC tools-小工具...
  • PHP开发实战宝典

    热门讨论 2011-12-02 07:34:49
    最后提供5个完整项目实例,详细讲述从前期规划、系统设计,到 项目开发全部实现过程。  本书适合有志于从事软件开发初学者、高校计算机相关专业学生和毕业生,也可作为软件开发人员参考手册,或者高校...
  • 支付模式工作流程包括如下步骤: 1 .支付响应阶段2 .支付请求阶段3 .授权请求阶段4 .授权响应阶段5 正.确支付流初程始顺化序请是求:和(响应阶段 1 ) A . 5-2-3-4-1 B . 2-1-3-4-5 C . 5-2-1-3-4 D ....

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

des加密的详细步骤