密码学中的HASH算法
HASH,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 HASH算法的应用HASH算法在当前被广泛的应用在信息传输中的错误校验、信息安全等领域,比如简单地对函数的前几个字节进行crc32校验用于inline...
非对称密码-RSA
本章内容主要为RSA密码的原理以及定位 分组密码在应用和协议的加解密中比较常用,非对称加密RSA因为加密效率的原因更多的用在密钥的分发方面 非对称密码中的RSA在当前互联网时代被广泛使用(网站、app、协议、桌面应用、服务器等等)。RSA加密算法是公钥密码体制中的一种,改算法基于数学理论而不是对称密码中的混淆和扩散。RSA密码算法当中加密和解密使用的是不同的密钥,因此被称为非对称密码。RSA是1977年由罗纳德·里维斯特、阿迪·萨莫尔和伦纳德·阿德曼一起提出的。RSA就是他们三人姓氏开头字母拼在一起的。 RSA原理来自数论相关知识。RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 找素数 选取两个大的随机素数 计算模n和Euler函数φ(n) $n = pq$ $φ(n) = (p-1)(q-1)$ 找$ed ≡ 1 mod...
分组密码-逆向实践
之前几章已经对分组密码的原理以及填充进行了详细分析,本章使用一个demo来进行实战分析 一个两层密钥的demo,第一层是java中的AES,第二层是native层的AES加密 第一层 以32位安装方便进行分析测试 一个简单demo,打开界面是输入框和按钮,点击按钮后校验密码错误的话,会弹窗提示错误 GDA打开看到有360的加固,先脱壳 不想刷脱壳机使用frida_fart_hook脚本脱壳也行,使用方法脚本里面写的很清楚,之前也讲过了这里不再赘述 分析脱壳后的dex 直接查看onClick()函数,看到这里的校验是在test4()函数里面做的,那就继续分析test4() 这里算法特征相关的函数和字符串都已经被隐藏了。这里只能看到一个key、IV以及要与之比较的一个值,不能看到是什么加密和工作以及填充模式 所以如果想要搞清楚这些东西,需要使用hook的方式来获取 编写frida_hook脚本 hook *loadClass()*获取它的参数看是加载了哪个类 hook...
分组密码的填充及工作模式
...
分组密码-AES
本章主要是学习AES如何实现,如何对java中的AES方法进行hook,以及定位so文件中的AES 这里以AES-128为例,会对明文分组进行10轮迭代运算,加密的第1轮到第9轮的函数一样,包括4个操作:字节替换、行位移、列混合和轮密钥加。最后一轮迭代不执行行列混合。另外,在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作。 AES加解密理论 AES实现的原理图 AES的加解密,跟DES一样由左右两部分组成 左边是对明文(16字节)进行的一个10轮的迭代处理 第一轮到第9轮每一轮都有四个操作: AddRoundKey 为 异或SubBytes 为 查表替换ShiftRows 为 按字节循环左移MixColumns 为...
分组密码-DES
...
序列密码之RC4实践篇
...
序列密码RC4理论篇
本章的主要内容为对RC4算法原理的了解和实现 RC4是序列密码中用的非常广泛的一个加解密算法 因为是按位异或,所以显著特征是密文C和明文M的长度肯定是相等的。 RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。在给定一密钥时,会生成一固定序列的字节流,用于和明文进行异或。它加解密使用相同的密钥,因此属于对称加密算法。RC4已经成为一些常用协议和标准的一部分,如1997年的WEP和2003/2004年的WPA;和1995年的SSL,以及后来1999年的TLS。让他如此广泛分布和使用的主要因素是它不可思议的简单和速度,不管是软件还是硬件,实现起来都十分容易。 RC4算法的原理很简单,主要包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两个部分。假设S-box的长度为256,密钥长度为Len。目前RC4在不知道key的情况下还是只能暴力破解,所以它的安全性还是有一定保证的。 KSA 初始化(KSA)算法部分参数1是一个256长度的char型数组,定义为:unsigned char...
密码学初步认识
...
so函数Hook(上)
Xposed插件开发之对so中函数的处理对so中函数的hook跟对java层函数的hook不同,Xposed无法完成对so层函数的hook。需要使用其它的框架编写so层的hook代码,然后通过xposed进行主动调用的方式来完成hook。 这里我们先以32位为例,使用inlineHook框架,不过这个框架只能hook 32位的app 先来创建一个包含有so库的native C++项目,作为目标app 这里strstr方法默认返回的是false,如果我们想通过hook让它的返回结果为true,有几个hook点 hookstrstr()让其在遇到hookso的时候返回的结果为非空 修改testhook()的参数、或者直接修改返回值 对libC函数的hook要注意一点,hook时机要在目标函数调用前 hook...
Hook多dex的app
...
Hook加壳app
本章主要分析怎么处理加壳app 之前几篇文章编写的Xposed插件都是在没有加壳的情况下编写的,如果加壳后应该怎么处理 在应用内部代码被加固的情况下,如何hook到内部代码 因为ClassLoader是壳的ClassLoader 因为Xposed框架Hook的时机是比较早的,如果一个app加壳了,那么Xposed...