iOS逆向攻防之HASH,数字签名,对称加密算法在密码学中,加密部分主要分为对称加密和非对称加密,非对称加密主要有RSA

那么紧接之前的非对称加密RSA,直接上这次的干货部分

1、Hash概述2、数字签名3、对称加密算法简介4、对称加密算法终端命令5、对称加密算法终端演练6、对称加密算法代码演练7、CCCrypt函数一、Hash概述1、Hash的概念

Hash,一般翻译为'散列',也有直接音译的'哈希',就是把任意长度的输入,通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是散列值的空间通常小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

2、Hash特点

1、算法是公开的2、对相同的数据运算,得到的结果是一样的3、对于不同的数据运算,如MD5(Hash算法的一种)的到的结果默认是128位的,32个字符(16进制标识)4、没法逆运算(因为哈希值是映射关系,会存在散列碰撞【即:无限个数据加密得到有限个数据,就存在一个或许多个数据存在同样的哈希值】)5、信息摘要,信息’指纹‘,一般是用来做数据识别的(由于没法做逆运算,所以一般不会用来做加密数据,只是把数据的哈希值取到,然后用来对比,做数据识别的)3、Hash函数(单向散列函数)

1、MD5(MessageDigestAlgorithm5)2、SHA(SecureHashAlgorithm)SHA又分为:SHA-1SHA-2系列(224,256,384,512,512/224,512/256统称为SHA-2系列)3、MAC(MessageAuthenticationCode)4、CRC(CyclicRedundancyCheck)5、SM3(国产哈希算法)4、Hash用途

什么是HMAC?HMAC(Hash-basedmessageauthenticationcode)是一种使用Hash函数(单向散列函数)来构造消息认证码的方法,利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。主要是为了能让人对对方身份正确性和消息有效性进行验证,与消息摘要的最大不同,就是有签名密钥!

HMAC通过两次hash两个不同的key来生成。目前还没有发现有任何的方法来产生碰撞。

HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的Hash函数(单向散列函数)都可以被用于HMAC。比如使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-384、HMAC-SHA-512。

1、什么是数字签名

数字签名就是用于鉴别数字信息的方法;

2、数字签名

下面我们以电商支付金额这个场景来描述数字签名的具体意义:

图示中,经过RSA加密的原商品信息Hash值这个整体就叫做数字签名。

1、对称加密算法定义:

对称加密方式:就是明文通过密钥加密得到密文。密文通过密钥解密得到明文。

2、对称加密常见算法

1、DES(DataEncryptionStandard):数据加密标准,速度较快,适用于加密大量数据的场合;(题外话:实际上用的不多,因为加密强度不够)2、3DES(TripleDES):是基于DES的对称算法,对相同的数据用3个不同的密钥执行3次加密,强度更高;(题外话:不过因为3个密钥管理起来麻烦,所以一般不是很常用~一出生就挂掉了,很惨。。。)3、RC2和RC4:用变长密钥对大量数据进行加密,比DES快哦~4、AES(AdvancedEncryptionStandard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,在21世纪AES标准的一个实现是Rijndael算法;(题外话:很安全,苹果的钥匙串访问就是用的AES,美国国家安全局也是用的AES,想要暴力破解基本不可能)3、对称加密应用模式对称加密主要有两种应用模式,下面来详细介绍一下

ECB(ElectronicCodeBook):电子密码本模式。每一块数据,独立加密。

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

CBC(CipherBlockChaining):密码分组链接模式。使用一个密钥和一个初始化向量(IV)对数据进行加密。

CBC可以有效的保证密文的完整性,如果一个数据块在传递时丢失或者改变,后面的数据无法进行正常的解密。

AES对称加密算法两种应用模式下的终端命令分别如下:1、AES(ECB)的加密与解密

AES(ECB)加密'battleMage'字符串

$echo-nbattleMage|opensslenc-aes-128-ecb-K616263-nosalt|base64AES(ECB)解密'battleMage'字符串

$echo-nkXcE5nnetsinAMBEcK6D5g==|base64-D|opensslenc-aes-128-ecb-K616263-nosalt-d2、AES(CBC)的加密与解密

AES(CBC)加密'battleMage'字符串

$echo-nbattleMage|opensslenc-aes-128-cbc-iv0102030405060708-K616263-nosalt|base64AES(CBC)解密'battleMage'字符串

$echo-nH3tn3dXCEtKNvijJYLsStw==|base64-D|opensslenc-aes-128-cbc-iv0102030405060708-K616263-nosalt-d五、对称加密算法终端演练对比1、新建一个message.txt文本文件

$vimessage.txt回车进入编辑界面,点击'i',进入编辑界面,输入5排'1234567890',点击'esc',再点击'shift+:',输入'wq'回车保存。

2、对该'message.txt'文件直接使用AES(ECB)进行加密,然后输出一个'meg1.bin'文件

$opensslenc-des-ecb-K616263-nosalt-inmessage.txt-outmeg1.bin直接敲回车,得到一个meg1.bin的文件

然后直接修改message.txt文件,把最后一排的第一个1改成2,

再次使用上述命令进行加密,然后输出一个'meg2.bin'文件

$opensslenc-des-ecb-K616263-nosalt-inmessage.txt-outmeg2.bin直接敲回车,得到一个meg2.bin的文件

接下来使用xxd命令查看meg1.bin和meg2.bin文件

同样通过AES(CBC)加密'message.txt'并输出一个‘meg3.bin’文件

$opensslenc-aes-128-cbc-iv0102030405060708-K616263-nosalt-inmessage.txt-outmeg3.bin再次手动编辑message.txt文件,把message.txt还原,然后通过AES(CBC)加密并输出一个‘meg4.bin’文件

$opensslenc-aes-128-cbc-iv0102030405060708-K616263-nosalt-inmessage.txt-outmeg4.bin对比如下图,

接下来开始代码演练部分,需要导入一个工具类,工具类代码并不多,这里直接贴工具类的内容吧,工具类头文件AES,DES各种终端命令也都包含在内了:

.h文件

2019-10-1221:57:26.858675+0800CryptDemo[1790:115503]AES(ECB)加密的结果是:d1QG4T2tivoi0Kiu3NEmZQ==2019-10-1221:57:26.858896+0800CryptDemo[1790:115503]AES(ECB)解密的结果是:hello2019-10-1221:57:26.859040+0800CryptDemo[1790:115503]AES(CBC)加密的结果是:u3W/N816uzFpcg6pZ+kbdg==2019-10-1221:57:26.859194+0800CryptDemo[1790:115503]AES(CBC)解密的结果是:hello七、CCCrypt函数第六步已经使用过封装好的加密工具类EncryptionTools.h,这个工具类只是封装了CCCrypt函数,下面我们来研究一下加密工具的核心函数CCCrypt函数:

使用CCCrypt函数,需要引入系统库

1、还是打开之前的工程,设置函数断点CCCrypt,然后使用真机运行!!!必须用真机,因为真机和模拟器的CPU不一样

2、运行工程,模拟黑客调试,然后点击屏幕出发touchBegin方法,然后断点停在了CCCrypt函数的地方

3、因为函数在调用的时候,都是存在CPU的寄存器上,输入寄存器查看指令

registerreadx6readx6是读取该函数对应的第7个参数,第一个参数是x0

4、拿到地址,然后强转类型,蒙圈了吧,你的数据就泄漏了

所以这个函数不能直接使用,现在只说基础,后面会详细说安全防护~今天就说到这里了~

THE END
1.几种经典的Hash算法的实现源代码(4页)几种经典的算法的实现源代码年月日星期一哈希算法将任意长度的二进制值映射为固定长度的较小二进制值这个小的二进制值称为哈希值哈希值是一段数据唯一且极其紧凑的数值表示形式如果散列一段明文而且哪怕只更改该段落的一个字母随后的哈希都将产生不同的值要找到散列为同一个值的两个不同的输入在计算上是不可能的https://max.book118.com/html/2019/0515/6054020204002031.shtm
2.《一切皆是映射:代码的本质》哈希算法(Hash)哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度为O(1);如果没有时间限制,那么我们可以使用无序数组并进行顺序查找,这样只需要很少的内存。哈希表使用了适度的时间和空间来在这两个极端之间找到了平衡。只需要调整哈希函数算法即可在时间和https://www.jianshu.com/p/fa57d21b9ad7
3.PHP实现sha256哈希算法实例代码php技巧哈希 又称作 “散列”,它接收任何一组任意长度的输入信息,通过 哈希 算法变换成固定长度的数据指纹,该指纹就是 哈希值。总体而言,哈希 可理解为一种消息摘要。在PHP 中有这个函数 hash(),可以计算字符串的哈希值,出于好奇我 Google 了一下哈希计算的具体步骤,并使用 PHP 编写了一套计算 sha-256 哈希值的代码https://www.jb51.net/article/272643.htm
4.哈希算法sha哈希算法sha-256的c++源代码Co**il 上传4.01 KB 文件格式 cpp 哈希 sha c++ 源代码 只适用于学习 // 使用平台: 80x86 // 语言: c/c++ // 具体流程请参考wiki百科 http://zh.wikipedia.org/wiki/SHA%E5%AE%B6%E6%97%8F点赞(0) 踩踩(0) 反馈 所需:3 积分 电信网络下载 https://www.coder100.com/index/index/content/id/1061340
5.C语言实现哈希集合算法附完整源代码C/C++C语言实现哈希集合算法-附完整源代码 哈希集合(hashset)是一种非线性容器,常常用于存储键值对。在哈希集合中,数据的存放位置不固定,而且数据不可重复,能够实现高效的增删改查操作。 本文将介绍如何使用C语言实现一个基于哈希算法的集合。我们将演示如何定义哈希函数、创建哈希表以及实现哈希集合的增删改查操作。 https://download.csdn.net/blog/column/12410832/132572503
6.哈希算法sha256的c++源代码哈希算法sha-1 的c++源代码 学习使用 // 使用平台: 80x86 // 语言: c/c++ // 具体流程请参考wiki百科 http://zh.wikipedia.org/wiki/SHA%E5%AE%B6%E6%97%8F 上传者:skywalker_sun时间:2011-07-03 Algorithm-sha-2.zip Algorithm-sha-2.zip,sha-2算法实现,算法是为计算机程序高效、彻底地完成任务而https://www.iteye.com/resource/skywalker_sun-3413764
7.常见的hash算法介绍学亮编程手记的技术博客这些是仅列举的一些常见的哈希算法,每种算法都有其特定的应用场景和性能特性。在选择哈希算法时,需要根据具体的需求和安全要求进行权衡和选择。 SHA-256 java代码示例 下面是一个使用 Java 的 MessageDigest 类实现 SHA-256 哈希算法的示例代码: import java.nio.charset.StandardCharsets; https://blog.51cto.com/zhangxueliang/6406301
8.Awesome第二,朴素字符串匹配算法思想简单,代码实现也非常简单。2. RK算法? Rabin-Karp 算法,属于BF算法的升级版。? RK 算法的思路是这样的:我们通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子https://github.com/Ty-Chen/Awesome-Backend/blob/5ad253a0f2e82d9b83892a60e01a1e0a855d70b3/Data%20Structure%20and%20Algorithm.md
9.shazam音乐检索算法附完整c代码腾讯云开发者社区整个算法非常简单, 最核心的点是 切分5个频段, 用上了时序信息去算哈希。 对于有时序的数据,肯定要用上时序性维度,不然是有失偏颇的。 之余图片,就要用空间性维度,之余视频,时间和空间都要有。 这个算法简单粗暴,也有效。 严格意义上讲,这个算法的泛化能力有待商榷。 https://cloud.tencent.com/developer/article/1179981
10.算法的乐趣如果随着算法演化,有新的动作需要处理,则只需要在函数表中添加新的条目即可,状态转换的代码不需要做任何改动。 算法需要确定性,分支和跳转看似使得算法具有不确定性,但是实际上,分支的判断和选择都是在所有已确定处理流程的框架中进行的,也就是说,这些选择都是算法确定范围之内的选择,对算法确定性没有影响。虽然分支https://www.ituring.com.cn/book/tupubarticle/5656
11.密码学一文读懂MurMurHash2原始代码 先贴一下原汁原味的代码。 32位哈希算法 #include <iostream>//---// MurmurHash2, by Austin Appleby// Note - This code makes a few assumptions about how your machine behaves -// 1. We can read a 4-byte value from any address without crashing// 2. sizeof(int) == 4// https://developer.aliyun.com/article/952944
12.HMAC类(System.Security.Cryptography)MicrosoftLearn基于哈希的消息身份验证代码 (HMAC) 可用于确定通过不安全通道发送的消息是否已被篡改,前提是发送方和接收方共享密钥。 发送方计算原始数据的哈希值,并将原始数据和 HMAC 作为单个消息发送。 接收方重新计算收到的消息上的哈希值,并检查计算的哈希值是否与传输的哈希值匹配。 https://msdn.microsoft.com/zh-cn/library/system.security.cryptography.hmac.aspx