2019独角兽企业重金招聘Python工程师标准>>>

加密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了。非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。

几种对称性加密算法:AES,DES,3DES

DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密,而3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高。

相较于DES和3DES算法而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准。

几种非对称性加密算法:RSA,DSA,ECC

RSA和DSA的安全性及其它各方面性能都差不多,而ECC较之则有着很多的性能优越,包括处理速度,带宽要求,存储空间等等。

几种线性散列算法(签名算法):MD5,SHA1,HMAC

这几种算法只生成一串不可逆的密文,经常用其效验数据传输过程中是否经过修改,因为相同的生成算法对于同一明文只会生成唯一的密文,若相同算法生成的密文不同,则证明传输数据进行过了修改。通常在数据传说过程前,使用MD5和SHA1算法均需要发送和接收数据双方在数据传送之前就知道密匙生成算法,而HMAC与之不同的是需要生成一个密匙,发送方用此密匙对数据进行摘要处理(生成密文),接收方再利用此密匙对接收到的数据进行摘要处理,再判断生成的密文是否相同。

对于各种加密算法的选用:

由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

如果在选定了加密算法后,那采用多少位的密钥呢?

一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

AES的实现

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;public class AESUtil {public static byte[] encrypt(String content, String password) {try {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128, new SecureRandom(password.getBytes()));SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");// 创建密码器byte[] byteContent = content.getBytes("utf-8");cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(byteContent);return result; // 加密} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}public static String encryptString(String content, String password) {try {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128, new SecureRandom(password.getBytes()));SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");// 创建密码器byte[] byteContent = content.getBytes("utf-8");cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(byteContent);String encryptResultStr = parseByte2HexStr(result);return encryptResultStr;} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}public static byte[] decrypt(byte[] content, String password) {try {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128, new SecureRandom(password.getBytes()));SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");// 创建密码器cipher.init(Cipher.DECRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(content);return result; // 加密} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}public static String decrypt(String content, String password) {try {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128, new SecureRandom(password.getBytes()));SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.DECRYPT_MODE, key);byte[] decryptFrom = parseHexStr2Byte(content);byte[] result = cipher.doFinal(decryptFrom);return new String(result);} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}public static String parseByte2HexStr(byte buf[]) {StringBuffer sb = new StringBuffer();for (int i = 0; i < buf.length; i++) {String hex = Integer.toHexString(buf[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sb.append(hex.toUpperCase());}return sb.toString();}public static byte[] parseHexStr2Byte(String hexStr) {if (hexStr.length() < 1)return null;byte[] result = new byte[hexStr.length() / 2];for (int i = 0; i < hexStr.length() / 2; i++) {int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);result[i] = (byte) (high * 16 + low);}return result;}public static void main(String[] args) {String content = "test";String password = "12345678";// 加密System.out.println("加密前:" + content);byte[] encryptResult = encrypt(content, password);String encryptResultStr = parseByte2HexStr(encryptResult);System.out.println("加密后:" + encryptResultStr);// 解密byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);byte[] decryptResult = decrypt(decryptFrom, password);System.out.println("解密后:" + new String(decryptResult));String enStr = encryptString("123", "@#&^%-$#@Coupon#$%^&@*");System.out.println(enStr);}
}

SHA1和MD5的实现

import java.security.MessageDigest;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;public abstract class EncodeUtil {private static Logger logger = LoggerFactory.getLogger(EncodeUtil.class);/*** 定义加密方式*/private final static String KEY_SHA = "SHA";private final static String MD5 = "MD5";/*** SHA 加密* * @param data 需要加密的字符串* @return 加密之后的字符串*/public static String sha(String data) {// 验证传入的字符串if (StringUtils.isEmpty(data)) {return "";}try {// 创建具有指定算法名称的信息摘要MessageDigest sha = MessageDigest.getInstance(KEY_SHA);// 使用指定的字节数组对摘要进行最后更新sha.update(data.getBytes("utf-8"));// 完成摘要计算byte[] bytes = sha.digest();// 将得到的字节数组变成字符串返回return byteArrayToHexString(bytes);} catch (Exception e) {logger.error("字符串使用SHA加密失败", e);return null;}}/*** MD5 加密* * @param data 需要加密的字符串* @return 加密之后的字符串*/public static String md5(String source) {// 验证传入的字符串if (StringUtils.isEmpty(source)) {return "";}try {MessageDigest md = MessageDigest.getInstance(MD5);byte[] bytes = md.digest(source.getBytes("utf-8"));return byteArrayToHexString(bytes);} catch (Exception e) {logger.error("字符串使用Md5加密失败" + source + "' to MD5!", e);return null;}}/*** 转换字节数组为十六进制字符串* * @param bytes*            字节数组* @return 十六进制字符串*/private static String byteArrayToHexString(byte[] bytes) {StringBuffer sb = new StringBuffer();for (int i = 0; i < bytes.length; i++) {sb.append(Integer.toHexString((bytes[i] & 0xFF) | 0x100).toUpperCase().substring(1, 3)); }return sb.toString();}/*** 测试方法* * @param args*/public static void main(String[] args) throws Exception {String key = "123";System.out.println(sha(key));System.out.println(md5(key));}
}

参考:

http://blog.csdn.net/cws1214/article/details/18604075

http://blog.csdn.net/happylee6688/article/details/43953671

转载于:https://my.oschina.net/u/3748347/blog/1619783

加密算法 AES MD5 SHA1相关推荐

  1. ESP32学习笔记(47)——加密算法AES/MD5/SHA

    一.简介 1.1 SSL SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层.SSL通过互相认证.使用数字签名确保完整性.使用 ...

  2. 建议使用 Bcrypt加密算法 代替 MD5/SHA1

    前言 为了保障用户的敏感数据安全,通常都会对其进行加密,然后将加密后的数据存入数据库中,例如用户密码,在用户进行登录的时候,将其输入的密码与数据库中存放的密文进行比较,以验证用户密码是否正确. BCr ...

  3. MD5,SHA-1,SHA-256摘要加解密

    2019独角兽企业重金招聘Python工程师标准>>> /*** 对字符串加密,加密算法使用MD5,SHA-1,SHA-256,默认使用SHA-256** @param strSrc ...

  4. 乐鑫Esp32学习之旅 22 讨论下程序员 “青春饭” 那些事,分享在esp32实现多种加密算法md5 |AES CBC-ECB| Sha1 | Sha256 等,附带Demo;

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  5. 加密算法(DES,AES,RSA,ECC,MD5,SHA1)简介

    加密算法(DES,AES,RSA,MD5,SHA1)简介 一.对称性加密算法 二.非对称算法 三.散列算法 四.算法举例 1.对称性加密算法有:AES.DES.3DES 1.1.DES(Data En ...

  6. DES, RC4, RC5, AES, RSA, MD5, SHA1 安全算法分析

    1. 基于对称密钥的加密算法主要有DES.RC4.RC5, AES 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法.有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥 ...

  7. openssl算法 —— 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    openssl 加密字符串的方法: 一.利用openssl命令进行BASE64编码解码(base64 encode/decode): 1. BASE64编码命令 对字符串'abc'进行base64编码 ...

  8. linux之用openssl命令Base64编码解码、md5/sha1摘要、AES/DES3加密解密

    1.我们先看openssl help命令会输出什么? 2.我们用openssl命令实现字符串和文本的Base64编码和解码 openssl base64 openssl base64 -d 3.我们用 ...

  9. 常用的加密算法(md5,sha1,base64加密解密)使用

    import org.apache.commons.codec.digest.DigestUtils; import java.util.Base64; import java.util.Scanne ...

最新文章

  1. 拯救你的久坐不起!用树莓派改造站立式办公桌:在随机时间升降,还有阻力检测功能...
  2. 春节前后学习实践的技术领域
  3. MDEV Primer
  4. ASP.NET(C#) 四舍五入、进一法、舍位(取整,舍去小数,向负无穷舍入)函数
  5. Tickets HDU - 1260
  6. 保姆级!!前端必会Taro入门级教学!!
  7. 苏宁易购:双11大促提前启动 将追加投入50亿补贴
  8. 用任何依赖中转服务器的远控软件,打造一款属于自己的远程控制软件(一)
  9. mod sim tcp配置_ModSim32-ModScan32Modbus调试工具使用及配置说明.pdf
  10. FlashFXP、LeapFTP、CuteFTP 等FTP软件二进制上传或下载方法
  11. php 爬网页数据 入库,phpspider是一个基于QueryList3的数据PHP爬虫,页面深度爬取,超简单的使用...
  12. Docker bridge 模式 容器如何访问外部世界?
  13. 细数魔兽争霸作弊工具排行
  14. Acess错误:文件共享锁定数溢出
  15. 评课用计算器计算机,【用计算器探索规律评课稿】_用计算器探索规律评课稿...
  16. C语言简单直观打印二叉树
  17. NIO核心设计与原理
  18. 微信小程序跳转到H5网页
  19. [MFC]CFile类实现低级文件I/O
  20. 山东省创新型中小企业认证解读

热门文章

  1. DokiCam 360°4K相机:为极致运动爱好者而生
  2. 计算科学如何帮助中国制造业成为全球领导者?李开复余承东胡郁等14位产学研大佬这样说|2021 CCF CTO高峰论坛...
  3. 无需任何标记数据,几张照片就能还原出3D物体结构,自监督学习还能这样用...
  4. 「人民的希望」首批临床结果公布:2/3重症10天内有效改善,一半以上摆脱呼吸机 | 新英格兰医学重磅...
  5. 今日可抢回程火车票,实测两款GitHub开源抢票插件,所有坑我们都帮你踩过了...
  6. 中国自研数据库打破西方垄断:阿里成绩刷新世界尘封9年纪录,性能2倍于第二名...
  7. 商汤再挖MSRA大将:R-FCN作者代季峰加盟任执行研究总监
  8. GitHub发福利:30多万元资源,学生可以免费用
  9. RabbitMQ学习总结(5)——发布和订阅实例详解
  10. python字符串、列表和文件对象总结