一些密码算法

古典密码

凯撒密码

简单的字母移位 安全性太差、易破解,位移数字取值{0-25}

单表代换密码

对字母表中的每一个字母用别的字母代替形成密文

对称密码算法

DES

  • 第一个被公布出来的标准算法,目前逐步被AES算法替代
  • 采用对称分组密码体制
  • 该算法加密解密用同一算法。对密钥进行保密,而公开算法,包括加密和解密算法。因此,破译DES加密算法实际上就是搜索密钥的编码。

DES算法原理 DES块长度为64位,密钥表面上为64位,其实只有56位用于算法 ,即有效密钥长度为56位。 自身不是加密的实用手段,必须以某种工作模式进行实际操作。 ……

AES

密码学中的高级加密标准,用来替代原先的DES AES采用对称分组密码体制,数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个

AES加密算法有五种工作模式(加密模式),根据数据加密时每个加密区块间的关联方式划分,包括ECB,CBC,CFB及OFB。可参见 AES五种加密模式

SM4

无线局域网标准的分组数据算法。SM4是一个分组对称密钥算法,明文、密钥、密文都是16字节,加密和解密密钥相同。 国家密码局认定的国产密码算法

非对称密码算法

RSA

参见阮一峰 RSA算法原理一 RSA算法原理二

  • 公钥用于加密,私钥用于解密
  • 原理基于 对于两个大素数的乘积的分解十分的困难!

—–数学乃万物之源呐

RSA签名

  • 签名要用用户的私钥
  • 验证要用用户的公钥

签名过程:

  • 使用MD5等散列算法生成消息摘要
  • 使用RSA算法,用私钥对摘要进行加密

验证过程:

  • 使用RSA算法,用公钥对传送的签名进行解密
  • 使用MD5对原消息进行散列生成摘要,比较两个摘要异同

DSA

DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换, 只用于签名,它比RSA要快很多. 私钥签名,公钥验证

SM2

该算法基于ECC,签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。 国家密码局认定的国产密码算法

ELGamal

加解密速度快,比RSA稍快.

哈希算法

MD5

全名Message Digest Algorithm 5 ,中文名为消息摘要算法第五版,主要是通过特定的hash散列方法将文本信息转换成简短的信息摘要,压缩+加密+hash算法的结合体,是绝对不可逆的。产生一个128位的散列值。具体算法有点复杂,主要步骤如下。

  • 填充
  • 记录信息长度
  • 装入幻数
  • 四轮循环计算

MD5 主要用于一致性检验、数字证书、安全访问认证(密码的验证,无需明文密码即可验证)

理论上MD5加密是绝对不可逆的一种算法,但是有一些收集海量信息的数据库,根据已知的对应关系找到原始信息。如 CMD5 PMD5 部分简单的数据还是可以查找得到的,但是有的数据需要付费!

md5 Java实现 > Java中,在包java.security有个MessageDigest类。使用其中的update 方法和digest 进行数据处理。 但因为digest()返回值16字长度的哈希值,要由byte[]承接,为了方便还要转换为十六进制的字符串。此处提供两种转换方法。

import java.math.BigInteger;
import java.security.MessageDigest;

public class Md5 {

    public static void main(String[] args) {
        try{
            MessageDigest md5 = MessageDigest.getInstance("MD5");//申明使用MD5算法
            md5.update("hhhhhhh".getBytes());
            System.out.println("md5(hhhhhhh)="+byte2str(md5.digest()));
            md5.update("fenghuayu".getBytes());
            System.out.println("md5(fenghuayu)="+bytesToHex2(md5.digest()));
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 将字节数组转换成十六进制字符串
     */
    private static String byte2str(byte []bytes){
        char[] hex = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        int len = bytes.length;
        StringBuffer result = new StringBuffer();
        for (int i = 0; i < len; i++) {
            byte byte0 = bytes[i];
            result.append(hex[byte0 >>> 4 & 0xf]);
            result.append(hex[byte0 & 0xf]);
        }
        return result.toString();
    }

    /**
    * 通过java提供的BigInteger 完成byte->HexString
    */
    private static String bytesToHex2(byte[] md5Array) {
        BigInteger bigInt = new BigInteger(1, md5Array);
        return bigInt.toString(16);
    }
}

md5 php实现

php的函数库中有封装好的MD5函数,返回值即为32位的十六进制数

	print_r(md5("fenghuayu"));

SHA1

SHA1算法对于长度小于2^64位的消息,产生一个160位的消息摘要。 比MD5慢一点但是安全性高一点。

SM3

国家密码管理局颁布的密码杂凑算法,SM3算法对于长度小于2^64位的消息,产生一个256位的消息摘要。