对称加密详解,以及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.二叉搜索树定义 二叉搜索树,是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根 ...
随机推荐
- Ant + Jenkies +Tomcat 自动构建部署Web项目
前言:博主资历尚浅,很多东西都还在刚起步学习的阶段,这几天开发任务比较轻,就在自己window系统下,模拟部署远程服务器,利用Jenkies + Ant + Tomcat 搭建了一个自动发布部署的环境 ...
- Java阶段性测试--知识点:数组,面向对象,集合、线程,IO流
#Java基础测试 涉及知识点:数组,面向对象,重载,重写,继承,集合,排序,线程,文件流 一.多项选择题(可能是单选,也可能是多选) 1.下列标识符命名不合法的是( D ). A.$_Name ...
- mysql revise
DATABASE create database db_name; use db_name; alter database db_name; drop database db_name; show d ...
- 【源码分享】jquery+css实现侧边导航栏
jquery+css实现侧边导航栏 最近做项目的时候,突然想用一个侧边导航栏,网上找了几个插件,有的太丑而且不太符合我的预期.与其修改别人的代码,不如自己来写一个了.废话不多说先上图,感兴趣的请继续看 ...
- Mybatis学习(二) - CRUD操作(增删改查操作)
直接上例子: 1.项目结构: 2.具体代码及配置 User.java package com.mybatis.bean; public class User { private int id; pri ...
- Dom 简介
HTML DOM 简介 DOM 教程 DOM 节点 HTML DOM 定义了访问和操作 HTML 文档的标准. 您应该具备的基础知识 在您继续学习之前,您需要对以下内容拥有基本的了解: HTML CS ...
- Bash shell执行命令的优先级
1.别名2.关键字:if.function.while .until等3.函数4.内置命令5.可执行程序或脚本 别关函内可 =-=-=-=-=Powered by Blogilo
- v9 频道页如果有下级栏目跳转到第一个栏目链接
{if $CATEGORYS[$catid]['child']==1} {php $firstarr = explode(',',$CATEGORYS[$catid]['arrchildid']);} ...
- Quirks模式是什么?它和Standards模式有什么区别
从IE6开始,引入了Standards模式,标准模式中,浏览器尝试给符合标准的文档在规范上的正确处理达到在指定浏览器中的程度. 在IE6之前CSS还不够成熟,所以IE5等之前的浏览器对CSS的支持很差 ...
- linux环境下创建和删除软链接
ln -s /home/zhenwx/htccode-v1/ /home/zhenwx/htccode 建立/home/zhenwx/htccode-v1 的软连接 linux下的软链接类似于wind ...