精华内容
下载资源
问答
  • 关注+星标公众号,不错过精彩内容编排 |strongerHuang微信公众号|嵌入式专栏今天主要总结下常用对称性加密算法DES和AES,非对称性加密算法RSA。嵌入式专栏1DES...

    关注+星标公众,不错过精彩内容

    编排 | strongerHuang

    微信公众号 | 嵌入式专栏

    今天主要总结下常用的对称性加密算法DES和AES,非对称性加密算法RSA。

    嵌入式专栏

    1

    DES加密算法

    1.DES含义

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。

    DES是对称性加密里常见的一种,是一种使用秘钥加密的块算法。秘钥长度是64位(bit), 超过位数秘钥被忽略。所谓对称性加密,加密和解密秘钥相同。对称性加密一般会按照固定长度,把待加密字符串分成块。不足一整块或者刚好最后有特殊填充字符。

    常见的填充模式有:'pkcs5'、'pkcs7'、'iso10126'、'ansix923'、'zero' 类型,包括DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。

    2. DES算法原理

    DES算法的入口参数:Key、Data、Mode。

    Key为8个字节共64位,是DES算法的工作秘钥;

    Data也为8个字节64位,是要被加密或解密的数据;

    Mode为DES的工作方式,有两种:加密或解密。

      

    3.DES加密原理

    DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。

    使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。

    4.DES算法特点

    分组比较短、秘钥太短、密码生命周期短、运算速度较慢。

    嵌入式专栏

    2

    AES加密算法

    1.AES含义

    AES,高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

    严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;

    而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。包括AES-ECB,AES-CBC,AES-CTR,AES-OFB,AES-CFB。

    2.AES加密原理

    AES加密过程涉及到4种操作,分别是字节替代、行移位、列混淆和轮密钥加。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中16个字节的明文、密文和轮密钥都以一个4x4的矩阵表示。

    3.AES算法特点

    运算速度快,安全性高,资源消耗少

    嵌入式专栏

    3

    RSA加密算法

    1.RSA含义

    RSA加密算法是一种非对称加密算法,这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。

    也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。

    2.RSA算法原理

    在了解RSA算法原理之前,先了解一下非对称加密的过程:

    非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的。公钥用于加密,私钥用于解密。对于非对称的加密和解密为什么可以使用不同的密钥来进行,这些都是数学上的问题了。不同的非对称加密算法也会应用到不同的数学知识。接下来就来看看RSA算法是怎么来对数据进行加密的。

    下面是RSA算法的加密算法流程图:

    3.RSA算法特点

    • 不需要进行密钥传递,提高了安全性

    • 可以进行数字签名认证

    • 加密解密效率不高,一般只适用于处理小量数据(如:密钥)

    • 容易遭受小指数攻击

    常见的几种加密算法先总结到这,如果大家对加密的具体过程感兴趣的话,可以自己上网了解更多算法知识~

    免责声明:本文部分素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

    ------------ END ------------

    推荐阅读:

    精选汇总 | 专栏 | 目录 | 搜索

    精选汇总 | ARM、Cortex-M

    精选汇总 | ST工具、下载编程工具

    关注微信公众号『嵌入式专栏』,底部菜单查看更多内容,回复“加群”按规则加入技术交流群。

    点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

    展开全文
  • 用到软件环境:DES Tool、RSATool、Hash Tool、c/c++编译环境(Dev c++)

    信息加密与哈希函数

    在这里插入图片描述

    DES加密算法

    • DES是分组对称密码算法,采用64位的分组长度和56位的密钥长度,将64位的输入(明文)经多次替换算法和换位算法、分散和错乱的相互作用得到64位的输出(密文),它的加密和解密用的是同一种算法。

    • DES实现对字符串加密、解密(上半部分);同样的,DES也可以用于对文件的加密、解密(下半部分)

    • 图示字符串加密解密步骤: 输入密钥1:哈哈 写一句话明文,点击”加密“得到密文;把你的密文和密钥发给朋友,他可以通过DES 工具解密得到明文

    • 为了更好的理解64位为一个分组长度,我们以同一个字多次重复作为明文,可以看到: 密钥1:哈哈 密文:啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

    • 3DES 加密算法: 3DES 即三重数据加密算法,通过增加DES的密钥长度来避免暴力破解。
    • 3DES 标准定义了3种密钥选项:
      密钥选项1:3个密钥(key)独立(密钥长度=3 x 56 = 168个独立的密钥位)
      密文=EK3(DK2(EK1(明文))),明文=DK1(EK2(DK3(密文)))
      即:3DES使用3个密钥,对明文先使用key1进行des加密形成密文1,接着使用key2对密文1进行解密形成密文2,最后使用key3对密文2进行加密形成密文3。
      密钥选项2:K1和K2是独立的,而K3=K1(密钥长度=2x 56 = 112个独立的密钥位)
      密钥选项3:等同于DES,只有56个密钥位(该选项不再为国家标准科技协会(NIST)所建议,亦不为ISO/IEC 18033-3所支持)

    MD5算法

    • 英文名:Message Digest Algorithm V5。
    • 中文名:消息摘要算法第五版。 算法的输入:任何长度的字节流。
    • 算法的输出:16字节值(有时会以32位十六进制字符表示)。
    • 算法特点:加密过程不需要密钥,加密后的数据无法被解密。只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。所以不存在密钥的管理与分发问题。
    • 算法流程:相当复杂。 算法应用:文件一致性验证、数字证书、访问认证。
    • https://cmd5.com/ 该网址用于对MD5密文解密
    • Hash Tool计算文件MD5值、SHA1值,可以尝试在文件中增加细微修改,如:加一个空格,再次导入文件,查看结果的区别
      在这里插入图片描述

    RSA算法

    • RSA算法流程:
      密钥生成方法
      1、随机生成两个大的质数p和q,p不等于q,计算N=pq。
      2、根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)。
      3、任意选定一个整数e(e不是必须为质数),要求e与(p-1)(q-1)互质,且e小于(p-1)(q-1)。
      4、通过公式d×e ≡ 1 (mod (p-1)(q-1))来计算d。
      5、将p和q销毁。
      6、此时,(N,e)作为公钥使用,(N,d)作为私钥使用。
      密钥使用方法
      1、接收方在本地生成一对公钥(N,e)和私钥(N,d)。
      2、接收方将公钥(N,e)发布到公共空间中,自己留存私钥(N,d)。
      3、想要给接收方发送数据的人通过公钥加密数据。
      4、接收方收到加密数据后通过私钥解密。
    • 配合RSA Tool 进行理解
    • 点击start并滑动鼠标,进度条跟随鼠标加载
    • 点击generate生成公钥(E)、私钥(D),N=P*Q(P、Q是两个大质数)
    • 点击Test,将明文写在上方文本框,点击Encrypt加密;若想解密先要随便输入明文解密,再用你要解密的密文覆盖下方文本框内容,点击Decrypt解密(激活Decrypt按钮)
    • 发送方a和接收方b:b把公钥(N,E)发送给a,自己留着私钥(N,D),销毁P、Q;a用b的公钥对要发送的明文加密,a收到密文后,用自己的私钥进行解密。反之相同,公钥发送到公共空间,私钥只有自己知道,相对安全。
      -在这里插入图片描述
      在这里插入图片描述
    展开全文
  • Project 1-1: 6轮DES的编程实现 14307130356 卢颖 1. 目录结构 + DES ├── README.md # 说明文档 ├── 说明文档.pdf # 说明文档(README.md内容相同) ├── index.html # DES主页 ├──...
  • 概述数据在存储传输过程中,可能会面临被窃听...这里我学习了生产中常用三种加密算法,MD5、3DESRSA。1. MD5MD5,全名Message Digest Algorithm 5,是一种摘要算法,通过内置hash算法将信息摘要成为定长

    概述

    数据在存储和传输的过程中,可能会面临被窃听、篡改等风险。同时,还可能有人伪装成为客户端进行破坏性的操作,因此为了保证数据的机密性、完整性、不可否认性、认证功能,我们通常对数据的存储和传输进行加密。这里我学习了生产中常用的三种加密算法,MD5、3DES、RSA。

    1. MD5

    MD5,全名Message Digest Algorithm 5,是一种摘要算法,通过内置的hash算法将信息摘要成为定长的十六进制字串。

    具体算法:
      1.数据填充:在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。
      2.增加长度信息:果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
      3.hash算法:四个链接变量,四个循环运算
      4个常数:
        A = 0x67452301,
        B = 0x0EFCDAB89,
        C = 0x98BADCFE,
        D = 0x10325476;
      将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。 主循环有四轮,每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量(文本中的一个子分组和一个常数)。
      再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。 以一下是每次操作中用到的四个非线性函数(每轮一个)。
        F(X,Y,Z)=(X∧Y)∨(( X)∧Z)
        G(X,Y,Z)=(X∧Z)∨(Y∧( Z))
        H(X,Y,Z)=X?Y?Z
        I(X,Y,Z)=Y?(X∨( Z))
        其中,?是异或,∧是与,∨是或, 是反符号。
      如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。所有这些完成之后,将A,B,C,D分别加上a,b,c,d。然后用下一分组数据继续运行算法,最后的输出是A,B,C和D的级联。最后得到的A,B,C,D就是输出结果,A是低位,D为高位,DCBA组成128位输出结果(32位16进制)。

    技巧: 接口提供和接口使用双方同样可以约定秘钥(key),尽管MD5没有使用特定key加密的方法,
    但是如果双方都在加密前的明文末尾加上这个key,然后再去加密,也可以起到秘钥的作用。
    

    2. 3DES

      DES是Data Encryption Standard(数据加密标准),DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。它的密钥长度是56位(因为每个第8 位都用作奇偶校验),密钥可以是任意的56位的数,所以保密性依赖于密钥。

    DES加密的算法框架如下:
      首先要生成一套加密密钥,从用户处取得一个64位长的密码口令,然后通过等分、移位、选取和迭代形成一套16个加密密钥,分别供每一轮运算中使用。DES对64位(bit)的明文分组M进行操作,M经过一个初始置换IP,置换成m0。将m0明文分成左半部分和右半部分m0 = (L0,R0),各32位长。然后进行16轮完全相同的运算(迭代),这些运算被称为函数f,在每一轮运算过程中数据与相应的密钥结合。
      在每一轮中,密钥位移位,然后再从密钥的56位中选出48位。通过扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的48位数据,再将其压缩置换成32位。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次。
    经过16轮迭代后,左,右半部分合在一起经过一个末置换(数据整理),这样就完成了加密过程。
    加密流程如图所示:
    这里写图片描述

    3. RSA :

      与DES不同,RSA算法中,每个通信主体都有两个钥匙,一个公钥一个私钥。就是有2把钥匙:使用publicKey可以对数据进行加密,使用私钥才能对数据进行解密。
    算法原理参见:
    http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
    http://blog.csdn.net/sunmenggmail/article/details/11994013

    对以上三个加密算法进行的简单的使用测试,代码如下:

    import java.io.UnsupportedEncodingException;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.util.HashMap;
    import javax.crypto.Cipher;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    import sun.misc.BASE64Encoder;
    
    public class TestEncrypt {
    
        public static BASE64Encoder encoder = new BASE64Encoder();  
        public static void main(String[] args) throws Exception {
    
            String string = "hahahahahahahaaldsfangnaKCFAK";
            System.out.println("加密前长度"+string.length());
            String paramKey = "addf";
    
            testMD5(string);
            testDes(string, paramKey);
            testRSA(string);
    
        }
    
        public static void testMD5(String string) {
            byte[] bytes = string.getBytes();
            String sign = MD5EncoderMethod(string);
            System.out.println("MD5十六进制摘要:"+sign+"---->>> length ::"+ sign.length());
            System.out.println();
    
        }
    
        public static String MD5EncoderMethod(String string) {
    
            MessageDigest md5 = null;
    
            try {
                md5 = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            byte[] bytes = string.getBytes();
            byte[] md5Bytes = md5.digest(bytes);
    
            System.out.println("md5.digest后:"+encoder.encode(md5Bytes)+"---->>md5.digest byteArray.length:"+md5Bytes.length);
    
            StringBuffer hexValue = new StringBuffer();
            for (int i = 0; i < md5Bytes.length; i++) {
                int val = ((int) md5Bytes[i]) & 0xff;
                if (val < 16) {
                    hexValue.append("0");
                }
                hexValue.append(Integer.toHexString(val));
            }       
            return hexValue.toString();
        }
    
        public static void testDes(String string, String paramKey) throws Exception {
            try {
                Cipher cipher = Cipher.getInstance("DESede");
                SecretKey sKey = new SecretKeySpec(build3DesKey(paramKey), "DESede");
                cipher.init(Cipher.ENCRYPT_MODE, sKey);
                byte[] bytes = cipher.doFinal(string.getBytes());
                System.out.println("DES加密后:"+encoder.encode(bytes)+"  ——————》DES加密后长度:"+bytes.length);
                cipher.init(Cipher.DECRYPT_MODE, sKey);
                System.out.println("DES解密后: "+new String(cipher.doFinal(bytes)));
                System.out.println();
            } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
                e.printStackTrace();
            }
        }
    
        public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException {
            final byte[] key = new byte[24]; // 声明一个24位的字节数组,默认里面都是0
            final byte[] temp = keyStr.getBytes("UTF-8"); // 将字符串转成字节数组
    
            /*
             * 执行数组拷贝 System.arraycopy(源数组,从源数组哪里开始拷贝,目标数组,拷贝多少位)
             */
            if (key.length > temp.length) {
                // 如果temp不够24位,则拷贝temp数组整个长度的内容到key数组中
                System.arraycopy(temp, 0, key, 0, temp.length);
            } else {
                // 如果temp大于24位,则拷贝temp数组24个长度的内容到key数组中
                System.arraycopy(temp, 0, key, 0, key.length);
            }
            return key;
        }
    
        public static void testRSA(String string) {
            try {
                Cipher cipher = Cipher.getInstance("RSA");
                HashMap<String, Object> keMap = getKeys();
                RSAPublicKey pubKey = (RSAPublicKey) keMap.get("public");
                System.out.println(pubKey.toString());
                RSAPrivateKey priKey = (RSAPrivateKey) keMap.get("private");
                System.out.println(priKey.toString());
                cipher.init(cipher.ENCRYPT_MODE, pubKey);
                byte[] bytes = cipher.doFinal(string.getBytes());           
                System.out.println("RSA公钥加密后的字符串::"+encoder.encode(bytes)+" --->>加密后长度"+bytes.length);
    
                cipher.init(Cipher.DECRYPT_MODE, priKey);
                bytes = cipher.doFinal(bytes);
                System.out.println("RSA私钥解密后的字符串::"+new String(bytes,"UTF-8")+" --->>解密后长度"+bytes.length);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 生成公钥和私钥
         */
        public static HashMap<String, Object> getKeys() throws NoSuchAlgorithmException {
            HashMap<String, Object> map = new HashMap<String, Object>();
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            keyPairGen.initialize(1024);
            KeyPair keyPair = keyPairGen.generateKeyPair();
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            map.put("public", publicKey);
            map.put("private", privateKey);
            return map;
        }
    
    }
    

    测试输出
    这里写图片描述

    展开全文
  • 一、概述 说到数据安全,必然少不了加密与解密,本章介绍常用加密原理。 二、常用加密算法 1.加密算法分类 常见加密算法可以分成三类,对称加密算法,非对称... 常见对称加密算法有DES、3DES、Blowfis...

    一、概述

      说到数据安全,必然少不了加密与解密,本章介绍常用加密原理。

    二、常用加密算法

    1.加密算法的分类

      常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法。

    1)对称加密算法

      指加密和解密使用相同密钥的加密算法。优点在于加/解密速度快和使用长密钥时的难破解性,缺点是只有一个密钥,容易泄漏。

      常见的对称加密算法有DES3DESBlowfishIDEARC4RC5RC6AES

    2)非对称加密算法

      指加密和解密使用不同密钥的加密算法,也称为公私钥加密。优点在于加/解密使用不同密钥,只需要保存好私钥,公钥可以公开,缺点是解密解密速度慢。

      常见的非对称加密算法有:RSAECC(移动设备用)、Diffie-HellmanEl GamalDSA

    3Hash算法

      Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

    常见的Hash算法有MD2MD4MD5HAVALSHASHA256等。

      加密算法的效能通常可以按照算法本身的复杂程度、密钥长度(密钥越长越安全)、加解密速度等来衡量。上述的算法中,除了DES密钥长度不够、MD2速度较慢已逐渐被淘汰外,其他算法仍在目前的加密系统产品中使用。

      实际应用中,根据不同的使用场合选用不同的算法。

    2.RSA加密算法

    1)概念

      RSA(发明此算法的三个人的名字的首字母)是一种公钥密码体制,现在使用得很广泛。

      作为一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。 由公钥加密的内容可以并且只能由私钥进行解密,并且由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密。

    2)算法基本原理

    Ø公钥与私钥的产生

      假设A想要通过一个不可靠的媒体接收B的一条私人消息。他可以用以下的方式来产生一个公钥和一个私钥:

    1)随意选择两个大的素数pqp不等于q,计算N=pq

    2)根据欧拉函数,求得                         

    3)选择一个小于r的整数e,使er互质。并求得e关于r的模逆元,命名为d  模逆元存在,当且仅当er互质)。

    4)将pq的记录销毁。

    (N,e)是公钥,(N,d)是私钥。A将他的公钥(N,e)传给B,而将B的私钥(N,d)藏起来。

    Ø加密消息

      假设B想给A送一个消息m,他知道Ne。他使用起先与A约好的格式将m转换为一个小于N的非负整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c

        B算出c后就可以将它传递给A

    Ø解密消息

      A得到B的消息c后就可以利用他的密钥d来解码。他可以用以下这个公式来将c转换为n

      得到n后,他可以将原来的信息m重新复原。解码的原理是:

    3RSA算法安全性

      只要上面提到的N足够大,就很难找到一种简单的方法对这么大的一个数进行因试分解,从而无法破解,黑客无法破解。

      针对RSA最流行的攻击一般是基于大数因数分解:

      1999年,RSA-155 (512 bits)被成功分解,花了五个月时间和224 CPU hours在一台有3.2G中央内存的Cray C916计算机上完成。

      20091212日,编号为RSA-768768 bits, 232 digits)数也被成功分解。这一事件威胁了现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上。

    4RSA算法应用

      RSA可以用来为一个消息署名。假如Alice想给Bob传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的私钥“加密”(如同前面“加密消息”的步骤)这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。Bob获得这个消息后可以用Alice的公钥“解密”(如同前面“解密消息”的步骤)这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么Bob就可以知道发信人持有Alice的私钥,以及这个消息在传播路径上没有被篡改过。

      上述的散列值一般是hash值,这个值的获取可以通过shamd5等算法获取,后面会详细介绍。

    总结

    1. 通过上面的介绍,我们常用的CRC,Hash(MD5,SHA)等算法常应用于数据的校验,它们都是不可逆的,即通过校验码或信息摘要无法得到明文,但是由明文可以得到校验码或信息摘要。

    2. CRC常应用于数据量比较少的地方,比如数据通信过程中,发送方会先计算出校验码,然后把校验码和通信数据一起发给接收方,接收方根据原始数据算出校验码并与接收方发来的校验码进行比较,如果相等,代表通信过程中数据没有发生过翻转或其他改变,保证了通信质量。

    3. Hash校验常应用于数据量比较大的场合,比如Linux发行方会把Linux系统镜像和MD5值(现在已经不算最安全的)挂到官网上,用户下载后进行MD5校验,这样保证Linux系统镜像为官方提供,没有被篡改,保证了数据的完整性。

         3.1 常见的用户名密码存储方式

               我们都知道,用户名密码是不能按照明文的方式存储在数据库中的,一般来说,用户在一个网站上注册了用户名和密码后,网站系统先把用户的登陆密码进行hash计算并得到一个hash值,让后把这个hash值存储到服务器数据库中,并不会存储用户密码。当用户登陆网页时,输入了密码后,系统也会根据用户输入的密码生成一个hash值,系统根据这个hash值,在服务器数据库中根据用户名搜索,如果此用户名对应的hash值与此时他输入的密码的hash值匹配,那面认证通过,可以登陆系统。

               通过这样的方式,用户的密码实际上只有用户自己知道,网站系统也并没有存储密码明文,而是只存储了用户密码的hash值,即使网站服务器里的数据库丢失,那面别人拿到数据库后,也不能通过这些hash值推断出用户密码,因为加hash算法是不可逆的。这里为了说明原理,派出了暴力破解的情况。

    4. 假如用户登陆了钓鱼网站,不怀好意的人把有病毒的Linux映像挂到网上,并且用这个映像生成了对应的MD5码,用户下载后,自己用映像生成的MD5码和钓鱼网上提供的MD5肯定是匹配的,用户就以为这个映像没问题,实际上是有问题的。如何避免这样的情况呢?就是再次应用上述的RSA算法对官方提供的MD5信息摘要进行数字签名,这样不但保证了数据的完整性,还保证了数据来源的正确性。因为只有官方提供的公私钥才能对数字签名进行解密得到官方的MD5信息摘要,别人没办法仿照。

    三、Openssl应用

      前面介绍了一下密码学的一些基本知识,本小节介绍前面理论知识的实际应用。

    1.Openssl基本概念

      OpenSSL是一个开源的安全工具包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。

      OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台性能,因此它支持Linux平台。

    2.Openssl的信息摘要和数字签名

    1)信息摘要,即对数据进行处理,得到一段固定长度的结果,有如下特性:

    输出长度固定。即输出长度和输入长度无关。

    不可逆。即由输出数据理论上不能推导出输入数据

    对输入数据敏感。当输入数据变化极小时,输出数据也会发生明显的变化

    防碰撞。即不同的数据得到相同输出数据的可能性极低。

      由于信息摘要有上述特点,一般保证数据的完整性,对一个大文件进行摘要运算,得到其摘要值。通过网络或者其他渠道传输后,通过验证其摘要值,确定大文件本身有没有发生变化。

      目前openssl提供的摘要算法有md4md5ripemd160shasha1sha224sha256sha512sha384wirlpool。也就是说可以通过上述算法获取上面提到的信息摘要。算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同),因此md5sha1已经被我国中科院院士王小云在05年就破解了,所以我们监控用的sha256算法计算信息摘要。

      这些算法可以通过Linux命令“openssl dgst”命令查看。

    2)数字签名

      对原始文件进行数字签名主要分为两步,首先对原始文件进行摘要运算,得到摘要值,然后使用公开密钥算法中的私钥对摘要值进行加密。其签名和验证过程如下图(下图是网上找的):

     

    3)数字签名流程

    假定用户userA,要给用户userB,发送信息 SMS ;

    userA 先生成自己的公钥(PubKey)和密钥(PriKey),常用的算法有 RSA,DSA;

    userA 对信息 SMS 做信息摘要处理得到 SHA256_SMS , 常用的摘要算法详见前面openssl dgst命令查询结果;

    userA 用自己的密钥 PriKey 加密信息摘要 SHA256_SMS 得到 ENC_SHA256_SMS,即数字签名;

    userA ENC_SHA256_SMS 数字签名 、自己的公钥 PubKey 以及原数据 SMS 一起发送给 userB;

    userB 用同样的摘要算法对 SMS 处理得到 userB_SHA256_SMS

    userB userA的公钥 PubKey 解密数字签名ENC_SHA256_SMS 得到 userB_DEC_SHA256_SMS;

    userB 去比较 userB_DEC_SHA256_SMS userB_SHA256_SMS 是不是相同的,如果相同那么确认数字签名是userA发的,并且数据安全没有被篡改。

      这样体现了数字签名的两个特性:一是不可冒充,别人假冒不了(因为没有私钥);二是可以保证数据的完整性(因为内容改变信息摘要也改变)

    4)数字证书

      数字签名已经很完美,用公钥能够解密,说明确实是私钥方发送的,这样很放心……

      但如果,万一这把公钥本身,就被人做了手脚???

      为了保证“公钥”是可信的,数字证书应运而生。

      数字证书里有个重要概念,CA,发送方先把自己的公钥给CACA对其进行加密得到加密后的发送方公钥(用的是CA的私钥和CA加密算法),也就是CA的数字证书。

      注意这里有两个不同的非对称算法(对应2个公钥私钥对),一个算法是发送方加密摘要的,用于生成数字签名;另一个算法是CA加密发送方公钥的,用于生成数字证书。两个算法相互独立,没有必然联系。

      发送时不仅发送内容、数字签名,还包含发送方的数字证书。接收方拿到后,首先从数字证书中解密出发送方公钥(用的是CA的公钥和CA解密算法),这个公钥必然是可信的。然后就是和前面一样的流程,拿发送方公钥去解密数字证书,得到摘要;最后比对摘要是否一致。

    一个问题:既然数字证书是为了保证发送方公钥不是别人伪造的,那怎么保证“CA”的公钥不是伪造的呢?

    答:CA是第三方机构,CA公钥是公开的,接收方可以跟别人比对(比如在网上查询),因此不可能伪造。但是发送方公钥,接收方是通过通信得到的,收到后无法验证。

    展开全文
  • DES+RSA密码工具(图形界面)

    千次阅读 2018-06-12 08:59:41
    1、实验环境:框架脚本:Python3.5UI设计脚本:Wxpython4.0.1平台:Win102、...(2)RSA加密解密 3、实验目的:(1)理解对称加密算法的原理和特点(2)理解DES算法的加密原理使用模式(3)了解非对称加密机制(4...
  • RSA,MD5,DES,Base64这几种加密算法项目中均有用过。网上多是某一算法实现代码,或者某一算法原理加实现。比较全面比较少,所以我整理下常用加密算法原理做下搬运工。 RSA算法原理(简单易懂) 1. 什么是RSA ...
  • 原址 1.RSA加解密原理 第1步:ipB先给A发送B公钥,ipA用B公钥加密A公钥发送给ipB,ipB拿到后,用B私钥...2.RSA和DES混合加密技术阐述 <1>.对称加密(DES)是加密解密秘钥相同 <2>.非对称加密(RSA)是...
  • md5,desrsa算法

    2013-06-19 11:12:05
    Digest Algorithm 5,MD5将任意长度“字节串”变换成一个128bit大整数,并且它是一个不可逆字符串变换算法,换句话说就是,即使你看到源程序算法描述,也无法将一个MD5值变换回原始字符串,从数学原理上...
  • 包含对RSA和DES的简介,原理分析。并分别用C/C++、Java加以实现,给出了运行结果截图。
  •  MD5全称是Message-Digest Algorithm 5,在90年代初由MIT计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。  MD5将任意长度“字节串”变换成一个128bit大整数,并且它是一个
  • 数字信封加密技术(RSA和DES结合起来算法)这种算法结合了DES和RSA两种算法优点于一身原理为:!.发送者利用DES密钥对重要数据进行加密2.发送者利用RSA公钥对DES密钥进行加密3.传送消息4.接收者收到消息后,利用...
  • java c# 下的RSA+AES+DES加解密实现 前言 在实际应用中,经常有需要使用加解密的情况,RSA\AES\DES是...再通过RSA+DES解密返回的实现方式(如果需要了解几种加密方式的原理的同学请参考来自一位美女同学推荐的学...
  • 2009年注会新制度《税法》考试试题及...充分发挥了DES和RSA两种加密体制优点 原理为: !.发送者利用DES密钥对重要数据进行加密 2.发送者利用RSA公钥对DES密钥进行加密 3.传送消息 4.接收者收到消息
  • 数字信封加密技术(RSA和DES结合起…

    千次阅读 2014-10-21 22:06:17
    这种算法结合了DES和RSA两种算法优点于一身 原理为: !.发送者利用DES密钥对重要数据进行加密 2.发送者利用RSA公钥对DES密钥进行加密 3.传送消息 4.接收者收到消息后,利用RSA私钥对经过加密DES密钥进行解密 5....
  • 实验一:RSA公钥密码体制实现 1.实验目的 RSA公钥密码体制实现 ...这些参数中,公开有 n e,保密有 p、q d。 设明文分组 m,则加密算法为 c≡m^e mod n 对密文分组 c 的的解密算法为 m≡
  • 首先声明,不包含原理讲解,只有实现。 DES #!/usr/bin/env python3 # -*- coding: utf-8 -*- import random #Initial Permutation Array IP1 = ( 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12...
  • 公用密钥算法(通常为 RSA)是用来获得加密密钥交换数字签名,此算法使用服务器SSL数字证书中公用密钥。有了服务器SSL数字证书,客户端也可以验证服务器身份。SSL 协议版本 1 2 只提供服务器认证。...
  • 对称加密:对文件加密解密采用都是同一个密钥,有IDEA和DES两种加密算法 非对称加密:有一对公钥私钥 如果我们使用公钥加密,必须得用私钥解密;如果使用私钥加密,则必须使用公钥解密。 当使用加密...
  • MD5 RSA DES

    2013-01-10 14:52:00
    MD5全称是Message-Digest Algorithm 5,在90年代初由MIT计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。  MD5将任意长度“字节串”变换成一个128bit大整数,并且它是一个不可逆...
  • DES加密与解密原理及C++代码实现

    万次阅读 多人点赞 2019-08-17 20:21:13
    对称性:DES是对称,也就是说它使用同一个密钥来加密解密数据。与此相对RSA加密算法,是一种非对称加密算法 分组性:DES还是一种分组加密算法,该算法每次处理固定长度数据段,称之为分组。DES分组大小是...
  • 1、 实验环境: ...开发环境:Python3.5、Wxpython4.0.1、Win10 2、 界面截图 ...(1)理解对称加密算法的原理和特点 (2)理解DES算法的加密原理使用模式 (3)了解非对称加密机制 (4)理解RSA算法的加密原理
  • RSA、SHA、DES、MD5、BASE64的可逆性分析RSASHADESMD5BASE64 ...RSA的全称是Secure Hash Algorithm(安全哈希算法)。SHA是一种摘要算法,原理是将一段明文以一种不可逆的方式将它转换成一段密文(通常会更小),又称
  • 原理:python 利用迭代器读取大文件,然后通过rsa和des混合加密算法对数据进行加密。des是对称性加密算法,rsa是非对称性加密算法。des对文件加密,通过rsades的key进行加密。解密时用rsa解密key,然后key解密文件...
  • MD5、RSADES的解析

    千次阅读 2007-11-29 14:27:00
    MD5全称是Message-Digest Algorithm 5,在90年代初由MIT计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。 MD5将任意长度“字节串”变换成一个128bit大整数,并且它是一个不可逆...
  • MD5将任意长度“字节串”变换成一个128bit大整数,并且它是一个不可逆字符串变换算法,换句话说就是,即使你看到源程序算法描述,也无法将一个MD5值变换回原始字符串,从数学原理上说,是因为原始字符...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 239
精华内容 95
关键字:

des和rsa的原理