# Crypto-JS **Repository Path**: songlu-cube/Crypto-JS ## Basic Information - **Project Name**: Crypto-JS - **Description**: 各类加密算法介绍及JS实现 - **Primary Language**: NodeJS - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-08-11 - **Last Updated**: 2025-11-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 常见加密算法的使用(JS 版本) 数字签名、信息加密是前后端开发都经常需要使用到的技术,应用场景包括了用户登入、交易、信息通讯、oauth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的签名加密算法来达到业务目标。 ## 数字签名 数字签名,简单来说就是通过提供可鉴别的数字信息验证自身身份的一种方式。 数字签名包括【签名】和【验签】两部分。 - 签名:保证发件人身份,私钥签名 - 验签:验证发件人身份,公钥验签 ## 信息加密 信息加密的基本过程,就是对原来为 明文 的文件或数据按 某种算法 进行处理,使其成为不可读的一段代码,通常称为“密文”。通过这样的途径,来达到保护数据不被非法人窃取、阅读的目的。 信息加密包括【加密】和【解密】两部分。 - 加密:信息从明文变为密文,公钥加密 - 解密:密文变回可读的明文,私钥解密 ## 常见加密算法 | 类型 | 描述 | 算法 | | :--------: | :----------------------------------------------------- | :---------------------------------------- | | 对称加密 | 共享密钥加密,加解密的密钥相同 | DES、3DES、AES、SM1、SM4、SM7、祖冲之密码 | | 非对称加密 | 公开密钥加密算法,加密公钥是公开的,解密的私钥是私有的 | RSA、DSA、SM2、SM9 | | 散列加密 | 不需要密钥 | SHA-1、SHA-256、MD5、SM3 | ## 加密模式 ### CBC 分组加密 ![cbc加密](./static/images/cbc加密.jpeg) ![cbc解密](./static/images/cbc解密.jpeg) #### 过程 1. 明文分组 2. IV 与第一组异或后使用 Key 加密,作为第一组密文 3. 第一组密文与第二组明文异或后使用 Key 加密,作为第二组密文 4. 以此类推 **关于这个初始向量 IV 的完整性要比其保密性更为重要。在 CBC 模式下,最好是每发一个消息,都改变 IV,比如将其值加一。** #### 初始化向量 IV IV 需要与分组进行异或操作,所以 IV 的长度要和分组长度一致。 aes-128-cbc 模式下要 16 位的 key 和 iv,这个 16 位指的是 16 位字节串,而不是 16 进制字符串。有些文章给出的 Key 是 32 位的,其实他的 32 位是 16 进制字符串,也等于 16 位字节串。 AES-128 对应的 KEY 是 16 位 AES-192 对应的 KEY 是 24 位 AES-256 对应的 KEY 是 32 位