这是我参与更文应战的第12天,活动概略检查: 更文应战

iOS 底层原理 + 逆向 文章汇总

本文首要是对称算法的终端演示+代码演示

OpenSSL终端演示

下面首要选用DES、AES逆向思想练习500题 ECB、CBC两两组合的办算法法进行演示,触及的终端指令首要有以下一些

加密

  • AES + ECB加密“hello”字符串

    • echo -n he逆向游览llo | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
  • AES + CBC加密“hello”字符串

    • echo -n hello | openssl enc -aes-12ios是什么意思8-cbc -iv 0102030405060708 -K 616263 -nosalt | base64

解密

  • AES + ECB解密

    • echo -n d1QG4T2tivo逆向i0Kiu3NEmZQ算法的时刻复杂度是指什么== | base64逆向行驶扣几分罚款多少钱 -D | openssl enc -aes-128-ecb -K 616263 -nosalt –异或门逻辑功用d
  • AES + CBC解密

    • echo -n u3W/N816uzFpcg6pZ+kbdg二进制转八进制== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt –d

1、DES + ECB

加密

    • vi abc.txt
000000000000
1逆向工程11111111111
222222222222
000000000000
111111111111
222222222222
000000000000
111111111111
222222算法的五个特性222222
000000000000
111111111111
222222222222
000000000000
111111111111
222222222222
000000000000
111111111111
222222222222
  • 对称加密(默许会加盐):openssl enc -des-ecb -K 016263 -nosalt -in abc.txt -out msg1.bin
    • enc: 标明加密方法,即对称加异或运算

    • msg1.bin: 二进制文件

  • 检查二进制文件:xxd msg1.bin

iOS逆向 08:对称算法(下)
将第二个重复的前两个00,改成88

000000000000
111111111111
222222222222
880000000000
111111111111
222222222222
000000000000
......

检查此时的加密后密文二进制,与上面进行比照
iOS逆向 08:对称算法(下)

  • 改动931f 4a54 79bf 73异或门逻辑电路图0f 4453 2df5 e152 38f1 变成了c7e1 1二进制转十进制计算器de2 c778 9df6 4d79 8bec 04ad 08c4。说明修改两个字符,其最小单位16字节

  • 如果修改逆向行驶扣几分罚款多少钱1个字符,最小单位是8个字节。所以加密进程中,最低是8字节

2、D二进制转化为十进制ES + CBC

  • vi abc逆向思想的比如.txt(内容与1中相算法同)

  • 加密: openssl enc -des-cbc -K 616263 -iv 0102030405060708 -nosaios最好玩的手游lt -in abc.txt -out msg3.bin

  • 修改一个字符,获取 msg4.bin

    • -iv :向量的标明方法

    • 616263 :加异或门逻辑功用密的key,换成 abc 也是二进制八进制十进制十六进制转化可以的

  • 与ECB方法比照:从第2个开始,其二进制就不同了(CBC是链式加密)

iOS逆向 08:对称算法(下)

注:逆向成长剩余的AES+ECB、AES+CBC请读者自行演练,这儿就不在做演示了

代码异或演示

相同是经过DES、AESECB、CBC两两组合的方法进行演示

1、AES + ECB

- (void)testEnc{
//    AES + ECB 加密
NSString *key =二进制 @"abc";
NSString *encStr = [[Encryption异或符号Tools sharedEncryptionT算法的五个特性ools] encryptString:@算法规划与剖析"hello异或门逻辑符号" keyString:key iv:nil];
NSLog(@"AES算法是什么 + ECB : %@", encS算法工程师tr);
}异或门真值表
<!--作业效逆向思想的比如ios模拟器-->
AES + ECB : d1QG4T2t异或符号ivoi0Kiu3NEmZQ==
<!--终端指令-->
$ echo -n hello | open二进制亡者列车ssl enc -aes-128-ecb -K 616263 -nosalt | base64
//与程序作业作用是相同的
d1QG4T2tivoi0Kiu3NEmZQ==
$ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D |openssl enc异或 -aes-128-ecb -K 616263 -nosalt -d
hello%
  • echo -n he异或门逻辑符号llo二进制八进制十进制十六进制转化 输出hello

  • | :标明输出符

  • 注:des 和 aes比照,加密强度不相同

iOS逆向 08:对称算法(下)

2、AES + CBC

- (voiios下载d)testEnc{
//    2、AES + CBC 加密
uint8_t iv[二进制转十进制计算器8] = {1, 2, 3, 4, 5, 6, 7, 8};
NSData *data = [NSData dataWithBytes:iv length:sizeof(iv)];
NSString *key = @"abc";
NSSt二进制手表ring *encStr = [[Encr逆向yptionTools sharedEncryption逆向挑选Tools] encryptString:@"hello" keyString:key iv:data];
/二进制计算器/解密
NSString * decStr = [[EncryptionTools sharedEncryptionTools] decryptString:encStr keyString:key iv:data];
NSLog(@"AES +ios14.4.1更新了什么 CBC : %@", encStr);
NSLog(@"AES + CBC  : %@", decStr);
}
//打印算法工程师和程序员区别作用
AES + CBC : u算法规划与剖析3W/N816u逆向行驶怎样处罚2021zFpcg6pZ+kbdg==
AES + CBC  : hello
<!--终端指令-->
$ echios15正式版别什么时候发布o -n hello | openssl enc -aeioslaunchers-128-cbc -K 616263 -iv 01020304ios1505060708 -nosalt | base64
u3W/N816uzFpcg6pZ+k算法导论bdg==
$ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D |openssl e逆向行驶扣几分罚款多少钱nc -aes-128-cbc -K 616263 -iv 0102030405060708 -nosalt逆向思想的比如 -d
hello%

3、DES + ECB

- (void)testEnc{
//    3、DES + ECB
[EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithmDES;
NSString *key = @"abc";
NSString *encStr =算法工程师和程序员区别 [[EncryptionTools shar异或运算edEncryptionTools] encryptString:@"hello" keyString:key二进制八进制十进制十六进制转化 iv:nil];
NSLog(@"DES + ECB : %@", encStr);
}
//作业作用
DES + ECB : HQr0Oij2kbo=
<!--终端指令-->
$ echo -n hello | openssl enc -des-ecb -K 616263 -nosa算法的时刻复杂度取决于lt | base64
HQr0Oij2kbo=
$ echo -n HQr0Oij2kbo= | base64 -D | openssl enc -des-ecb -K 616263 -nosalt -d
hell逆向思想练习500题o%

4、DES + CBC

- (void)testEnc{
//    4、DES + CBC
[Encryp逆向工程tionTools sharedEncryptionTools].algorithm = kCCAlgorithmDES;
uint8_t iv[8] = {1, 2, 3, 4, 5, 6,异或运算公式 7, 8};
NSData *data = [NSData dataWithBytes:iv length:sizeof(iv)];
NSString异或门逻辑符号 *key = @"二进制计算器abc";
NSString *encStr = [[EncryptionT逆向思想案例100个ools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:data];
//解异或密
NSString *异或 decStr = [[EncryptionTools sharedEncryptionTools] decryptString:encStr keyString:key iv:data];
NSLog(@"AES + CBC : %二进制亡者列车@", encStr);
NSLog(@"AES + CBC  : %@", decStr);
}
//工二进制亡者列车作作用
AES + CBC : alvrvb3Gz88=
AES二进制转八进制 + CBC  : heios8备忘录llo
<!--终端指令-->
$ echo -n hello | openssl enc -des-c异或符号bc -K 616263 -iv 0102030405060708 -nosalt | base64
alvrvb3Gz88=
$ echo -n alvrvb3Gios体系z88= | base64 -D | openssl enc -des-cbc -K 616263 -iv 0102030405060708 -iOSnosalt -d
hello%

加密解二进制转化器密结束

以下是DES、AES的无缺对称加解密的代码封装

<!--h-->
#import <Foundatio算法规划与剖析n/Foundation.h>
#import <CommonCrypto/CommonCrypto.h>
/**
*  终端查验指令
*
*  DES(ECB)加密
*  $ echo -n hello | ope算法的时刻复杂度是指什么nssl enc -des-ecb -K 616263 -nosalt | base64
*
*  DES(CBC)加密
*  $ echo -n hello | openssl enc -des-cbc -iv 0102030405060708 -K 61逆向挑选6263 -nosalt | base64
*
*  AES(ECB)加密
*  $ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
*
*  AES(CBC)加密
*  $ echo -n hello | op算法规划与剖析e算法nssl enc -aes-128-cbc -iv 0102030405060708 -K 616异或运算公式263 -nosalt | base64
*
*  DES(ECB)解密
*  $ echo -n HQr0Oij2k算法的有穷性是指bo= | base64 -D | o二进制penssl enc -des-ecb -K 616263 -nosalt -d
*
*  DES(CBC)解密
*  $ echo -n alvrvb3Gz88= | base64 -D | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -d
*
*  AES(ECB)解密
*  $ echo -n d1QG4T2tivoi0Kiu3NEmZios体系Q== | base64 -D | openssl enc -a异或门逻辑表达式es-128-ecb -K 616263 -nosa逆向思想练习500题lt -d
*
*  AES(CBC)解密
*  $ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -异或门逻辑电路图aes-128算法剖析的意图是-cbc -iv 0102030405060708 -K 616263 -n算法的五个特性osalt -d
*
*  提示:
*      1> 加密进程是先加密,再base64编码
*      2> 解密进异或运算公式程是先base64逆向游览解码,再解密
*/
@interface EncryptionTools : NSObject
+ (instancetype)sharedEncryptionTools;
/**
@constant   kCCAlgorithmAES     高级加密规范,128位(默许)
@constant   kCCAlgorithmDES     数据加密规范
*/
@property (nonatomic, assig算法剖析的意图是n) uint32_t algorithm;
/**算法规划与剖析
*  加密字符串并回来base64编码字符串
*
*  @param string    要加密的字符串算法的时刻复杂度是指什么
*  @param异或门逻辑符号 keyString 加密密钥
*  @param iv        初始化向量(8个字节)
*
*  @return 回来加密后的base6逆向挑选4编码字符串
*/
- (NSString *)encryptString:(NSString *)string keyString:(NSString *逆向思想案例100个)keyString iv:(NSData *)iv;
/**
*  解异或符号密字符串
*
*  @param string    加算法的时刻复杂度取决于密并base64编码后的字符串
*  @param keyString 解密密钥
*  @param iv        初始化向量(8个字节)
*
*  @return 回来解密后的字符串
*/
- (NSStri二进制转八进制ng *)decryptString:(NSString *)string key算法的时刻复杂度是指什么Strios8备忘录ing:(NSString *)keyString iv:(NSData *)iv;
@end
<!--m-->
#import "EncryptionTools.h"
@interfa二进制计算器ce EncryptionTools()
@property (nonatomic, assign) int keySize;
@property (nonatomic, assign) int blockSize;
@end
@implementation En异或门真值表cry异或门符号ptionTools
+ (instancetype)sharedEncryptionTools {ios体系
static EncryptionTools *instance;
static dispatch_once_t onceToken;逆向思想的比如
dispatch_once(&once算法规划与剖析Token, ^{
instance = [[self alloc] init];
instance.algorithm = kCCAlgorithmAES;
});
return instance;
}
- (void)setAlgorithm:(uint32_t)algor算法规划与剖析ithm {
_algorithm = algorithm;
switch (algorithm) {
case kCCAlgorithmAES:
self.keySize = kCCKeySi异或门逻辑电路图zeAES128;
self.blockSize = kCCBlockSiz异或门符号eAES128;
break;
casios体系e kiOSCCAlgorithmDES:
self.keySize = kCCKeySizeDES;
self.blo逆向思想ckSize = kCCBlockSizeDES;
break;
defau逆向lt:
break;
}
}
- (NS二进制计算器String *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv {
//ios下载 设置秘钥
NSData *keyData = [keyString dataios体系Usi异或门逻辑表达式ngEncoding:NSUTF8StringEncoding];
uint8_t cKey[self.keySize];
bzero(cKey, sizeof(cKey));
[keyData getBytes:cKey length:self.ke二进制亡者列车ySize];
// 设置iv
uint8_t cIv[self.blockSize];
b逆向思想练习500题zero(cIv, self.blockSize);
int option = 0;
if (iv) {
[iv getBytes:cIv length:self.blockSize];
option = kCCOptionPKCS7Padding;
} else {
/*
- kCCOptionPKCS7Padding | kCCOptionECBMode 本方法 - ECB方法
- kCCOptionPKCS7Padding 链的方法 - CBC方法
*/
option = kCCOptionPKCS7Padding | kCCO算法的有穷性是指ptionECBMode;
}
// 设置输出缓冲区
NSData *data = [string dataUsingEncoding:NS算法工程师和程序员区别UTF8StringEncoding];
size_t bufferSize = [data length] + self.bloc逆向思想的比如kSize;
void *buffer = malloc(bufferSize);
// 开始加密
size_t encry逆向行驶扣几分罚款多少钱ptedSize = 0;
//加密解密都是它 -- CCCrypt
/*
- 参数1:kCCEncrypt 加密 / kCCDeccrypt 解密
- 参数2:加密算法
- 参数3:加密选项 ECB / CBC
-二进制八进制十进制十六进制转化 参数4:KEY的地址
- 参异或符号数5:KEY的长度
- 参数6:iv初始化向ios是什么意思量
- 参数7:加密的数据
- 参数8:加密数据的长度
- 参数9:密文的内存地址
- 参数10:密文缓冲区的巨细
-二进制亡者列车 参数11:数据的指针(加密作用巨细)
*/
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
self.algorithm,
option,
cKey,异或符号
self.keySize,
cIv,
[data bytes],
[data length],异或符号
buffer,
bufferSize,
&encryptedSize);
NSData *resu异或lt = nil;
if (cryptStatus == kCCSuccess) {
result = [NSData dataWithBytesNios是什么意思oCopy:buffer length:encryptedS二进制ize];
} else {
free(b二进制亡者列车uffer);
NSLog(@"[过失] 加密失利|状况算法规划与剖析编码: %d", cryptStatus);
}
return [result base64EncodedStringWithOptions:0];
}二进制怎样算
- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv {
// 设置异或运算秘钥
NSData *keyData = [keyString dataUsingEncoding:NSUTF8ios14.4.1更新了什么StringEncoding];
uint8_t cKey[self.keySize];
bzero(cKey, sizeof(cKey));
[keyData算法 getBytes:cKey length:self.keySize];
// 设置iv
uint8_t cIv[self.blockSize];
bzero(cIv, self.blockSize);
int option =ios体系 0;
if (iv) {
[iv getBytes:cIvios15正式版别什么时候发布 length:self.blockSize];
option = kCCOptionPKCS7Padd异或门逻辑功用ing;
} else {
option = kCCOptionPKCS7Padding | kCCOptionECBMode;
}
// 设置输出缓冲区
NSData *data = [[NSDios下载ata alloc] initWithBase64EncodedString:string options:0];
size_t bufferSize = [data length] + self.blockSize;
void *buffer = malloc(bufferSize);ios体系
// 开始解密
size二进制亡者列车_t de算法的有穷性是指cryptedSize = 0;
CCC二进制怎样算ryptorS异或门逻辑功用tatus cryptStatus = CCCrypt(kCCDecr逆向游览ypt,
self.algorithm,
option,
cKey,
self.keySize,
cIv,
[data bytes],
[data length],
buffer,
bufferSize,
&amp逆向挑选;decry二进制转化器ptedSize);
NSData *result = nil;
if (cryptStatus == kCCSuccess) {
result = [N算法是什么SData dataWithB异或门逻辑功用ytesNoCopy:buffer l逆向思想的比如ength:decryptedSize];
} else {
free(bu算法是什么ffer);
NSLog(@"[过失] 解密失利|状况编码: %d", cryptStat异或门真值表us);
}
return [[NSString alloc] initWithData:result encoding:NS二进制计算器UTF8StringEncoding];
}
@end

首要是经过体系的CCCrypt结束,其中触及11个参数,分别是

- 参数1:kCCEncrypt 加密 / kCCDeccrypt 解密
- 参数2:加密算法
- 参数3:加密选项 ECB / CBC
- 参数4:KEY的地址
- 参二进制数5:KEY的长度
- 参数6:iv初始化向量
- 参数7:加密的数据
- 参数8:加密数据的长度
- 参数9:密文的内存地址
- 参数10:密文缓冲ios体系区的巨细
- 参数11:数据的指针(加密作用巨细)

安全隐患:运用体系函数相同有数据走漏的危险

调试CC二进制转化为十进制Crypt

下面我们经过断点调试来说明其安全隐患

  • 加符号断点CCCrypt

  • 作业程序

iOS逆向 08:对称算法(下)

  • 经过寄存器获取参数,发现 hello 是明文,这对错二进制怎样算常不安全的

iOS逆向 08:对称算法(下)

有以下的改进主张

  • 1、在体系函数二进制之上做一层封装,例如 运用按位异或(最简略的封装)

    • 加密:传入string时,做一次按位异或运算

    • 解密:先解密,再按位异或

  • 2、方法名混杂 – 即方法名不变,但打包上架后进行了一系列的改动

总结

  • 对称加密在iOS中运用的是体系的CCCrypt,有11个参数

  • 直接运用体系的CCCrypt是存在明文走漏的安全隐患的,所以需要在体系函数之上在做一些操作,来确保明文的安全性