sun博客

记录点滴!

加密,分两种,可逆和不可逆。

可逆,本质来说,就是将字符串通过异或或移位的方式。

 第一是异或 用的是一种二进制的基本操作
第二是移位 将一个字母唯一地替换为另一个字母 比如后移动一位 把a换成b....z换成a
这两种可逆
还有是hash 不过不可逆 

密钥。想一想,一段12345的文字,想要加密和不让对方知道,这时就要设置一个加密规则。比如将他转换成二进制 11000000111001 ,分隔二位进行一次异或,再转成文字。这个转成二进制的方式,就代表使用的加密的种类。比如用的aes,分隔二位则是 密钥 。

可逆分两类,对称加密和非对称加密,对称加密常用如下:

base64特征:

1.经过base64编码后的字符串长度一定会被4整除(包括后缀等号)
2.等号不超过两个。

aes, 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。对称加密算法也就是加密和解密用相同的密钥。 变长类型,内容越多,加密出来的密文越长。且同样内容,同样密钥,每次加密后,密文不一致。密文前10位为U2FsdGVkX1,固定不变。

des,( Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合。 变长类型,内容越多,加密出来的密文越长。且同样内容,同样密钥,每次加密后,密文不一致。密文前10位为U2FsdGVkX1,固定不变。

3DES(Triple DES):是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高。 变长类型,内容越多,加密出来的密文越长。且同样内容,同样密钥,每次加密后,密文不一致。密文前10位为U2FsdGVkX1,固定不变。

RC2和RC4:( Rivest Cipher )对称算法,用变长密钥对大量数据进行加密,比 DES 快。 Rivest Cipher 4,也称为 ARC4 或 ARCFOUR,是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4 是有线等效加密(WEP)中采用的加密算法,也曾经是 TLS 可采用的算法之一,该算法的速度可以达到 DES 加密的 10 倍左右,且具有很高级别的非线性,虽然它在软件方面的简单性和速度非常出色,但在 RC4 中发现了多个漏洞,它特别容易受到攻击,RC4 作为一种老旧的验证和加密算法易于受到黑客攻击,现在逐渐不推荐使用了。 变长类型,内容越多,加密出来的密文越长。且同样内容,同样密钥,每次加密后,密文不一致。密文前10位为U2FsdGVkX1,固定不变。

rabbit加密: Rabbit 加密算法是一个高性能的流密码加密方式,2003 年首次被提出,它从 128 位密钥和 64 位初始向量(iv)创建一个密钥流。 对比AES、DES、RC4、Rabbit、Triple DES、3DES 这些算法都可以引入密钥,他们密文特征与Base64类似,明显区别是秘文里​​+​​​比较多,并且经常有/)。 变长类型,内容越多,加密出来的密文越长。且同样内容,同样密钥,每次加密后,密文不一致。密文前10位为U2FsdGVkX1,固定不变。

非对称加密如下:

常用的RSA,DSA,DH等。我们一般使用RSA ,TLS中 验证机制(非传输机制)一般也是用的RSA。

RSA, 由美国麻省理工学院三位学者 Rivest、Shamir 及Adleman 研究发展出 一套可实际使用的公开金钥密码系统,那就是RSA(Rivest-Shamir-Adleman)密码系统。 需要公钥和私钥。

DSA, DSA 只能用于数字签名,而无法用于加密(某些扩展可以支持加密);RSA 即可作为数字签名,也可以作为加密算法。不过作为加密使用的 RSA 有着随密钥长度增加,性能急剧下降的问题。

RSA 与 DSA 各有优缺点,那有没一个更好的选择呢?答案是肯定的,ECC(Elliptic Curves Cryptography):椭圆曲线算法

    ECC 与 RSA 相比,有以下的优点:
(1)相同密钥长度下,安全性能更高,如160位ECC已经与1024位RSA、DSA有相同的安全强度。
(2)计算量小,处理速度快,在私钥的处理速度上(解密和签名),ECC远 比RSA、DSA快得多。
(3)存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。
(4)带宽要求低使得ECC具有广泛得应用前景。

不可逆加密:

md5,sha1,sha256,hmacSha1,hmacsha224….hmacsha512

md5加密长度32位,16位即是32位的裁剪。 取中间的第 9 位到第 24 位的部分。 str.substring(8, 24);

sha1加密长度40位

sha224加密长度56位

sha256加密长度64位

sha384加密长度96位

sha512加密长度128位

hmacsha1 需要密钥。属于不可逆中加密的带密钥的。其加密后长度与sha一致。

//不需要密钥,直接内容加密。服务器拿到源文加密对比传过来的加密是否正确。
let md5=function(content){
    let result = crypto.createHash('md5').update(content).digest("hex")
    return result
}
let sha1=function (content){
    return crypto.createHash('SHA1').update(content).digest('hex');
}
exports.sha256=function (content){
    return crypto.createHash('SHA256').update(content).digest('hex');
}

hmacsha1 java代码

package com.hujl.oauth.signature;
 
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
 
public class HMACSHA1 {
 
	private static final String MAC_NAME = "HmacSHA1";  
    private static final String ENCODING = "UTF-8";  
    
	/*
	 * 展示了一个生成指定算法密钥的过程 初始化HMAC密钥 
	 * @return 
	 * @throws Exception
	 * 
	  public static String initMacKey() throws Exception {
	  //得到一个 指定算法密钥的密钥生成器
	  KeyGenerator KeyGenerator keyGenerator =KeyGenerator.getInstance(MAC_NAME); 
	  //生成一个密钥
	  SecretKey secretKey =keyGenerator.generateKey();
	  return null;
	  }
	 */
    
    /** 
     * 使用 HMAC-SHA1 签名方法对对encryptText进行签名 
     * @param encryptText 被签名的字符串 
     * @param encryptKey  密钥 
     * @return 
     * @throws Exception 
     */  
    public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception   
    {         
    	byte[] data=encryptKey.getBytes(ENCODING);
    	//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
        SecretKey secretKey = new SecretKeySpec(data, MAC_NAME); 
        //生成一个指定 Mac 算法 的 Mac 对象
        Mac mac = Mac.getInstance(MAC_NAME); 
        //用给定密钥初始化 Mac 对象
        mac.init(secretKey);  
        
        byte[] text = encryptText.getBytes(ENCODING);  
        //完成 Mac 操作 
        return mac.doFinal(text);  
    }  
}

「爬虫知识」爬虫常见加密解密算法

https://baijiahao.baidu.com/s?id=1706700589435327561&wfr=spider&for=pc

发表评论

邮箱地址不会被公开。 必填项已用*标注