常用的加密算法

2023-11-19

整理一下常用的加密算法

加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。

一、不可逆加密

常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384,和SHA-512我们可以统称为SHA2加密算法,SHA加密算法的安全性要比MD5更高,而SHA2加密算法比SHA1的要高。其中SHA后面的数字表示的是加密后的字符串长度,SHA1默认会产生一个160位的信息摘要。

不可逆加密算法最大的特点就是密钥,但是HMAC是需要密钥的【手动狗头】。

由于这些加密都是不可逆的,因此比较常用的场景就是用户密码加密,其验证过程就是通过比较两个加密后的字符串是否一样来确认身份的。网上也有很多自称是可以破解MD5密码的网站,其原理也是一样,就是有一个巨大的资源库,存放了许多字符串及对应的MD5加密后的字符串,通过你输入的MD5加密串来进行比较,如果过你的密码复杂度比较低,还是有很大机率验证出来的。

1.1 MD5

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

MD5算法有以下特点:

1、压缩性:无论数据长度是多少,计算出来的MD5值长度相同

2、容易计算性:由原数据容易计算出MD5值

3、抗修改性:即便修改一个字节,计算出来的MD5值也会巨大差异

4、抗碰撞性:知道数据和MD5值,很小概率找到相同MD5值相同的原数据。

public static String md5(String text) {
    MessageDigest messageDigest = null;
    try {
        messageDigest = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    byte[] bytes = messageDigest.digest(text.getBytes());
    return Hex.encodeHexString(bytes); 
}

1.2 SHA系列

安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

2005年8月17日的CRYPTO会议尾声中王小云、姚期智、姚储枫再度发表更有效率的SHA-1攻击法,能在2的63次方个计算复杂度内找到碰撞。

也就是说SHA-1加密算法有碰撞的可能性,虽然很小。

public static String sha256(String text) {
    MessageDigest messageDigest = null;
    try {
        messageDigest = MessageDigest.getInstance("SHA-256");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    byte[] bytes = messageDigest.digest(text.getBytes()); 
    return Hex.encodeHexString(bytes); 
}

1.3 HMAC系列

HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,并于1997年作为RFC2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。

HMAC算法更像是一种加密算法,它引入了密钥,其安全性已经不完全依赖于所使用的Hash算法

public static String hmacSha256(String text, SecretKeySpec sk) {
    Mac mac = null;
    try {
        mac = Mac.getInstance("HmacSHA256");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
        mac.init(sk);
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    }
    byte[] rawHmac = mac.doFinal(text.getBytes());
    return new String(Base64.encodeBase64(rawHmac));
}

如果要使用不可逆加密,推荐使用SHA256、SHA384、SHA512以及HMAC-SHA256、HMAC-SHA384、HMAC-SHA512这几种算法。

二、对称加密算法

对称加密算法是应用比较早的算法,在数据加密和解密的时用的都是同一个密钥,这就造成了密钥管理困难的问题。常见的对称加密算法有DES、3DES、AES128、AES192、AES256 (默认安装的 JDK 尚不支持 AES256,需要安装对应的 jce 补丁进行升级 jce1.7,jce1.8)。其中AES后面的数字代表的是密钥长度。对称加密算法的安全性相对较低,比较适用的场景就是内网环境中的加解密。

2.1 DES
DES是对称加密算法领域中的典型算法,其密钥默认长度为56位。

// 加密
public static String encrypt(byte[] dataSource, String password){
     try {
         SecureRandom random = new SecureRandom();
         DESKeySpec desKeySpec = new DESKeySpec(password.getBytes());
         //创建一个密匙工厂,然后用它把DESKeySpec转换成 
         SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES"); 
         SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); 
         //Cipher对象实际完成加密操作 
         Cipher cipher = Cipher.getInstance("DES"); 
         //用密匙初始化Cipher对象 
         cipher.init(Cipher.ENCRYPT_MODE, secretKey, random); 
         //正式执行加密操作 
         return Base64.encodeBase64String(cipher.doFinal(dataSource)); 
     } catch (Throwable e) { 
         e.printStackTrace(); 
     } return null; 
 } 
// 解密
public static String decrypt(String src, String password) throws Exception{ 
    // DES算法要求有一个可信任的随机数源 
    SecureRandom random = new SecureRandom(); 
    // 创建一个DESKeySpec对象 
    DESKeySpec desKeySpec = new DESKeySpec(password.getBytes()); 
    // 创建一个密匙工厂 
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
    // 将DESKeySpec对象转换成SecretKey对象 
    SecretKey secretKey = keyFactory.generateSecret(desKeySpec); 
    // Cipher对象实际完成解密操作 
    Cipher cipher = Cipher.getInstance("DES"); 
    // 用密匙初始化Cipher对象 
    cipher.init(Cipher.DECRYPT_MODE, secretKey, random); 
    // 真正开始解密操作 
    return new String(cipher.doFinal(Base64.decodeBase64(src))); 
}

2.2 3DES
3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。密钥长度默认为168位,还可以选择128位。

public static String encryptThreeDESECB(String src, String key) {
    try{
        DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
        SecretKey securekey = keyFactory.generateSecret(dks);

        Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, securekey);
        byte[] b = cipher.doFinal(src.getBytes("UTF-8"));

        String ss = new String(Base64.encodeBase64(b));
        ss = ss.replaceAll("\\+", "-");
        ss = ss.replaceAll("/", "_");
        return ss;
    } catch(Exception ex){
        ex.printStackTrace();
        return src;
    }
}

public static String decryptThreeDESECB(String src, String key) {
    try{
        src = src.replaceAll("-", "+");
        src = src.replaceAll("_", "/");
        byte[] bytesrc = Base64.decodeBase64(src.getBytes("UTF-8"));
        // --解密的key
        DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
        SecretKey securekey = keyFactory.generateSecret(dks);

        // --Chipher对象解密
        Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, securekey);
        byte[] retByte = cipher.doFinal(bytesrc);

        return new String(retByte, "UTF-8");
    } catch(Exception ex){
        ex.printStackTrace();
        return src;
    }
}

2.3 AES
AES 高级数据加密标准,能够有效抵御已知的针对DES算法的所有攻击,默认密钥长度为128位,还可以供选择192位,256位。这里顺便提一句这个位指的是bit。

private static final String defaultCharset = "UTF-8";
private static final String KEY_AES = "AES";
private static final String KEY_MD5 = "MD5";
private static MessageDigest md5Digest;
static {
    try {
        md5Digest = MessageDigest.getInstance(KEY_MD5);
    } catch (NoSuchAlgorithmException e) {

    }
}
/**
  * 加密
  */
public static String encrypt(String data, String key) {
    return doAES(data, key, Cipher.ENCRYPT_MODE);
}
/**
  * 解密
  */
public static String decrypt(String data, String key) {
    return doAES(data, key, Cipher.DECRYPT_MODE);
}


/**
  * 加解密
  */
private static String doAES(String data, String key, int mode) {
    try {
        boolean encrypt = mode == Cipher.ENCRYPT_MODE;
        byte[] content;
        if (encrypt) {
            content = data.getBytes(defaultCharset);
        } else {
            content = Base64.decodeBase64(data.getBytes());
        }
        SecretKeySpec keySpec = new SecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset))
                                                  , KEY_AES);
        Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器
        cipher.init(mode, keySpec);// 初始化
        byte[] result = cipher.doFinal(content);
        if (encrypt) {
            return new String(Base64.encodeBase64(result));
        } else {
            return new String(result, defaultCharset);
        }
    } catch (Exception e) {
    }
    return null;
}

推荐使用对称加密算法有:AES128、AES192、AES256。

三、非对称加密算法
非对称加密算法有两个密钥,这两个密钥完全不同但又完全匹配。只有使用匹配的一对公钥和私钥,才能完成对明文的加密和解密过程。常见的非对称加密有RSA、SM2等。
3.1 RSA
RSA密钥至少为500位长,一般推荐使用1024位。

//非对称密钥算法
public static final String KEY_ALGORITHM = "RSA";

/**
  * 密钥长度,DH算法的默认密钥长度是1024
  * 密钥长度必须是64的倍数,在512到65536位之间
  */
private static final int KEY_SIZE = 1024;
//公钥
private static final String PUBLIC_KEY = "RSAPublicKey";
//私钥
private static final String PRIVATE_KEY = "RSAPrivateKey";
/**
  * 初始化密钥对
  *
  * @return Map 甲方密钥的Map
  */
public static Map<String, Object> initKey() throws Exception {
    //实例化密钥生成器
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
    //初始化密钥生成器
    keyPairGenerator.initialize(KEY_SIZE);
    //生成密钥对
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    //甲方公钥
    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
    //甲方私钥
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
    //将密钥存储在map中
    Map<String, Object> keyMap = new HashMap<String, Object>();
    keyMap.put(PUBLIC_KEY, publicKey);
    keyMap.put(PRIVATE_KEY, privateKey);
    return keyMap;
}
/**
  * 私钥加密
  *
  * @param data 待加密数据
  * @param key  密钥
  * @return byte[] 加密数据
  */
public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {

    //取得私钥
    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    //生成私钥
    PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
    //数据加密
    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    return cipher.doFinal(data);
}

/**
  * 公钥加密
  *
  * @param data 待加密数据
  * @param key  密钥
  * @return byte[] 加密数据
  */
public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {

    //实例化密钥工厂
    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    //初始化公钥
    //密钥材料转换
    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
    //产生公钥
    PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
    //数据加密
    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    return cipher.doFinal(data);
}

/**
  * 私钥解密
  *
  * @param data 待解密数据
  * @param key  密钥
  * @return byte[] 解密数据
  */
public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {
    //取得私钥
    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    //生成私钥
    PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
    //数据解密
    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    return cipher.doFinal(data);
}

/**
  * 公钥解密
  *
  * @param data 待解密数据
  * @param key  密钥
  * @return byte[] 解密数据
  */
public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {

    //实例化密钥工厂
    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    //初始化公钥
    //密钥材料转换
    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
    //产生公钥
    PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
    //数据解密
    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    cipher.init(Cipher.DECRYPT_MODE, pubKey);
    return cipher.doFinal(data);
}

/**
  * 取得私钥
  *
  * @param keyMap 密钥map
  * @return byte[] 私钥
  */
public static byte[] getPrivateKey(Map<String, Object> keyMap) {
    Key key = (Key) keyMap.get(PRIVATE_KEY);
    return key.getEncoded();
}

/**
  * 取得公钥
  *
  * @param keyMap 密钥map
  * @return byte[] 公钥
  */
public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception {
    Key key = (Key) keyMap.get(PUBLIC_KEY);
    return key.getEncoded();
}

四、加密盐
加密盐也是比较常听到的一个概念,盐就是一个随机字符串用来和我们的加密串拼接后进行加密。加盐主要是为了提供加密字符串的安全性。假如有一个加盐后的加密串,黑客通过一定手段这个加密串,他拿到的明文,并不是我们加密前的字符串,而是加密前的字符串和盐组合的字符串,这样相对来说又增加了字符串的安全性。
文中的一些算法来源于网络,可直接复制使用。

比较推荐的几个加密算法有:

不可逆加密:SHA256、SHA384、SHA512以及HMAC-SHA256、HMAC-SHA384、HMAC-SHA512
对称加密算法:AES、3DES
非对称加密算法:RSA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常用的加密算法 的相关文章

  • 如何使用 SLF4J 和 Log4j2 记录 FATAL(或任何自定义日志级别)

    我有那些具体的要求 需要能够登录FATAL level 需要使用SLF4J 需要使用Log4j2 现在 这是我的执行 final Logger logger LoggerFactory getLogger HelloWorld class
  • 在 Kotlin 中实现返回 Collection 的 Java 方法

    我将 Kotlin 与 Spring Security 结合使用 实现该方法时 public interface UserDetails extends Serializable Collection
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • 如何在Spring的applicationContext.xml中指定默认范围来请求范围?

    我想让所有 bean 请求默认作用域 但是 Spring 文档说默认作用域是 Singleton 第 3 4 1 和 3 4 2 节http static springsource org spring docs 2 5 x referen
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • getClassLoader().getResource() 返回 null

    我有这个测试应用程序 import java applet import java awt import java net URL public class Test extends Applet public void init URL
  • JSP 标签+ scriptlet。如何启用脚本?

    我有一个使用标签模板的页面 我的 web xml 非常基本 我只是想在页面中运行一些代码 不 我对标签或其他替代品不感兴趣 我想使用不好的做法 scriptlet 哈哈 到目前为止 我收到了 HTTP ERROR 500 错误 Script
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • 源服务器未找到目标资源的当前表示或不愿意透露该表示存在

    web xml
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • java中的比较器链

    正在阅读Oracle 关于接口的 Java 教程 https docs oracle com javase tutorial java IandI createinterface html其中给出了一个例子Card 打牌 我试图理解接口中的
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat

随机推荐

  • Linux 配置 PaddleOCR环境

    配置环境 1 准备好CUDA和cudnn 安培架构GPU需配置CUDA 11 2 CUDNN 8 1 1 以下文档以安培架构GPU的为例 找到对应的版本下载CUDA https developer nvidia com cuda downl
  • 一位数组返回id和pid通过这两个参数转换为树形结构数据,和树形结构的渲染

    废话不多说直接上代码 html代码我是引用了一个jq的插件作为样式插件名字为 jOrgChart 具体内容大家可以评论到下方 div class com div class TheEditor 编辑 div div div div js代码
  • Java 实体设置指定日期格式

    import com fasterxml jackson annotation JsonFormat JsonFormat pattern yyyy MM dd HH mm ss timezone GMT 8 private Date cr
  • nginx 代理图片服务器

    location gif jpg jpeg png expires 24h root home sk ftp 指定图片存放路径 proxy store on proxy store access user rw group rw all r
  • MATLAB BP神经网络 笔记整理

    1 如何更改输出层的激活函数 传递函数 对于有两层神经网络结构 可以通过调用以下函数 net layers 1 or 2 transferFcn for the hidden net layers 3 transferFcn for the
  • C#实现遍历文件夹获取指定后缀名文件

    问题描述 项目需要 要进行某文件夹下所有shp数据的读取 解决方法 using System using System Collections Generic using System ComponentModel using System
  • Python机器学习/数据挖掘项目实战 波士顿房价预测 回归分析

    Python机器学习 数据挖掘项目实战 波士顿房价预测 回归分析 此数据源于美国某经济学杂志上 分析研究波士顿房价 Boston HousePrice 的数据集 在这个项目中 你将利用马萨诸塞州波士顿郊区的房屋信息数据训练和测试一个模型 并
  • Qt之一个类成员函数调用另一个类成员的方法

    原文 https blog csdn net qq 35721743 article details 83592415 在继承之外 在C 中一个类成员函数调用另一个类成员的方法主要有 类的组合 友元类 类的前向声明 单例模式等 下面主要讲讲
  • gym 101512 BAPC 2014 I Interesting Integers

    Problem codeforces com gym 101512 attachments vjudge net contest 186506 problem I Meaning 给出一个 正整数 n 要找尽量小的 a 和 b a lt b
  • 面向对象三大特性之一——多态详解

    目录 前言 一 多态的概念 二 多态的定义及实现 1 虚函数的概念 2 虚函数的重写 2 1概念 2 2虚函数重写的两个例外 3 多态的构成条件 4 c 11 override和final 4 1 final 4 2 override 5
  • Java(五)-Java集合(comparable,map,list

    集合 Collection集合 集合的概念 ArrayList就是一个集合 集合是Java提供的一种容器 可以用来存储多个数据 集合与数组的区别 1 数组的长度是固定的 集合的长度是可变的 2 数组中存储的是同一类型的元素 可以存储基本数据
  • C++ 和 C 使用的不同点(待定)

    1 结构体 C 中定义的结构体 不起别名的情况下使用时要添加 struct C 可以不用添加 struct 直接使用定义的结构体名称 struct Student int age char name C 不报错 C报错 Student Ge
  • JDK的监听 Spring的事件监听机制

    一 概述 使用场景 用户注册完成时 需要给该用户发送邮件 发送优惠劵等等操作 实现业务的解耦 MQ的异步 销峰 解耦 大体步骤 1 UserService 在完成自身的用户注册逻辑之后 仅仅只需要发布一个 UserRegisterEvent
  • 归一化与反归一化在Bi-LSTM多特征时序预测中应用(附实操代码)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 前言 一 Bi LSTM 是什么 二 为什么要归一化和反归一化 1 归一化的好处 2 反归一化的好处 三 归一化和反归一化使用的公式 1 归一化 2 反归一化 四 实操
  • 使用Pandas处理Excel文件

    Excel工作表是非常本能和用户友好的 这使得它们非常适合操作大型数据集 即使是技术人员也不例外 如果您正在寻找学习使用Python在Excel文件中操作和自动化内容的地方 请不要再找了 你来对地方了 在本文中 您将学习如何使用Pandas
  • forkjoin及其性能分析,是否比for循环快?

    最近看了网上的某公开课 其中有讲到forkjoin框架 在这之前 我丝毫没听说过这个东西 很好奇是什么东东 于是 就顺道研究了一番 总感觉这个东西 用的地方很少 也有可能是我才疏学浅 好吧 反正问了身边一堆猿 没有一个知道的 因此 我也没有
  • 怎么把树莓派连接到电脑上(基于window10)

    我相信对于刚玩树莓派的新手来说 尤其是没有带显示屏的同学来说 四处碰壁 可能出现的原因有很多种 ssh登录不上 wifi连接不上 内存不足 很多问题 而对于更多新手来说 如何给树莓派连接网络更是关键 今天我给大家讲一下如何用树莓派连接电脑
  • Real-time Linux

    所谓实时操作系统 Real time Opearting System 是指当外接世界或数据产生时 能够接受并以足够快的速度予以处理 其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应 调度一切可利用的资源完成实时任务
  • 数据链路层:Ethernet以太网协议

    首先Ethernet IEEE802 3 PPP和HDLC都是数据链路层的协议 只不过后面三个不常用而已 Ethernet和IEEE802 3属于以太链路层协议 数据链路层最常用的协议是Etnernet以太网协议 定义 Ethernet以太
  • 常用的加密算法

    整理一下常用的加密算法 加密算法我们整体可以分为 可逆加密和不可逆加密 可逆加密又可以分为 对称加密和非对称加密 一 不可逆加密 常见的不可逆加密算法有MD5 HMAC SHA1 SHA 224 SHA 256 SHA 384 和SHA 5