热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:对称加密详解,以及JAVA简单实现

 (原)常用的加密有3种1、正向加密,如MD5,加密后密文固定,目前还没办法破解,但是可以能过数据库撞库有一定概率找到,不过现

 


(原)

常用的加密有3种

1、正向加密,如MD5,加密后密文固定,目前还没办法破解,但是可以能过数据库撞库有一定概率找到,不过现在一般用这种方式加密都会加上盐值。

2、对称加密,通过一个固定的对称密钥,对需要传输的数据进行加解密,速度快,但是安全性不高,主要用于企业级内部系统中数据传输。

3、非对称加密,N把公钥,一把私钥,私钥存放在服务器一方保管,公钥放可以放在任何一个客户端,客户端向服务器请求的密文只有拿到了私钥的服务器一端可以解密。

这里有个概念解释一下,

随机盐值(solt):

abcd  ->  MD5加密 ->  E2FC714C4727EE9395F324CD2E7F331F

然后通过撞库的方式,这种简单的字符一般都能很快的被找到

技术分享

如果我定义一个只有自己知道的字符串,放在要加密的文的任何地方,比如我在abcd第二个字符前加上:helloword123123,那么要加密的字符就变成了:ahelloword123123world。

我们对这个再次进行加密:

ahelloword123123world  ->  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 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;
}
}

输出结果为:

技术分享

 


推荐阅读
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文深入探讨了Go语言中的接口型函数,通过实例分析其灵活性和强大功能,帮助开发者更好地理解和运用这一特性。 ... [详细]
  • 本文将详细介绍如何使用Java编程语言生成指定数量的不重复随机数,包括具体的实现方法和代码示例。适合初学者和有一定基础的开发者参考。 ... [详细]
  • 解决PHP项目在服务器无法抓取远程网页内容的问题
    本文探讨了在使用PHP进行后端开发时,遇到的一个常见问题:即在本地环境中能够正常通过CURL获取远程网页内容,但在服务器上却无法实现。我们将分析可能的原因并提供解决方案。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • 本文详细探讨了在Java编程语言中,构造函数、静态代码块和构造代码块的执行顺序。首先明确了静态代码块、构造代码块以及构造函数方法体的执行优先级,随后深入分析了构造函数体执行前的具体步骤,包括父类构造器的调用、非静态变量的初始化等。 ... [详细]
author-avatar
美竹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有