• 浅析MD5与AES加密


    一、MD5

      MD5全称为信息-摘要算法(哈希算法),是计算机安全领域的散列函数,用于确保消息的完整性。另外摘要算法还有SHA1,具体请度娘。

      MD5是一种单向加密,它的加密不可逆,它将任意长度的字符串,经过算法计算后生成固定长度的数据,一般为16位表示

    1、MD5的用途:

    (1)消息完整性:每份数据生成的MD5码不同,所以可以把MD5码和数据一块发送,在对端使用MD5加密对数据加密在与接收的MD5码做对比,保证数据的正确性。

    (2)安全访问认证:常被用到 mysql 和传递用户账户信息和密码,从用户端发送到服务器的只是一段128位的摘要,服务器拿到后直接将其存入数据库,下次登录只需与服务器的密文进行对比即可,这样保护了用户的信息,即便是后台人员也无法去获取用户的账户密码。

    2、数字签名:MD5生成代码

        public static String encryption(String plainText) {
            String re_md5 = new String();
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                md.update(plainText.getBytes());
                byte b[] = md.digest();
                int i;
                StringBuffer buf = new StringBuffer("");
                for (int offset = 0; offset < b.length; offset++) {
                    i = b[offset];
                    if (i < 0)
                      i += 256;
                    if (i < 16)
                        buf.append("0");
                    buf.append(Integer.toHexString(i));
                }
                re_md5 = buf.toString();
            } catch (NoSuchAlgorithmException e) {
              e.printStackTrace();
            }
            return re_md5;
        }

      看知乎:https://www.zhihu.com/question/22311285

      上面说MD5其实不算是一种加密算法,用处大多在文件的是否完整,和密码的保护上,更多详情查看大神解析。

    3、项目应用:

      在文件传输项目中,就通常使用MD5用于保证用户的消息完整性,和用户账户密码的保护。

      在客户端,使用MD5将用户的账户和密码,进行MD5加密,传递给服务器,服务器将其与服务器所保存的MD5进行对比,如果比配就将用户自己的界面返回给用户,然后进行数据的传输,也是使用MD5,在对端对数据进行加密,匹配查看数据是否完整。

    二、其他加密算法

      非对称加密:包括RSA DSA RCC,非对称加密是相比对称加密而言的。

      对称加密:包括AES,DES,3DES

      两者的关系:对称加密是在加密前双方都应该知道加密算法和密钥,而且密钥相同。比如:A和B实现约定使用的加密算法和解密密钥,然后进行数据传输。

      非对称加密是双方各自产生自己的密钥,然后将自己的加密密钥传递给对方,在使用时先给数据使用对方的加密密钥加密,发送给对方后,各自使用自己的解密密钥来解密数据。

      不过对称加密解密速度慢,安全性能高;非对称加密速度快,安全性能不高,所以经常使用非对称加密传递对称加密的密钥,然后使用对称加密来加密传递的数据。

    三、AES:

    1、简介

      高级加密标准(AES  -  Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。

      对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:

      下面简单介绍下各个部分的作用与意义:

    (1)明文P:没有经过加密的数据。

    (2)密钥K:用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。

      密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。

    (3)AES加密函数:

      设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。

    (4)密文C:经加密函数处理后的数据

    (5)AES解密函数:

      设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。

    2、对称加密算法与非对称加密算法的区别

    (1)对称加密算法

      加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。

      缺点是密钥的传输比较麻烦。

    (2)非对称加密算法

      加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。

      优点是密钥传输方便。

      常见的非对称加密算法为RSA、ECC和EIGamal。

    (3)实际中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。

    3、AES的基本结构

      在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

    AES密钥长度(32位比特字)分组长度(32位比特字)加密轮数
    AES-128 4 4 10
    AES-192 6 4 12
    AES-256 8 4 14

      AES加密是一种分组加密,他将明文划分一组一组的,每组明文长度相等,一次加密一组明文,直到全部加密,分组长度为128位(16字节),明文长度不足的进行填充

      AES加密是字节加密,使用时要转成字节码。明文分组用字节单位的正方形矩阵表示,一般称为状态矩阵。

      128位会进行10轮加密,一轮加密步骤:字节代换,行位移,列混合,轮密钥加。在最后一轮不进行列混合;解密反过来,分为轮密钥加,逆列混合,逆行位移,逆字节代换,第一步不进行逆列混合。

      AES加密的内容详见这篇博客:https://blog.csdn.net/qq_28205153/article/details/55798628

      关于AES加密的一些内容,也可以见之前的博客:从nodejs的AES加密解密之后文件大小不一致的问题谈谈AES加密中的补位nodejs大文件分片加密解密

  • 相关阅读:
    Drawable、Bitmap、byte[]之间的转换
    关于java.lang.IllegalArgumentException: View not attached to window manager 错误的分析
    Android ListView使用BaseAdapter与ListView的优化
    Ubuntu, using svn from terminal
    Ubuntu 12.04(64位)上搭建android 开发环境 (ADT 、android-studio)
    Widget改变大小
    android4.0中实现AppWidget集合
    android 中 AppWidget 的 ListView 的实现
    解决IllegalStateException: Can not perform this action after onSaveInstanceState
    Drawable和Bitmap转换
  • 原文地址:https://www.cnblogs.com/goloving/p/14887159.html
Copyright © 2020-2023  润新知