前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS RC4加密

iOS RC4加密

原创
作者头像
莫空9081
修改于 2021-08-10 07:31:29
修改于 2021-08-10 07:31:29
1.2K0
举报
文章被收录于专栏:iOS 备忘录iOS 备忘录

iOS RC4加密

iOS RC4加密的实现,要注意加密后生成字符串的步骤,有些要求是base64加密后输出,有些要求是字节数组转16进制字符串输出,所以要特别注意。

代码如下:

代码语言:txt
AI代码解释
复制
// rc4加密
- (NSString *)rc4Encode:(NSString *)aInput key:(NSString *)aKey {
    NSMutableArray *iS = [[NSMutableArray alloc] initWithCapacity:256];
        NSMutableArray *iK = [[NSMutableArray alloc] initWithCapacity:256];
        for (int i= 0; i<256; i++) {
            [iS addObject:[NSNumber numberWithInt:i]];
        }
        int j=1;
        for (short i=0; i<256; i++) {
            UniChar c = [aKey characterAtIndex:i%aKey.length];
            [iK addObject:[NSNumber numberWithChar:c]];
        }
        j=0;
        for (int i=0; i<256; i++) {
            int is = [[iS objectAtIndex:i] intValue];
            UniChar ik = (UniChar)[[iK objectAtIndex:i] charValue];
            j = (j + is + ik)%256;
            NSNumber *temp = [iS objectAtIndex:i];
            [iS replaceObjectAtIndex:i withObject:[iS objectAtIndex:j]];
            [iS replaceObjectAtIndex:j withObject:temp];
        }
        int i=0;
        j=0;
        Byte byteBuffer[aInput.length];
        for (short x=0; x<[aInput length]; x++) {
            i = (i+1)%256;
            int is = [[iS objectAtIndex:i] intValue];
            j = (j+is)%256;
            int is_i = [[iS objectAtIndex:i] intValue];
            int is_j = [[iS objectAtIndex:j] intValue];
            int t = (is_i+is_j) % 256;
            
            // 先交换位置,再取值
            [iS exchangeObjectAtIndex:i withObjectAtIndex:j];
            
            int iY = [[iS objectAtIndex:t] intValue];
            UniChar ch = (UniChar)[aInput characterAtIndex:x];
            UniChar ch_y = ch^iY;
            byteBuffer[x] = ch_y;
        }
    
    // 字节数组转16进制字符串输出
    NSString *resultString = [self stringFromByte:byteBuffer length:aInput.length];
    
//    NSData *adata = [[NSData alloc] initWithBytes:byteBuffer length:aInput.length];
//    NSString *string = [adata base64EncodedStringWithOptions:0]; // 以base64的加密结果输出
    return resultString;
}

//rc4解密
- (NSString *)rc4Decode:(NSString *)data key:(NSString*)secret{
    // 如果是16进制字符串
    NSData *raw = [self ByteDataFromString:data];
    
    // 如果是base64加密后字符串
//    NSData *raw = [[NSData alloc] initWithBase64EncodedString:data options:0];
    
    int cipherLength = (int)raw.length;
    UInt8 *cipher = malloc(cipherLength);
    [raw getBytes:cipher length:cipherLength];
    NSData *kData = [secret dataUsingEncoding:NSUTF8StringEncoding];
    int keyLength = (int)kData.length;
    UInt8 *kBytes = malloc(kData.length);
    [kData getBytes:kBytes length:kData.length];
    UInt8 *decipher = malloc(cipherLength + 1);
    UInt8 iS[256];
    UInt8 iK[256];
    int i;
    for (i = 0; i < 256; i++){
        iS[i] = i;
        iK[i] = kBytes[i % keyLength];
    }
    int j = 0;
    for (i = 0; i < 256; i++){
        int is = iS[i];
        int ik = iK[i];
        j = (j + is + ik)% 256;
        UInt8 temp = iS[i];
        iS[i] = iS[j];
        iS[j] = temp;
    }
    int q = 0;
    int p = 0;
    for (int x = 0; x < cipherLength; x++){
        q = (q + 1)% 256;
        p = (p + iS[q])% 256;
        int k = iS[p];
        iS[p] = iS[q];
        iS[q] = k;
        k = iS[(iS[q] + iS[p])% 256];
        decipher[x] = cipher[x] ^ k;
    }
    free(kBytes);
    decipher[cipherLength] = '\0';
    return @((char *)decipher);
}

// 字节数组转
- (NSString *)stringFromByte:(Byte *)byteBuffer length:(NSInteger)length {
    NSMutableString *hexString = [[NSMutableString alloc] init];
    for (int i = 0; i < length; i++) {
        [hexString appendString:[NSString stringWithFormat:@"%0.2hhx", byteBuffer[i]]];
    }
    return [hexString uppercaseString];
}

- (NSData *)ByteDataFromString:(NSString *)targetStr {
    NSInteger len = [targetStr length] / 2;    // Target length
    unsigned char *buf = malloc(len);
    unsigned char *whole_byte = buf;
    char byte_chars[3] = {'\0','\0','\0'};

    int i;
    for (i=0; i < [targetStr length] / 2; i++) {
        byte_chars[0] = [targetStr characterAtIndex:i*2];
        byte_chars[1] = [targetStr characterAtIndex:i*2+1];
        *whole_byte = strtol(byte_chars, NULL, 16);
        whole_byte++;
    }

    NSData *data = [NSData dataWithBytes:buf length:len];
    free( buf );
    return data;
}

参考

iOS,objectC,RC4加密解密方法

iOS 二进制数组转成16进制字符串

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang语言情怀-第65期 Go 语言标准库翻译 crypto/rc4
Cipher是一个使用特定密钥的RC4实例,本类型实现了cipher.Stream接口。
李海彬
2021/03/09
6280
ios数据类型转换
NSString*aString = [[NSString alloc] initWithData:adata encoding:NSUTF8StringEncoding];
用户7108768
2021/10/29
7980
iOS开发之AES+Base64数据混合加密与解密
allluckly.cn.jpg "APP的数据安全已经牵动着我们开发者的心,简单的MD5/Base64等已经难以满足当下的数据安全标准,本文简单的介绍下AES与Base64的混合加密与解密" AES:高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)
Bison
2018/07/04
1.6K0
漫谈iOS安全
经常都能听到大家说,iOS很安全,iPhone比安卓手机安全。那么为什么iOS会安全,难道仅仅是因为iOS是闭源然后安卓是开源的,开源的就一定比闭源安全?前段时间著名的Xcode Ghost 事件也让人觉得iOS好像并不是那么地安全,今天就随便说说iOS的安全。
Helloted
2022/06/06
4900
漫谈iOS安全
NSData 与 NSString,Byte数组,UIImage 的相互转换
NSData-> NSString NSString *aString = [[NSString alloc] initWithData:adataencoding:NSUTF8StringEncoding]; NSString->NSData NSString *aString = @"1234abcd"; NSData *aData = [aString dataUsingEncoding: NSUTF8StringEncoding]; 2.NSData 与 Byte NSData-> Byte数组 N
好派笔记
2021/10/29
1.1K0
RC4加密原理,代码解析,逆向小技巧.
​ RC4是一种对称加密算法,加密和加密使用同一个函数. 其中关于其历史这里也不多说了.
IBinary
2020/11/26
1.8K0
RC4加密原理,代码解析,逆向小技巧.
iOS本地动态验证码生成
@property (strong, nonatomic) NSArray *dataArray;//字符素材数组
conanma
2021/05/10
6840
iOS开发——大大节省代码量的小技巧
总结一些开发中的常用方法,大量节省开发时间 觉得好用的,烦请帮点喜欢 1. 判断手机号码格式是否正确,利用正则表达式验证 + (BOOL)isMobileNumber:(NSString *)mobileNum { if (mobileNum.length != 11) { return NO; } /** * 手机号码: * 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[6, 7
Originalee
2018/08/30
4780
iOS Bluetooth 打印小票(二)
在上一篇中介绍了打印小票所需要的命令,这一篇介绍Bluetooth连接蓝牙和打印小票的全过程。
Haley_Wong
2018/08/22
3.4K0
iOS Bluetooth 打印小票(二)
iOS开发之CFHttpMessageRef的那些坑
在上一篇文章iOS开发之NSURLProtocol的那些坑中,介绍了一些NSURLProtocol使用过程中可能遇到的问题,今天我们就接着说CFHttpMessageRef。 或许你还没用过CFHttpMessageRef,应该说还没遇到需要使用这个的场景,当然,老司机就另当别论了。这是个iOS系统中非常底层的网络通讯接口,已经接近于UNIX系统的socket通信了,使用CFHttpMessageRef进行HTTP连接的好处就是控制的粒度更细了,例如你可以设置SSL连接的PeerName,证书验证的方式,还
forrestlin
2018/05/24
2.3K0
一文学会iOS蓝牙开发
最近做APP对接蓝牙设备开发,这里分享一下iOS对接蓝牙设备中需要注意的东西,大致包含下面这些方面:
莫空9081
2023/12/27
2.5K0
H.264封装成FLV
H264是一个个NALU单元组成的,每个单元以00 00 01 或者 00 00 00 01分隔开来,每2个00 00 00 01之间就是一个NALU单元。我们实际上就是将一个个NALU单元封装进FLV文件。
Helloted
2022/06/07
1.3K0
H.264封装成FLV
RSA der加密 p12解密以及配合AES使用详解
在前面的文章中我有说过AES和RSA这两种加密方式,正好在前段时间再项目中有使用到,在这里再把这两种加密方式综合在一起写一下,具体到他们的使用,以及RSA各种加密文件的生成。
Mr.RisingSun
2019/08/14
2.3K0
RSA der加密 p12解密以及配合AES使用详解
iOS开发·NSString字符串的各种基本操作,数值转换及衍生操作
但有时候,仅仅停留在这些基本操作还不能直接满足一些需求,这时候可以利用这些基本操作进行一些字符串的衍生操作。
陈满iOS
2018/09/10
2.3K0
腾讯云V3签名方法之iOS
签名方法 v3 (TC3-HMAC-SHA256)功能上覆盖了以前的签名方法 v1,而且更安全,支持更大的请求,支持 json 格式,性能有一定提升,推荐使用该签名方法计算签名。
许岳操
2020/08/03
3.5K0
腾讯云V3签名方法之iOS
C#笔记:RC4算法实现
public class RC4Cryptor     {                 public byte[] Encrypt(byte[] data, string pwd)         {             SymmetricAlgorithm sa = RC4Creator.Create(); ;             //             byte[] inputByteArray = data;//得到需要加密的字节数组             //设置密钥及密钥
超级大猪
2019/11/21
1.7K0
iOS开发·第三方数据库处理框架:Realm 基本用法
除了FMDB,Realm也是一种很流行的数据库方案。 1. 官方资料 (最新版)Realm Objective‑C官方文档地址 https://realm.io/docs/objc/latest/ (中文版)Realm Objective‑C官方文档地址(内容相对英文版不一定是最新的)https://realm.io/cn/docs/objc/latest/ Realm官方API查阅手册 https://realm.io/docs/objc/latest/api/ GitHub源码地址 http
陈满iOS
2018/09/10
1.2K0
iOS常用加密算法
这里AES在iOS加过密以后以nsdata的形式存下来,如果想以nsstring形式存储,那么对nsdata进行base64位编码。
用户8983410
2021/10/31
7370
iOS的各种加密方法使用简介
<pre name="code" class="objc"><span style="font-size:18px;color:#cc0000;background-color: rgb(204, 204, 204);">本文主要记载了本文在以往工作中涉及到得加密方式记载以便以后使用:在以往的工作中我们iOS客户端的加密主要应用于接口参数传递安全、二维码信息加密、签名验证等等,不同的应用应该采用不同的加密方法比如支付宝RSA加密,公私钥匹配的模式,微信支付sha1和md5加密都是对于支付来说很安全的,具体
星宇大前端
2019/01/15
1.2K0
三重Des对称加密在Android、Ios 和Java 平台的实现
如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在android、ios、java平台的使用方法;
freesan44
2018/09/05
1.3K0
相关推荐
Golang语言情怀-第65期 Go 语言标准库翻译 crypto/rc4
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档