小谈加密算法

2024-05-05 00:32
文章标签 加密算法 小谈

本文主要是介绍小谈加密算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、为什么要用加密

网站中有很多类似金钱、密码等重要业务数据,一旦被监听、拦截,可能会造成严重的损失。
比如下图:

我们可以很容易的看到某个请求的相关参数数据
这里写图片描述

2、应用场景

加密算法有很多种应用场景,最常见的是用户登录、身份验证、验签等等。目的在于通过算法,将明文转换为密文。将明文转换为密文只是第一步,更深一步的做法是结合sessionId、随机数、token或者https等,最大限度的防止信息被盗取。

3、类型

加密算法通常分为对称性加密算法和非对称性加密算法。

3.1 对称性加密

只存在一把钥匙key,如果A想要与B通讯,那么A使用钥匙进行加密,B接收到密文的钥匙后,使用钥匙解密,获得明文信息。

这里写图片描述

优缺点
效率高、使用维护简单,缺点就是密码一旦泄露,通讯信息就会暴露。

常用加密算法:
DES、三重DES、AES等,稍后会以AES为例,介绍具体用法。

3.2 非对称加密

非对称加密有两把钥匙:私钥和公钥。
这里有几个原则和前提需要先说明:
1)公钥和私钥是成对出现的。
2)公开的是公钥,私钥只有自己知道。
3)用公钥加密的信息,只能用对应的私钥进行解密。

这里写图片描述

A、B各有一对密钥,A的密钥包括:公钥01、私钥02,B的密钥包括:公钥03、私钥04。其中,A拥有B的公钥03,同样的,B也拥有A的公钥01。

当A要与B通讯时,A使用B的公钥03加密,当B拿到密文后,拿自己的私钥04解密。

优缺点:
非对称加密的优缺点正好与对称加密相反,可参照上面。

常用加密算法:
RSA,DSA,ECC

除了上面两种主要类型的加密算法,还有一大类是线性散列算法,也叫签名算法。常用算法有:MD5,SHA1,HMAC。这类算法可以生成一长串不可逆的密文,经常用在校验数据在传输过程中是否经过修改。

4、实例

场景:用户登录,使用res加密,前端js加密,后端解密。

4.1 js文件

   //加密keyvar key =CryptoJS.enc.Utf8.parse("*******");  //pwd为加密信息 var srcs = CryptoJS.enc.Utf8.parse(pwd);  var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});

4.2 后台解密

    /*** 密钥,要与加密时的密钥保持一致*/private static final String KEY = "*******";/*** 算法*/private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";/*** aes解密* * @param encrypt*            内容* @return* @throws Exception*/public static String aesDecrypt(String encrypt) throws Exception {return aesDecrypt(encrypt, KEY);}/*** aes加密* * @param content* @return* @throws Exception*/public static String aesEncrypt(String content) throws Exception {return aesEncrypt(content, KEY);}/*** 将byte[]转为各种进制的字符串* * @param bytes*            byte[]* @param radix*            可以转换进制的范围,从Character.MIN_RADIX到Character.MAX_RADIX,超出范围后变为10进制* @return 转换后的字符串*/public static String binary(byte[] bytes, int radix) {return new BigInteger(1, bytes).toString(radix);// 这里的1代表正数}/*** base 64 encode* * @param bytes*            待编码的byte[]* @return 编码后的base 64 code*/public static String base64Encode(byte[] bytes) {return Base64.encodeBase64String(bytes);}/*** base 64 decode* * @param base64Code*            待解码的base 64 code* @return 解码后的byte[]* @throws Exception*/public static byte[] base64Decode(String base64Code) throws Exception{return StringUtil.isEmpty(base64Code) ? null : new  BASE64Decoder().decodeBuffer(base64Code); }/*** AES加密* * @param content*            待加密的内容* @param encryptKey*            加密密钥* @return 加密后的byte[]* @throws Exception*/public static byte[] aesEncryptToBytes(String content, String encryptKey)throws Exception {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128);Cipher cipher = Cipher.getInstance(ALGORITHMSTR);cipher.init(Cipher.ENCRYPT_MODE,new SecretKeySpec(encryptKey.getBytes(), "AES"));return cipher.doFinal(content.getBytes("utf-8"));}/*** AES加密为base 64 code* * @param content*            待加密的内容* @param encryptKey*            加密密钥* @return 加密后的base 64 code* @throws Exception*/public static String aesEncrypt(String content, String encryptKey)throws Exception {return base64Encode(aesEncryptToBytes(content, encryptKey));}/*** AES解密* * @param encryptBytes*            待解密的byte[]* @param decryptKey*            解密密钥* @return 解密后的String* @throws Exception*/public static String aesDecryptByBytes(byte[] encryptBytes,String decryptKey) throws Exception {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128);Cipher cipher = Cipher.getInstance(ALGORITHMSTR);cipher.init(Cipher.DECRYPT_MODE,new SecretKeySpec(decryptKey.getBytes(), "AES"));byte[] decryptBytes = cipher.doFinal(encryptBytes);return new String(decryptBytes);}/*** 将base 64 code AES解密* * @param encryptStr*            待解密的base 64 code* @param decryptKey*            解密密钥* @return 解密后的string* @throws Exception*/public static String aesDecrypt(String encryptStr, String decryptKey)throws Exception {return StringUtil.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey);}public static void main(String[] args) throws Exception {String content = "123456";System.out.println("加密前:" + content);String encrypt = aesEncrypt(content, KEY);System.out.println("加密后:" + encrypt);String decrypt = aesDecrypt(encrypt, KEY);System.out.println("解密后:" + decrypt);}

5、小结

上面说到对称加密和非对称加密各有优缺点,前者效率高,但密钥不安全;后者安全但加密解密时间较长。

实践中比较常用的做法是,采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

这篇关于小谈加密算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960435

相关文章

AES加密算法说明

首先,我们得了解AES加密算法的一些基本概念。AES是一种对称加密算法,所谓对称,是说它的加密、解密过程使用相同的密钥。还有非对称加密算法,例如RSA,加密解密使用的是公私钥对。 AES同时是一种分组加密算法,分组的长度一般是16字节(128bit)。分组是什么意思呢?假设我有一段很长的明文T,我没法用AES加密整个T,只能将T分成若干16byte的明文组,接着对这些明文组逐个进行加密,得到一堆密

【SM系列】简单说说SM2,SM3,SM4加密算法

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、什么是SM2加密?2.1 应用场景2.2 与RSA算法的区别 三、什么是SM3加密?3.1 应用场景 四、什么是SM4加密?4.1 应用场景 五、最后 开篇说明 之前我们说过了几种常见加密算法,今天我

加密算法种类

常见的加密算法可以分成三类,对称加密算法,非对称加密算法和哈希算法。 1. 对     称     加       密:加密和解密使用相同密钥的加密算法。     优          缺          点:对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。     常见的对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES。 2

python实现椭圆曲线加密算法(ECC)

目录 椭圆曲线加密算法(ECC)简介ECC的数学基础椭圆曲线的定义ECC的基本操作 ECC加密和解密流程Python面向对象实现ECC加密和解密代码解释场景应用:安全通信总结 椭圆曲线加密算法(ECC)简介 椭圆曲线加密算法(Elliptic Curve Cryptography, ECC)是一种基于椭圆曲线数学结构的公钥加密算法。ECC以其较高的安全性和较小的密钥长度而闻名

国际非对称加密算法

国际非对称加密 RSA算法原理 RSA算法是一种非对称加密算法,它的安全性基于大数分解的困难性。RSA算法的核心是选择两个大质数p和q,计算它们的乘积n=pq,然后选择一个整数e,使得1<e<φ(n)且e与φ(n)互质,其中φ(n)=(p-1)(q-1)。接着计算d,使得d*e mod φ(n)=1,d称为e的模反元素。公钥为(n,e),私钥为(n,d)。 非对称特征 非对称加密算法有两个密

对称加密算法DES、3DES和AES

学习交流关注微信公众号:钟渊博客 1、对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,

【加密算法】有关国密4加密算法的实现

今天在对接乐企的时候,需要用到国密4算法对入参进行加密 之后对出参进行解密,乐企平台提供了算法实现,具体如下: import org.apache.commons.lang3.ObjectUtils;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.bouncycastle.pqc.math.linear

【转载】DES加密算法原理

DES算法理论 本世纪五十年代以来,密码学研究领域出现了最具代表性的两大成就。其中之一就是1971年美国学者塔奇曼 (Tuchman)和麦耶(Meyer)根据信息论创始人香农(Shannon)提出的「多重加密有效性理论」创立的,后於1977年由美国国家标準局颁布的数据加密标準。 DES密码实际上是Lucifer密码的进一步发展。它是一种採用传统加密方法的区组密码。它的算法是对称的,既可用於加密又

安卓文件加密 (File-Based Encryption, FBE) 加密算法--AES-256-XTS

标签: File-Based Encryption加密算法; AES-256-XTS; 安卓文件加密 (File-Based Encryption, FBE) 加密算法详解 1. 什么是文件加密(FBE)? 文件加密(File-Based Encryption, FBE)是Android在7.0(Nougat)及更高版本中引入的一种加密机制,它允许不同的文件使用不同的加密密钥进行

【经验小谈】 alignbottom失效 全屏失效

Andriod学习不深奥,经验全从实践来 大家好,今日经验分享之~ 全屏的应用 1、android:layout_alignBottom="@+id/iv_icon" 是不是发现不管怎么弄,都不能贴在iv_icon的底部? 这个时候情不断的尝试,比如更换控件试试,然后删掉自定义控件试试 如果都不能解决,那么看看你的父布局是不是添加了Margin 或者Padding