热门标签 | 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;
}
}

输出结果为:

技术分享

 


推荐阅读
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨了如何在发布 XenApp 应用时,通过命令行参数实现启动时的参数传递。特别介绍了静态和动态参数传递的方法,并详细解释了 ICA 文件中两种参数传递方式的区别及安全检查机制。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 一个登陆界面
    预览截图html部分123456789101112用户登入1314邮箱名称邮箱为空15密码密码为空16登 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 本文详细介绍了 Linux 系统中用户、组和文件权限的设置方法,包括基本权限(读、写、执行)、特殊权限(SUID、SGID、Sticky Bit)以及相关配置文件的使用。 ... [详细]
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社区 版权所有