这是我参与更文应战的第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
000000000000
111111111111
222222222222
880000000000
111111111111
222222222222
000000000000
......
-
改动:
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是链式加密)
注:逆向成长剩余的AES+ECB、AES+CBC
请读者自行演练,这儿就不在做演示了
代码异或演示
相同是经过DES、AES
和 ECB、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比照,加密强度不相同
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,
&逆向挑选;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
-
作业程序
- 经过寄存器获取参数,发现 hello 是明文,这对错二进制怎样算常不安全的
有以下的改进主张
-
1、在体系函数二进制之上做一层封装,例如 运用按位异或(最简略的封装)
-
加密:传入string时,做一次
按位异或运算
-
解密:先解密,再按位异或
-
-
2、方法名混杂 – 即方法名不变,但打包上架后进行了一系列的改动
总结
-
对称加密在iOS中运用的是体系的
CCCrypt
,有11个参数 -
直接运用体系的
CCCrypt
是存在明文走漏的安全隐患的,所以需要在体系函数之上在做一些操作,来确保明文的安全性