?3.1.1?对称加密的概述

对称加密(也叫私钥加密算法)指加密和解密使用相同密钥的加密算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。

对称加密算法的优点是计算量小、加密速度快、加密效率高。

不足之处是,参与方需要提前持有密钥,一旦有人泄露则系统安全性被破坏;另外如何在不安全通道中提前分发密钥也是个问题,密钥管理非常困难。

基于“对称密钥”的加密算法主要有DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish等。本章将介绍最常用的对称加密算法DES、3DES(TripleDES)和AES。加密过程如图13.4所示.

图3.1?加密解密

?

?

3.1.2?DES和TripleDES算法

DES算法全称为Data Encryption Standard,即数据加密标准算法。DES是加密和解密使用相同密钥的加密算法,也叫做单密钥算法或私钥加密算法,传统密钥算法。它是IBM公司于1975年研究成功并公开发表的。

DES算法的入口参数有三个:Key、Data、Mode。

l?其中Key是DES算法的工作密钥,8个字节共64位;

l?Data是要被加密或被解密的数据;

l?Mode为DES的工作方式,有两种:加密或解密。

在没有密钥的情况下,解密耗费时间非常长,基本上认为没有可能。加密解密耗时和需要加密的文本大小成正比,这是P问题。如果知道明文和对应的密文,求解所用的密钥,这是NP问题。目前还没有NP的求解算法,但是很容易得到验证。想得到NP的解,只能暴力破解(穷举破解)穷举验证成为对称加密仅有的求解方式,求解时间呈指数级增长。

DES算法把64位的明文输入块变为数据长度为64位的密文输出块,其中8位为奇偶校验位,另外56位作为密码的长度。首先,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换,最终由L0输出左32位,R0输出右32位

根据这个法则经过16次迭代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出。DES算法具有极高的安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。56位长密钥的穷举空间为2^56,这意味着如果一台计算机的速度是每秒种检测100万个密钥,那么它搜索完全部密钥就需要将近2285年的时间,因此DES算法是一种很可靠的加密方法。3DES密钥是24字节,即192位二进制。

3.1.3?AES加密

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),由美国国家标准与技术研究院(NIST)于2001年11月26日发布,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法与其他对称密码算法相比更安全、效率更高等特点。

AES使用128位,192位或者256位的密钥长度(密钥分别是:16字节、24字节、32字节),使得它比密钥长度为56位的DES更健壮可靠。

2^64 = 18446744073709551616

2^64这个数大于全球小麦1000年的产量。如果1微秒验证一个密码(1秒验证100万个),穷举需要费时58万年。

?2^256?约= 10 ^ 77

10^80?是当前人类可见宇宙中所有物质原子数目的总和。

3.1.4?AES的加密模式

AES的加密模式对应中文名称如表所示。

加密模式(英文名称及简写) 中文名称 Electronic Code Book(ECB) 电子密码本模式 Cipher Block Chaining(CBC) 密码分组链接模式 Cipher Feedback Mode(CFB) 加密反馈模式 Output Feedback Mode(OFB) 输出反馈模式

ECB:最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。

CBC:明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。

CFB:类似于自同步序列密码,分组加密后,按8位分组将密文和明文进行移位异或后得到输出同时反馈回移位寄存器,优点最小可以按字节进行加解密,也可以是n位的,CFB也是上下文相关的,CFB模式下,明文的一个错误会影响后面的密文(错误扩散)。

OFB:将分组密码作为同步序列密码运行,和CFB相似,不过OFB用的是前一个n位密文输出分组反馈回移位寄存器,OFB没有错误扩散问题。

3.1.5?填充方式

进行DES、3DES和AES三种对称加密算法时,常采用的是PKCS5Padding填充、Zeros填充(0填充)。

1. PKCS5Padding

每个填充的字节都记录了填充的总字节数

“a”填充后结果为:?[97 7 7 7 7 7 7 7] ??

“ab”填充后结果为:?[97 98 6 6 6 6 6 6] ??

“一a”填充后结果为:[228 184 128 97 4 4 4 4]

2. ZerosPadding

全部填充为0的字节

“a”填充后结果为:?[97 0 0 0 0 0 0 0] ?

“ab”填充后结果为:[97 98 0 0 0 0 0 0] ?

“一a”填充后结果为:[228 184 128 97 0 0 0 0]

导读:

如果,你天生喜欢数理化,拥有较强的逻辑思维能力,看到代码就兴奋,无论男女,你就应该去学前端;

如果,你天生爱美,对美的事物都要一探究竟,并且喜欢去创造美的事物,无论男女,你就应该去学UI设计;

当然,想成为真正意义上的前端开发人员,小编建议两者都要懂,两者都要会。

如果,你是初涉IT行业的小白,可能立马作决定也不现实,那么就读完这篇文章吧!来看看UI是什么,前端是什么,UI和前端的区别又是什么呢?

?

点开这篇文章的时候你可能正准备去学前端,但是又听说程序员挺苦逼的,你听说UI设计师这个职位不错,工作体面、收入不错、没有程序员那么烧脑?也或许,你的男朋友是程序员,你对IT这行,什么都不懂,但是又不想比男朋友差太多,不想比他赚的少,他建议你去学UI,所以你想知道UI跟他们那些没日没夜的程序员比起来,哪个更牛逼。

这么多的偶然,让你点开了这篇文章。那么今天我们就说道说道,UI和前端到底是什么?

对于网站来说前端即网站的前台部分包括网站的表现层和结构层。表现层即前端设计,说白了也就是视觉设计,再通俗一点也就是Web端展现出来的你可以看到的“美”的东西;结构层就是涉及的前端开发部分,即网站的前台代码实现,包括基本的HTML和CSS以及JavaScript/ajax,现在最新的高级版本HTML5、CSS3,以及SVG等。

所以,前端包含了视觉设计与前台代码的开发。

不知道说到现在你有没有明白了一些呢?当然,也由此两个不同意义的职位出现了:UI设计师、前端工程师。随着移动端的技术不断发展,也衍生了Android开发和iOS开发,对于这两类今天暂不赘述。

UI设计师简称UID(User Interface Designer),指从事对软件的人机交互、操作逻辑、界面美观的整体设计工作的人。UI设计师的涉及范围包括商用平面设计、高级网页设计、移动应用界面设计及部分包装设计,黑马程序员UI全能设计师也涉及初级代码入门,UI全能设计师是目前中国信息产业中最为抢手的人才之一。

前端工程师,也叫Web前端开发工程师。他是随着web发展,细分出来的行业。Web前端开发技术主要包括三个要素:HTML、CSS和JavaScript。HTML甚至不是一门语言,仅仅是简单的标记语言! CSS只是无类型的样式修饰语言,当然可以勉强算作弱类型语言。JavaScript的基础部分相对来说不难,入手还算快。

前端开发与UI设计的学习区别在于:

前端开发领域有很多自学成“才”的同行,但大多数人都停留在会用的阶段,因为后面的学习曲线越来越陡峭,每前进一步都很难。人们常说:不想当裁缝的司机,不是个好厨师。如果单纯只是学习前端编程语言、而不懂后端编程语言(java , c++ , c , c# , php ,node.js , erlang , golang),也不能算作是优秀的前端工程师。所以,在成为一个优秀的前端工程师的道路上,充满了汗水和辛劳。

而UI全能设计师,零基础入门涉及简单的初级代码入门,代码量仅仅是前端开发的一丢丢。所以,相对于前端开发,UI设计更为通俗易懂,工作体面、简单易学,不烧脑还可以拿高薪。让你了解前端也精通设计,可以优雅的“右键”检查元素看懂最基本的代码语言,明白前端在做什么,亦可以让你精通各类Wed端、移动端设计,合成、特效、切图等等不在话下。

所以,做个前端开发人员,就要做一个不仅精通前端语言,还要涉略后端编程的优秀的前端工程师;做个UI全能设计师,会设计,懂代码,在设计的道路上加上程序员的思维。嗯,就是这个样子。

路漫漫其修远兮,吾将上下而求索。黑马程序员拥有UI设计学院,成就独一无二的UI全能设计师;也有前端与移动开发学院,专属打造互联网行业新贵——前端全栈开发工程师。搞清了什么是前端,什么是UI,你应该知道自己该怎么选择了吧。改变中国IT教育,黑马程序员一直在努力!

之前分享的视频,Python、Java 的居多,现在好像 Go 很火?

后台一堆找我问我要 Go 的。

这让我左右为难啊

不过还是要迎难而上,对不对?

于是,网上一顿搜,找到了一堆

我又进行了筛选

最终确定了一份看着还不错的视频教程

目录

嗯,又是黑马的

├─第1天视频(基本类型、流程控制)

│ 01_课程安排

│ 02_go介绍

│ 03_环境搭建

│ 04_帮助文档的使用

│ 05_第一个go程序

│ 06_命令行运行程序

│ 07_数据类型作用和命名规范

│ 08_变量的声明

│ 09_变量初始化和自动推导类型

│ 10_自动推导类型和赋值区别

│ 11_Printf和Println的区别

│ 12_多重赋值和匿名变量

│ 13_常量的使用

│ 14_多个变量或变量的定义

│ 15_iota枚举

│ 16_类型的分类

│ 17_bool类型

│ 18_浮点型

│ 19_字符类型

│ 20_字符串类型

│ 21_字符和字符串的区别

│ 22_复数类型

│ 23_格式化输出

│ 24_变量的输入

│ 25_类型转换

│ 26_类型别名

│ 27_运算符(上)

│ 28_运算符(下)

│ 29_if的使用

│ 30_if支持初始化语句

│ 31_if_elseif_else的使用

│ 32_switch的使用

│ 33_switch使用的补充

│ 34_for循环的使用

│ 35_range的使用

│ 36_break和continue的区别

│ 37_goto的使用

├─第2天视频(函数、工程管理)

│ 01_昨日回顾

│ 02_无参无返回值函数的使用

│ 03_有参无返回值函数:普通参数列表

│ 04_不定参数类型

│ 05_不定参数的传递

│ 06_有参无返回值函数使用的总结

│ 07_函数只有一个返回值

│ 08_函数有多个返回值

│ 09_函数定义格式总结

│ 10_有参有返回值函数的使用

│ 11_普通函数的调用流程

│ 12_递归函数的调用流程

│ 13_通过递归实现的累加

│ 14_函数类型

│ 15_回调函数

│ 16_匿名函数基本语法

│ 17_闭包捕获外部变量特点

│ 18_闭包的特点

│ 19_defer的使用

│ 20_多个defer的执行顺序

│ 21_defer和匿名函数结合使用

│ 22_获取命令行参数

│ 23_局部变量特点

│ 24_全局变量

│ 25_不同作用域的同名变量

│ 26_工作区介绍

│ 27_导入包的使用

│ 28_工程管理:同级目录

│ 29_工程管理:不同目录

│ 30_init函数的介绍

│ 31_go_intall命令的使用

├─第3天视频(复合类型)

│ 01_昨日回顾

│ 02_变量的内存和变量的地址

│ 03_指针变量的基本使用

│ 04_不要操作没有合法指向的内存

│ 05_new函数的使用

│ 06_值传递

│ 07_地址传递

│ 08_为什么需要数组

│ 09_数组的基本操作

│ 10_数组初始化

│ 11_二维数组的介绍

│ 12_数组比较和赋值

│ 13_随机数的使用

│ 14_冒泡排序原理

│ 15_冒泡排序代码实现

│ 16_数组做函数参数是值拷贝

│ 17_数组指针做函数参数

│ 18_切片介绍

│ 19_数组和切片区别

│ 20_切片的创建

│ 21_切片截取

│ 22_切片和底层数组关系

│ 23_append函数的使用

│ 24_append扩容特点

│ 25_copy的使用

│ 26_切片做函数参数

│ 27_猜数字:产生一个随机的4位数

│ 28_猜数字:取出每一位数

│ 29_猜数字:输入一个4位数并取出每一位

│ 30_猜数字:逻辑处理

│ 31_map介绍

│ 32_map的基本操作

│ 33_map赋值

│ 34_map遍历

│ 35_map删除

│ 36_map做函数参数

│ 37_结构体普通变量初始化

│ 38_结构体指针变量初始化

│ 39_结构体成员的使用:普通变量

│ 40_结构体成员的使用:指针变量

│ 41_结构体比较和赋值

│ 42_结构体做函数参数:值传递

│ 43_结构体做函数参数:地址传递

│ 44_go语言可见性规则验证

├─第4天视频(面向对象编程)

│ 01_昨日回顾

│ 02_面向对象编程

│ 03_匿名字段作用

│ 04_匿名字段初始化

│ 05_成员操作

│ 06_同名字段

│ 07_非结构体匿名字段

│ 08_结构体指针类型匿名字段

│ 09_方法介绍

│ 10_面向过程和面向对象函数区别

│ 11_结构体类型添加方法

│ 12_方法使用总结

│ 13_值语义和引用语义

│ 14_指针类型和普通类型的方法集

│ 15_方法的继承

│ 16_方法的重写

│ 17_方法值

│ 18_方法表达式

│ 19_接口类型介绍

│ 20_接口的定义和实现

│ 21_多态的表现

│ 22_接口继承

│ 23_接口转换

│ 24_空接口

│ 25_通过if实现类型断言

│ 26_通过switch实现类型断言

├─第5天视频(异常、文本文件处理)

│ 01_昨日回顾

│ 02_error接口的使用

│ 03_error接口的应用

│ 04_显式调用panic函数

│ 05_数组越界导致panic

│ 06_recover的使用

│ 07_字符串操作常用函数介绍

│ 08_字符串操作代码验证

│ 09_字符串转换

│ 10_正则表达式(上)

│ 11_正则表达式(中)

│ 12_正则表达式(下)

│ 13_json介绍

│ 14_通过结构体生成json

│ 15_struct_tag的使用

│ 15_通过map生成json

│ 16_json解析到结构体

│ 17_json解析到map

│ 18_文件分类和为什么需要文件

│ 19_文件常用操作接口介绍

│ 20_标准设备文件的使用

│ 21_WriteString的使用

│ 22_Read的使用

│ 23_借助bufio实现按行读取内容

│ 24_文件案例:拷贝文件

├─第6天视频(并发编程)

│ 01_昨日回顾

│ 02_并行和并发的区别

│ 03_go语言并发优势

│ 04_创建goroutine

│ 05_主协程先退出

│ 06_主协程先退出导致子协程没来得及调用

│ 07_runtime.Gosched的使用

│ 08_runtime.Goexit的使用

│ 09_runtime.GOMAXPROCS的使用

│ 10_多任务资源竞争问题

│ 11_channel介绍

│ 12_通过channel实现同步

│ 13_通过channel实现同步和数据交互

│ 14_无缓冲channel

│ 15_有缓冲channel

│ 16_关闭channel

│ 17_通过range遍历channel内容

│ 18_单向channel特点

│ 19_单向channel的应用

│ 20_Timer的使用

│ 21_Timer实现延时功能

│ 22_定时器停止

│ 23_定时器重置

│ 24_Ticker的使用

│ 25_select的作用

│ 26_通过select实现斐波那契数列

│ 27_通过select实现斐波那契数列(画图)

│ 28_select实现的超时机制

├─第7天视频(网络概述、socket编程)

│ 01_昨日回顾

│ 02_网络协议介绍

│ 03_分层模型介绍

│ 04_层和协议

│ 05_mac地址介绍

│ 06_网络层的作用

│ 07_传输层作用

│ 08_应用层功能

│ 10_网络通信条件

│ 11_通信过程如何组包和拆包

│ 12_socket简单介绍

│ 13_cs模型介绍

│ 14_TCP服务器代码编写

│ 15_netcat工具的使用

│ 16_TCP客户端代码编写

│ 17_简单版并发服务器

│ 18_客户端即可输入也可接收服务器回复

│ 19_文件传输原理分析

│ 20_os.Stat的使用

│ 21_传输文件:发送方

│ 22_传输文件:接收方

│ 23_传输文件功能验证

│ 24_并发聊天服务器功能演示

│ 25_并发聊天服务器原理分析

│ 26_并发聊天服务器:广播上线

│ 27_并发聊天服务器:广播消息

│ 28_并发聊天服务器:查询在线用户

│ 29_并发聊天服务器:修改用户名

│ 30_并发聊天服务器:用户主动退出

│ 31_并发聊天服务器:超时处理

├─第8天视频(HTTP编程)

│ 01_昨日回顾

│ 02_web工作流程

│ 03_http协议和url介绍

│ 03_请求包和响应包简单介绍

│ 04_请求报文格式分析

│ 05_服务器如何知道用户需要什么资源

│ 06_响应报文测试方法

│ 07_响应报文格式分析

│ 08_http编程介绍

│ 09_http服务器编程

│ 10_http服务器获取客户端的一些信息

│ 11_http客户端编程

│ 12_百度贴吧小爬虫

│ 13_百度贴吧小爬虫总结

│ 14_并发版网络爬虫

│ 15_段子爬虫:明确目标

│ 16_段子爬虫:爬主页面有用链接

│ 17_段子爬虫:爬取段子页面

│ 18_段子爬虫:把内容存储到文件中

│ 19_段子爬虫:并发爬虫

├─第9天视频(图形界面编程)

│ 01. 课程安排

│ 02. GTK介绍

│ 03. 环境搭建

│ 04. 第一个程序:空白窗口

│ 05. 控件介绍

│ 06. 窗口添加控件

│ 07. 信号介绍

│ 08. 信号处理

│ 09. glade介绍

│ 10. glade的使用

│ 11. 常用控件:窗口

│ 12. 常用控件:标签

│ 13. 常用控件:图片控件

│ 14. 常用控件:进度条

│ 15. 常用控件:按钮

│ 16. 常用控件:行编辑

│ 17. 布局(上)

│ 18. 布局(下)

│ 19. 对话框

│ 20. 定时器介绍

│ 21. 定时器的使用

│ 22. 鼠标点击事件

│ 23. 鼠标移动事件

│ 24. 键盘事件

│ 25. 大小改变事件

│ 26. 绘图介绍

│ 27. 绘图(上)

│ 28. 绘图(下)

│ 29. 无边框窗口移动

├─第10天视频(案例:黑白棋)

│ 01. 昨日回顾

│ 02. 游戏说明(1)

│ 03. 无边框窗口(上)

│ 04. 无边框窗口(下)

│ 05. 背景图_最小化_关闭窗口(上)(1)

│ 06. 背景图_最小化_关闭窗口(下)

│ 07. 界面其它设计

│ 08. 黑白子提示闪动效果

│ 09. 落子原理说明

│ 10. 落子代码实现(上)

│ 11. 落子代码实现(下)

│ 12. 初始化棋子_改变角色

│ 13. 倒计时

│ 14. 吃子

│ 15. 棋子个数统计

│ 16. 胜负判断

│ 17. 机器落子

嗯,又是黑马的

视频初始版本是 8 天的教程,但是后来又发现有 10 天的。

其实 9、10 两天是另外的一个课程:Go 图形化编程部分。

老师还是一个老师,熟悉的口音

这次一起给大家了!

试听感受

老师口音挺重

比如,「闭包的概念」–>「闭包的概练」,了解了?

还有一个特色,喜欢尾音带「得啦~」

应该是南方人

视频截图:

获取方式

关注下方公众号,后台回复【010】领取吧

声明:以上所有资源均来自网络,如有侵权,请联系本人删除。

关注本公众号,后台回复「2018」即可获取传智播客 2018 最新 Python 和 Java 教程。

公众号提供CSDN资源免费下载服务!