JHHK

欢迎来到我的个人网站
行者常至 为者常成

字符串加密

目录

为什么要加密

创建一个stringTest的测试工程,在viewDidLoad方法中添加如下代码:

NSString * key = @"helloWorld!";

编译运行程序,并将编译完成的可执行文件找到,在MachOView软件中打开,如图可清晰的看到程序中所书写的字符串,这就是问什么要进行字符串加密的原因。尤其是程序中存放的重要的字符串比如私钥、对称秘钥等,必须进行加密或转码处理,禁止明文放在程序中。

img

如何加密

对字符串进行了一个简单的异或处理(开发者可以自行制定加密算法)
原理:
X ^ Y ^ Y = X;与同一个数做两次异或运算可得到原值。

步骤:

  • 为字符串选定一个特定的值Y。
  • 将字符串的每一个字符与Y进行异或处理,将异或后的值放在程序中。
  • 使用时将存在本地的字符串与Y进行异或得到原始值,避免了原始字符串以明文方式存放在代码中。

举例:
将hellowWorld!与值 44 进行异或 可得到一个字符数组,如下:
{68,73,64,64,67,123,67,94,64,72,13,0}
该数组就是书写在代码中的字符串,使用时再次与44进行异或运算,可得到hellowWorld!

代码实现

在工程中引入头文件,并添加如下代码:

#import "MJEncryptStringData.h"


NSString * key = mj_OCString(_827969168); 

const char * cKey = mj_CString(_827969168); 

NSLog(@"key=%@,cKey=%s",key,cKey);

MJEncryptString.h

#ifndef MJEncryptString_h
#define MJEncryptString_h

typedef struct {
    char factor;
    char *value;
    int length;
    char decoded;
} MJEncryptStringData;

const char *mj_CString(const MJEncryptStringData *data);

#ifdef __OBJC__
#import <Foundation/Foundation.h>
NSString *mj_OCString(const MJEncryptStringData *data);
#endif

#endif

MJEncryptString.m

const char *mj_CString(const MJEncryptStringData *data){
    if (data->decoded == 1) return data->value;
    for (int i = 0; i < data->length; i++) {
        data->value[i] ^= data->factor;
    }
    ((MJEncryptStringData *)data)->decoded = 1;
    return data->value;
}

NSString *mj_OCString(const MJEncryptStringData *data){
    return [NSString stringWithUTF8String:mj_CString(data)];
}

MJEncryptStringData.h

/* helloWorld! */
extern const MJEncryptStringData * const _827969168;

MJEncryptStringData.m

/* helloWorld! */
const MJEncryptStringData * const _827969168 = &(MJEncryptStringData){
    .factor = (char)44,
    .value = (char []){68,73,64,64,67,123,67,94,64,72,13,0},
    .length = 11
};

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.