(原)

常用的加密有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实现代码:

  1. package com.lee;
  2.  
  3. public class Encryption {
  4. public static void main(String[] args) {
  5. String content = "1234"; //需要加密的字符
  6. String key = "abc"; //密钥
  7.  
  8. byte[] result = encryption(content, key);
  9.  
  10. System.out.println("1234加密后的值:" + new String(result));
  11. System.out.println("---------------");
  12. System.out.println("1234解密后的值:" +new String(decipher(new String(result), key)));
  13. }
  14.  
  15. public static byte[] encryption(String content,String key){
  16. byte[] contentBytes = content.getBytes();
  17. byte[] keyBytes = key.getBytes();
  18.  
  19. byte dkey = 0;
  20. for(byte b : keyBytes){
  21. dkey ^= b;
  22. }
  23.  
  24. byte salt = 0; //随机盐值
  25. byte[] result = new byte[contentBytes.length];
  26. for(int i = 0 ; i < contentBytes.length; i++){
  27. salt = (byte)(contentBytes[i] ^ dkey ^ salt);
  28. result[i] = salt;
  29. }
  30. return result;
  31. }
  32.  
  33. public static byte[] decipher(String content,String key){
  34. byte[] contentBytes = content.getBytes();
  35. byte[] keyBytes = key.getBytes();
  36.  
  37. byte dkey = 0;
  38. for(byte b : keyBytes){
  39. dkey ^= b;
  40. }
  41.  
  42. byte salt = 0; //随机盐值
  43. byte[] result = new byte[contentBytes.length];
  44. for(int i = contentBytes.length - 1 ; i >= 0 ; i--){
  45. if(i == 0){
  46. salt = 0;
  47. }else{
  48. salt = contentBytes[i - 1];
  49. }
  50. result[i] = (byte)(contentBytes[i] ^ dkey ^ salt);
  51. }
  52. return result;
  53. }
  54. }

输出结果为:

对称加密详解,以及JAVA简单实现的更多相关文章

  1. java加密算法入门(二)-对称加密详解

    1.简单介绍 什么是对称加密算法? 对称加密算法即,加密和解密使用相同密钥的算法. 优缺点: 优点:算法公开.计算量小.加密速度快.加密效率高. 缺点: (1)交易双方都使用同样钥匙,安全性得不到保证 ...

  2. java加密算法入门(三)-非对称加密详解

    1.简单介绍 这几天一直在看非对称的加密,相比之前的两篇内容,这次看了两倍多的时间还云里雾里的,所以这篇文章相对之前的两篇,概念性的东西多了些,另外是代码的每一步我都做了介绍,方便自己以后翻阅,也方便 ...

  3. MD5加密详解

    MD5加密详解 引言: 我在百度百科上查找到了关于MD5的介绍,我从中摘要一些重要信息: Message Digest Algorithm MD5(中文名为信息摘要算法第五版)为计算机安全领域广泛使用 ...

  4. 事件驱动模型实例详解(Java篇)

    或许每个软件从业者都有从学习控制台应用程序到学习可视化编程的转变过程,控制台应用程序的优点在于可以方便的练习某个语言的语法和开发习惯(如.net和java),而可视化编程的学习又可以非常方便开发出各类 ...

  5. 对称加密之AES加密详解

    最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...

  6. Kerberos安全体系详解---Kerberos的简单实现

    1.  Kerberos简介 1.1. 功能 一个安全认证协议 用tickets验证 避免本地保存密码和在互联网上传输密码 包含一个可信任的第三方 使用对称加密 客户端与服务器(非KDC)之间能够相互 ...

  7. Myeclipse Templates详解(一) —— Java模板基础

    目录 Templates简介 MyEclipse自带Templates详解 新建Template 自定义Template 因为自己比较懒,尤其是对敲重复代码比较厌恶,所以经常喜欢用快捷键和模板,Mye ...

  8. Heapsort 堆排序算法详解(Java实现)

    Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析.同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择 ...

  9. 二叉搜索树详解(Java实现)

    1.二叉搜索树定义 二叉搜索树,是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根 ...

随机推荐

  1. OpenGL判断一个点是否可见

    关于OpenGL中判断一个点是否可见,可以分成两种情况讨论:点在2D空间中和3D空间中的时候.并且"在2D空间中"可以看作"在3D空间中"的特殊情况. 温馨提示 ...

  2. Java文件流应用:剪切文件

    剪切的实际操作是: 第一步,先复制文件到指定位置, 第二步,删除原文件,这样就实现了剪切 与复制文件相比,多了一步删除文件 注意:删除文件必须在流关闭后,才能删除,否则,删除不了. 实例代码 pack ...

  3. Java常用类之String类、Stringbuffer和Random类练习

    定义一个StringBuffer类对象, 1)使用append方法向对象中添加26个字母,并倒序遍历输入 2)删除前五个字符 package 第十一章常用类; /** * 定义一个StringBuff ...

  4. 推荐xamlspy

    xamlspy(http://xamlspy.com/) 如果在win32时代用过spy++的,都应该在silverlight/wpf时代用一下xamlspy,让你重新找到用spy++看别人程序的UI ...

  5. JavaScript面向对象轻松入门之抽象(demo by ES5、ES6、TypeScript)

    抽象的概念 狭义的抽象,也就是代码里的抽象,就是把一些相关联的业务逻辑分离成属性和方法(行为),这些属性和方法就可以构成一个对象. 这种抽象是为了把难以理解的代码归纳成与现实世界关联的概念,比如小狗这 ...

  6. 【Selenium】Selenium1

    一.Selenium1组件 (1)Selenium服务器,负责启动关闭浏览器:解释和运行从测试程序中传来的Selenium命令:HTTP代理:获取和验证在浏览器和被测试的应用程序之间的传递的HTTP消 ...

  7. python os模块学习

    一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的. 二.常用方法 1.os.name 输出字符串指示正在使用的平台.如果是wi ...

  8. iOS,Android,Jave后台AES加密解密

    AES256 在iOS和Android上的相关代码: http://www.tuicool.com/articles/RVFbmmU 里面可以下载相关的代码. 我们遇到的问题是: 把Android的代 ...

  9. Hybrid App开发之jQuery基础

    前言: 前面学习了JavaScript/Html/Css的基础知识,今天学习一下常用js框架jQuery的使用进行快速的开发. JQuery的基本功能: 方位和操作DOM元素 控制页面样式 对页面事件 ...

  10. mailto调用本地默认客户端发邮件

    下面介绍如何利用 Mailto功能: 实现 Mailto的基本html代码: <a href="mailto:123@qq.com">点击这里发邮件!</a> ...