5.单向散列函数(获取消息的指纹)1"单向散列函数 --- 获取消息的指纹"
在刑事侦查中,侦查员会用到指纹。通过将某个特定人物的指纹与犯罪现场遗留的指纹进行对比,就能够知道该人物与案件是否存在关联。
针对计算机所处理的消息,有时候我们也需要用到“指纹”。当需要比较两条消息是否一致时,我们不必直接对比消息本身的内容,只要对比它们的“指纹”就可以了。
本章中,我们将学习单向散列函数的相关知识。使用单向散列函数就可以获取消息的“指纹”,通过对比 “指纹”,就能够知道两条消息是否一致。
下面,我们会先简单介绍一下单向散列函数,并给大家展示具体的例子。然后我们将详细介绍现在使用非常广泛的SH...
1"非对称加密也叫公钥密码: 使用公钥加密, 使用私钥解密"
在对称密码中,由于加密和解密的密钥是相同的,因此必须向接收者配送密钥。用于解密的密钥必须被配送给接收者,这一问题称为密钥配送问题。如果使用非对称加密也可以称为公钥密码,则无需向接收者配送用于解密的密钥,这样就解决了密钥配送问题。可以说非对称加密是密码学历史上最伟大的发明。
非对称加密中,密钥分为加密密钥和解密密钥两种。发送者用加密密钥对消息进行加密,接收者用解密密钥对密文进行解密。要理解公钥密码,清楚地区分加密密钥和解密密钥是非常重要的。加密密钥是发送者加密时使用的,而解密密钥则是接收者解密时使用的。...
分组密码的模式
我们在上一章中介绍的DES和AES都属于分组密码,它们只能加密固定长度的明文。如果需要加密任意长度的明文,就需要对分组密码进行迭代,而分组密码的迭代方法就称为分组密码的“模式”。
分组密码有很多种模式,如果模式的选择不恰当,就无法保证机密性。例如,如果使用ECB模式,明文中的一些规律就可以通过密文被识别出来。
分组密码的主要模式(ECB、CBC、CFB、OFB、CTR),最后再来考察一下到底应该使用哪一种模式。
3.1 分组密码
分组密码(blockcipher)是每次只能处理特定长度的一块数据的一类密码算法,这里的一块”就称为分组(block)。此外,一个分组的比特数...
2.1 编码
现代的密码都是建立在计算机的基础之上的,这是因为现代的密码所处理的数据量非常大,而且密码算法也非常复杂,不借助计算机的力量就无法完成加密和解密的操作。
计算机的操作对象并不是文字,而是由0和1排列而成的比特序列。无论是文字、图像、声音、视频还是程序,在计算机中都是用比特序列来表示的。执行加密操作的程序,就是将表示明文的比特序列转换为表示密文的比特序列。
将现实世界中的东西映射为比特序列的操作称为编码(encoding)。例如midnight(深夜)这个词,我们可以对其中的每个字母逐一进行编码,这种编码规则叫作ASCII。
注意这里的m –> 01101101这一...
常用密码技术1.密码1.1 发送者、接收者和窃听者
假设Alice向Bob发送消息。在这个场景中,发出消息的Alice称为 发送者(sender),而收到消息的Bob则称为 接收者(receiver)。
Alice向Bob发送邮件
消息在互联网上传输的时候,可能被恶意窃听者窃听偷看到。
Eve(窃听者)看到消息的内容
裸露的消息内容原本应该只有发送者和接收者两个人知道,但是在传输的过程中就存在被第三方知道的风险。
1.2 加密和解密
Alice不想让别人看到消息的内容,于是可以对消息进行加密(encrypt)后再发送出去。
加密之前的消息称为明文(plaintex...
题目描述:
一问:GCD是同步还是异步情况会开启多线程
答:同步是不会开启新的线程的,异步才会开启新的线程。
这个没啥难度,基本都是必会的。通过代码验证同步在串行队列和并发队列情况下会不会创建新的线程
验证代码:
12345678910dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);dispatch_queue_t conQueue = dispatch_queue_create("conQueue", DISPATCH_QUEUE_CONCURRENT)...
经常听各种人在群里面讨论各种机,linux,mac,windows,单片机的啥都有。讨论的焦点就是在这些机器上到底是高字节在前还是低字节在前。其实这个问题是很简单,只要稍微懂一点c语言知识。对,只要知道如何使用指针就可以做出正确的判断了。甚至你也许连指针都不会也没关系。只要你的电脑上有一个c的编译器,随便百度或者google以下判断的代码,拷贝黏贴上去,然后在运行一下,什么问题都可以搞定了
123456789101112#include <stdio.h>int main() { int x = 1; if(*(char *)&x ...
我想说这真的是一篇非常非常好的文章,它通过对一个实例的API的优化,教会我们如何写出优美简洁的Swift的函数式代码。但是这个文章是视频中作者的口述,所以翻译过程中难免有不当之处。大家可以对着视频和原文进行观看和对比。
原文地址
介绍Swift第一次被公布的一周后,我写了一篇名为“Swift不是函数式”的博文。两年后,Swift仍然不是函数式。这篇文章并没有对此进行阐述,而是将讨论函数式语言几十年来的经验和研究,我们可以用自己快速的方式将这些经验和研究带入Swift。
什么是函数式编程它是单子、仿函数、haskell和优雅的代码。
函数式编程不是一种语言或语法,而是一种思考问题的方式。函...
翻译:https://www.raywenderlich.com/9222-an-introduction-to-functional-programming-in-swift#toc-anchor-012
在本教程中,您将逐步学习如何开始使用函数式编程以及如何编写声明性代码而不是命令式代码。
swift于2014年在WWDC上进入编程世界的大门,它不仅仅是一门新的编程语言。 它为iOS和macOS平台的软件开发提供了便利。
本教程重点介绍其中一种方法:函数式编程,简称FP。 您将了解FP中使用的各种方法和技术。
开始创建一个新的playground通过选择File ▸ New ▸ Pl...
原文链接:https://www.raywenderlich.com/4018226-overloading-custom-operators-in-swift
swift重载自定义运算符 在本Swift教程中,您将学习如何创建自定义运算符,重载现有运算符以及设置运算符优先级。
运算符是任何编程语言的核心构建模块。 你能想象编程而不使用+或=吗? 运算符非常基础,大多数语言都将它们作为编译器(或解释器)的一部分进行处理。 但是Swift编译器并不对大多数操作符进行硬编码,而是为库提供了创建的操作符的方法。 它将工作留给了Swift标准库,用来提供您期望的所有常见操作符。 这种微妙的差异...