iOS 抑或算法总结(XOR)

方法1:

//加密

-(NSString *)obfuscate:(NSData *)string withKey:(NSString *)key

{

NSData *data = string;

char *dataPtr = (char *) [data bytes];

  char *keyData = (char *) [[key dataUsingEncoding:NSUTF8StringEncoding] bytes];

char *keyPtr = keyData;

int keyIndex = 0;

for (int x = 0; x < [data length]; x++){

     *dataPtr = *dataPtr++ ^ *keyPtr++;

if (++keyIndex == [key length]) keyIndex = 0, keyPtr = keyData;

}

return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

}

//解密

-(NSString*)encodeString:(NSString*)data :(NSString*)key{

NSString *result=[NSString string];

for(int i=0; i < [data length]; i++){

int chData = [data characterAtIndex:i];

for(int j=0;j<[key length];j++){

int chKey = [key characterAtIndex:j];

chData = chData^chKey;

}

result=[NSString stringWithFormat:@"%@%@",result,[NSString stringWithFormat:@"%c",chData]];

}

return result;

}

方法2:

// 客户端内置私钥
static NSString const *privateKey = @"ef37c9111210854f5986fc9ebb5548b2ae";

@implementation NSData(XOREncrypt)
- (NSData *)xor_decrypt
{
    return [self xor_encrypt];
}

// 加密
- (NSData *)xor_encrypt
{
    // 获取key的长度
    NSInteger length = privateKey.length;

    // 将OC字符串转换为C字符串
    const char *keys = [privateKey cStringUsingEncoding:NSASCIIStringEncoding];

    unsigned char cKey[length];

    memcpy(cKey, keys, length);

    // 数据初始化,空间未分配 配合使用 appendBytes
    NSMutableData *encryptData = [[NSMutableData alloc] initWithCapacity:length];

    // 获取字节指针
    const Byte *point = self.bytes;

    for (int i = 0; i < self.length; i++) {
        int l = i % length;                     // 算出当前位置字节,要和密钥的异或运算的密钥字节
        char c = cKey[l];
        Byte b = (Byte) ((point[i]) ^ c);       // 异或运算
        [encryptData appendBytes:&b length:1];  // 追加字节
    }
    return encryptData.copy;
}
@end

方法3:

#import <Foundation/Foundation.h>

@interface SQHXOREncryptUtil : NSObject

+ (BOOL)xor_encryptWithString:(NSString *)originString toFile:(NSString *)file;

+ (NSData *)xor_encryptWithFilename:(NSString *)filename type:(NSString *)type;

+ (NSData *)xor_encryptWithFile:(NSString *)file;

+ (NSData *)xor_encryptWithString:(NSString *)originString;

@end

@interface NSData(XOREncrypt)

/** 加密 */

- (NSData *)xor_encrypt;

/** 解密 */

- (NSData *)xor_decrypt;

@end

#import "SQHXOREncryptUtil.h"

@implementation SQHXOREncryptUtil

+ (BOOL)xor_encryptWithString:(NSString *)originString toFile:(NSString *)file {

NSData *encryptData = [self xor_encryptWithString:originString];

return [encryptData writeToFile:file atomically:YES];

}

+ (NSData *)xor_encryptWithFilename:(NSString *)filename type:(NSString *)type {

NSString *filepath = [[NSBundle mainBundle] pathForResource:filename ofType:type];

return [self xor_encryptWithFile:filepath];

}

+ (NSData *)xor_encryptWithFile:(NSString *)file {

NSData *data = [NSData dataWithContentsOfFile:file];

return [data xor_encrypt];

}

+ (NSData *)xor_encryptWithString:(NSString *)originString {

NSData *data = [originString dataUsingEncoding:NSUTF8StringEncoding];

return [data xor_encrypt];

}

@end

// 客户端内置私钥

static NSString const *privateKey = @"ef37c9111210854f5986fc9ebb5548b2ae";

@implementation NSData(XOREncrypt)

// 解密

- (NSData *)xor_decrypt {

return [self xor_encrypt];

}

// 加密

- (NSData *)xor_encrypt {

// 获取key的长度

NSInteger length = privateKey.length;

// 将OC字符串转换为C字符串

const char *keys = [privateKey cStringUsingEncoding:NSASCIIStringEncoding];

unsigned char cKey[length];

memcpy(cKey, keys, length);

// 数据初始化,空间未分配 配合使用 appendBytes

NSMutableData *encryptData = [[NSMutableData alloc] initWithCapacity:length];

// 获取字节指针

const Byte *point = self.bytes;

for (int i = 0; i < self.length; i++) {

int l = i % length;                     // 算出当前位置字节,要和密钥的异或运算的密钥字节

char c = cKey[l];

Byte b = (Byte) ((point[i]) ^ c);       // 异或运算

[encryptData appendBytes:&b length:1];  // 追加字节

}

return encryptData.copy;

}

@end

 
时间: 2024-07-30 13:43:29

iOS 抑或算法总结(XOR)的相关文章

ios Swift 算法

// Playground - noun: a place where people can play import Cocoa var nums = Int[]() for _ in 1...50 { nums.append(random()) } nums ////冒泡排序 /* var count = 0; for(var i = 0 ; i < nums.count-1; i++){ for(var j = 0; j < nums.count-i-1;j++){ count++; if

iOS常见算法以及应用

算法比较 关键词 二分 递归 分治 回溯 冒泡排序 思想:两次循环,外层进行循环次数的控制,内层循环,进行数据之间的比较,大的数据上浮(下沉) 12345678910111213141516171819202122232425262728293031323334353637383940 #pragma mark - Objective-C//冒泡排序- (void)bubbleSort:(id)array{ if (!([array isKindOfClass:[NSArray class]]

iOS -- DES算法

算法步骤: DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位(实际用到了56位,第8.16.24.32.40.48.56.64位是校验位, 使得每个密钥都有奇数个1),其算法主要分为两步: 1)初始置换 其功能是把输入的64位数据块按位重新组合,并把输出分为L0.R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位.L0.R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置

iOS 排序算法总结、二分法查找

还有一个:二分插入排序  平均时间O(n2)   稳定 1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插入排序是稳定的.算法时间复杂度O(n2)--[n的平方] main() { int  a[10],j,i,m; for(j=1;j<10;j++) { m=a[j]; for(i=j-1;i>=0;i--) { if(a[i]<m) b

【神经网络】BP算法解决XOR异或问题MATLAB版

第一种 %% %用神经网络解决异或问题 clear clc close ms=4;%设置4个样本 a=[0 0;0 1;1 0;1 1];%设置输入向量 y=[0,1,1,0];%设置输出向量 n=2;%输入量的个数 m=3;%隐层量的个数 k=1;%输出层的个数 w=rand(n,m);%为输入层到隐层的权值赋初值 v=rand(m,k);%为隐层到输出层的权值赋权值 yyuzhi=rand(1,m);%为输入层到隐层的阈值赋初值 scyuzhi=rand(1,1);%为隐层到输出层的阈值赋权

IOS排列算法

冒泡排序 int a[10]={2,54,12,3,6,5,74,54,98,11}; for (int i=0; i<9; i++) { for (int j=0; j<9-i; j++) { int aj=a[j]; int aj1=a[j+1]; if (aj>aj1) { a[j+1] =aj; a[j]=aj1; } } } for (int i=0; i<10; i++) { NSLog(@"%d",a[i]); } 选择排序 int a[9]={2

IOS 九宫格算法

@interface ViewController () @property (nonatomic,strong) NSArray *apps; //获取.plist数据 @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //九宫格的总列数 int totalColumns=5; //1.1个格子的尺寸 CGFloat appW=50; CGFloat appH=60; //2.计算间隙

iOS常见算法(二分法 冒泡 选择 快排)

二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number) { int start = 0; int end = length - 1; int index = 0; while(start < end) { index = start + (end - start)/2 if(a[index] == number){ return index; } else if(a[index] < number){ sta

iOS常见算法笔试问题

1. 给出一个由小写字母组成的字符串,把所有连续出现的 2 个 a 替换成 bb ( 2 个 b ),但是对于超过两个连续的 a,那么这些字符都不作替换.例如: bad -> bad (一个a,不替换) baad -> bbbd (替换成bb) baaad -> baaad (连续三个a,不替换) apaapaaapaa -> apbbpaaapbb (这里连续的a出现了4次,只有第二段和最后一段被替换) - (NSString *)replace:(NSString *)str