对称加密详解,以及JAVA简单实现
(原)
常用的加密有3种
1、正向加密,如MD5,加密后密文固定,目前还没办法破解,但是可以能过数据库撞库有一定概率找到,不过现在一般用这种方式加密都会加上盐值。
2、对称加密,通过一个固定的对称密钥,对需要传输的数据进行加解密,速度快,但是安全性不高,主要用于企业级内部系统中数据传输。
3、非对称加密,N把公钥,一把私钥,私钥存放在服务器一方保管,公钥放可以放在任何一个客户端,客户端向服务器请求的密文只有拿到了私钥的服务器一端可以解密。
这里有个概念解释一下,
随机盐值(solt):
abcd -> MD5加密 -> E2FC714C4727EE9395F324CD2E7F331F
然后通过撞库的方式,这种简单的字符一般都能很快的被找到
如果我定义一个只有自己知道的字符串,放在要加密的文的任何地方,比如我在abcd第二个字符前加上:helloword123123,那么要加密的字符就变成了:ahelloword123123worldbcd。
我们对这个再次进行加密:
ahelloword123123worldbcd -> MD5加密 -> 978E1014EEFF5E0A708314DB2E7D6DA1
我们再次通过撞库的方式来解密:
发现这次再通过撞库的方式解密失败了。这里的盐值的作用相当于扰乱了正常要加密的字符,而这个规律只有开发者,服务端的人知道。
^(异或)运算的作用。
它的运算规则是二进制运算中,相同得0,不同得1,如:2的二进制是10,3的二进制是11,最后得到的结果是01,转成十进制就是1。
如图:
异或运算还有一个特殊的性质,就是逆运算,就拿刚才的例子来说,2^3=1,无论2、3、1中哪二个数做异或,结果永远只会等于另一个数。
比如:
2^3=1
2^1=3
3^1=2,通过异或这种特殊的运算性质,用它来做对称加密是比较好的选择。
下面给一个JAVA的简单实现:
将1234用密钥abc加密。
思路:
1、先将1234转换成二进制,即ASCII码。
加密:
1、2、3、4分别对应着49、50、51、52
49 -> 加密过程为:49 ^ 密钥 ^ 盐值 -> m1
50 -> 加密过程为:50 ^ 密钥 ^ m1 -> m2
51 -> 加密过程为:51 ^ 密钥 ^ m2 -> m3
52 -> 加密过程为:52 ^ 密钥 ^ m3 -> m4
经过上述运算后,密文就变成了m1、m2、m3、m4。
解密:
解密是上面加密的逆运算:已知条件为m1、m2、m3、m4
m4 -> 解密过程为:m4 ^ m3 ^ 密钥 -> 52
m3 -> 解密过程为:m3^ m2 ^ 密钥 -> 51
m2 -> 解密过程为:m2 ^ m1 ^ 密钥 -> 50
m1 -> 解密过程为:m1 ^ 盐值 ^ 密钥 -> 49
下面给出JAVA实现代码:
package com.lee; public class Encryption {
public static void main(String[] args) {
String content = "1234"; //需要加密的字符
String key = "abc"; //密钥 byte[] result = encryption(content, key); System.out.println("1234加密后的值:" + new String(result));
System.out.println("---------------");
System.out.println("1234解密后的值:" +new String(decipher(new String(result), key)));
} public static byte[] encryption(String content,String key){
byte[] contentBytes = content.getBytes();
byte[] keyBytes = key.getBytes(); byte dkey = 0;
for(byte b : keyBytes){
dkey ^= b;
} byte salt = 0; //随机盐值
byte[] result = new byte[contentBytes.length];
for(int i = 0 ; i < contentBytes.length; i++){
salt = (byte)(contentBytes[i] ^ dkey ^ salt);
result[i] = salt;
}
return result;
} public static byte[] decipher(String content,String key){
byte[] contentBytes = content.getBytes();
byte[] keyBytes = key.getBytes(); byte dkey = 0;
for(byte b : keyBytes){
dkey ^= b;
} byte salt = 0; //随机盐值
byte[] result = new byte[contentBytes.length];
for(int i = contentBytes.length - 1 ; i >= 0 ; i--){
if(i == 0){
salt = 0;
}else{
salt = contentBytes[i - 1];
}
result[i] = (byte)(contentBytes[i] ^ dkey ^ salt);
}
return result;
}
}
输出结果为:
对称加密详解,以及JAVA简单实现的更多相关文章
- java加密算法入门(二)-对称加密详解
1.简单介绍 什么是对称加密算法? 对称加密算法即,加密和解密使用相同密钥的算法. 优缺点: 优点:算法公开.计算量小.加密速度快.加密效率高. 缺点: (1)交易双方都使用同样钥匙,安全性得不到保证 ...
- java加密算法入门(三)-非对称加密详解
1.简单介绍 这几天一直在看非对称的加密,相比之前的两篇内容,这次看了两倍多的时间还云里雾里的,所以这篇文章相对之前的两篇,概念性的东西多了些,另外是代码的每一步我都做了介绍,方便自己以后翻阅,也方便 ...
- MD5加密详解
MD5加密详解 引言: 我在百度百科上查找到了关于MD5的介绍,我从中摘要一些重要信息: Message Digest Algorithm MD5(中文名为信息摘要算法第五版)为计算机安全领域广泛使用 ...
- 事件驱动模型实例详解(Java篇)
或许每个软件从业者都有从学习控制台应用程序到学习可视化编程的转变过程,控制台应用程序的优点在于可以方便的练习某个语言的语法和开发习惯(如.net和java),而可视化编程的学习又可以非常方便开发出各类 ...
- 对称加密之AES加密详解
最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...
- Kerberos安全体系详解---Kerberos的简单实现
1. Kerberos简介 1.1. 功能 一个安全认证协议 用tickets验证 避免本地保存密码和在互联网上传输密码 包含一个可信任的第三方 使用对称加密 客户端与服务器(非KDC)之间能够相互 ...
- Myeclipse Templates详解(一) —— Java模板基础
目录 Templates简介 MyEclipse自带Templates详解 新建Template 自定义Template 因为自己比较懒,尤其是对敲重复代码比较厌恶,所以经常喜欢用快捷键和模板,Mye ...
- Heapsort 堆排序算法详解(Java实现)
Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析.同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择 ...
- 二叉搜索树详解(Java实现)
1.二叉搜索树定义 二叉搜索树,是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根 ...
随机推荐
- Java对【JSON数据的解析】--fastjson解析法
要求:解析下面JSON数据 String string = "{no:1,name:'Android',employees:[{name:'zhangsan',age:20},{name:' ...
- Node.js安装和配置
今天有时间开始要研究Node.js了,项目的需要,先把环境正好,初次接触,把安装和配置过程记录下来,以备不时之需.言归正传. 1.打开NodeJS的官网,下载和自己系统相配的NodeJS的安装程序,包 ...
- */美女镇楼/*>>>---PHP中的OOP-->面对过程与面对对象基础概念与内容--(封装、继承、多态)
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的重要成员OOP 1 面向过程&面向对象 1.专注于解决一个问题的过程.面向过程的最大特点,是由一个一个的函数去解决处理这 ...
- 读Zepto源码之样式操作
这篇依然是跟 dom 相关的方法,侧重点是操作样式的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zepto1.2. ...
- Lucene全文搜索之分词器:使用IK Analyzer中文分词器(修改IK Analyzer源码使其支持lucene5.5.x)
注意:基于lucene5.5.x版本 一.简单介绍下IK Analyzer IK Analyzer是linliangyi2007的作品,再此表示感谢,他的博客地址:http://linliangyi2 ...
- js获取地址栏某个参数
一.获取单个参数: 若地址栏URL为:abc.html?id=123 function getString(){ var locurl=location.href; var sta ...
- ES6 常用总结——第一章(简介、let、const)
ES6整理 1. ECMAScript 6简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准.它的目标,是使得 JavaScript 语言可以用来编写复杂 ...
- 掌握Chrome Developer Tools:下一阶段前端开发技术
Tips 原文作者:Ben Edelstein 原文地址:Mastering Chrome Developer Tools: Next Level Front-End Development Tech ...
- ajax、PHP、session做购物车
购物车网页代码 1.登录界面login.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- mysql基于binlog回滚工具_flashback(python版本)
update.delete的条件写错甚至没有写,导致数据操作错误,需要恢复被误操作的行记录.这种情形,其实时有发生,可以选择用备份文件+binlog来恢复到测试环境,然后再做数据修复,但是这样 ...