TEA Algorithm Implementation on iOS

近日在项目当中,需要用到TEA算法,从网上找找看看,wiki上解释的比较详细了,具体见点击打开链接。但是相关的中文版本都传疯了,但却都是同一个版本(C/C++),内容完全一样,于是参照了一下相应的算法,写了个Object-C版本的。感谢Jiec的友情帮助。

//Tea Header file

#import <Foundation/Foundation.h>

#include <sys/types.h>

#include <netinet/in.h>



static int KEY[4] = {//加密解密所用的KEY

    0x13E362D, 0xABEDC8AE,

    0x111A0BD, 0x59EP869C

};

@interface Tea : NSObject{

@private

    int _round;

    bool _isNetByte;

    Byte _key[16];

}

#pragma mark - Encrption and Decryption Prototypes

+ (NSString*)encryptByTea:(NSString*)src;

+ (NSString*)decryptByTea:(NSString*)src;

+ (NSString*)encryptByTea:(constByte*) key round:(int)round isNetByte:(BOOL)isNetByte src:(NSString*)src;

+ (NSString*)decryptByTea:(constByte*) key round:(int)round isNetByte:(BOOL)isNetByte encryptedSrc:(NSString*)encryptedSrc;


//Implementation file

#import "Tea.h"

@implementation Tea

#pragma mark - Encrption and Decryption Implementation

- (unsigned long) ntoh:(unsignedlong) netlong{ 

    return self->_key ?ntohl(netlong) : netlong;

}

- (unsigned long) hton:(unsignedlong) hostlong{

    return self->_isNetByte ?htonl(hostlong) : hostlong; 

}

+ (NSString*)encryptByTea:(NSString*)src{

    NSMutableString *result = [[NSMutableStringalloc]init];

     NSRange range;

    for (int offset =0; offset < [src length]; offset +=8) {

        range.location = offset;

        range.length = [src length] - offset;

        NSString *tme = [selfencryptByTea: (const Byte*)KEY round:16isNetByte:YES src:[srcsubstringWithRange:range]];

        [result appendString:tme];

    }

    return [result autorelease];    

}


+ (NSString*)decryptByTea:(NSString*)src{

    NSMutableString *result = [[NSMutableStringalloc]init];

    NSRange range;

    for (int offset =0; offset < [src length]; offset +=8) {

        range.location = offset;

        range.length = [src length] - offset;

        

        NSString *tme = [TeadecryptByTea:(const Byte*)KEY round:16isNetByte:YES encryptedSrc:[srcsubstringWithRange:range]];

        [result appendString:tme];

    }

    return [result autorelease];

}


+ (NSString*) encryptByTea:(constByte*) key round:(int)round isNetByte:(BOOL)isNetByte src:(NSString*)src{

    int encryptedDes[20];

    memset(encryptedDes, 0x00,20);

    

    unsigned int *tmpsrc = (unsignedint*)[src UTF8String];    

    unsigned int *k = (unsignedint*)key;

register int y =ntohl(tmpsrc[0]);

register int z =ntohl(tmpsrc[1]);

register int a =ntohl(k[0]);

register int b =ntohl(k[1]);

register int c =ntohl(k[2]);

register int d =ntohl(k[3]);

registerint delta = 0x9E3779B9;/* (sqrt(5)-1)/2*2^32 */

register int sum =0;

    

while (round--) {/* basic cycle start */

sum += delta;

y += ((z << 4) + a) ^ (z + sum) ^ ((z >>5) + b);

z += ((y << 4) + c) ^ (y + sum) ^ ((y >>5) + d);

} /* end cycle */

encryptedDes[0] = ntohl(y);

encryptedDes[1] = ntohl(z);

    

//    NSLog(@">>>enDes : %s <<< ",(char*)encryptedDes);

    NSStringEncoding  nse = [NSStringdefaultCStringEncoding];

    NSString * str = [NSStringstringWithCString:(char*)encryptedDesencoding:nse];    


    return  str;

}


+ (NSString*)decryptByTea:(constByte*) key round:(int)round isNetByte:(BOOL)isNetByte encryptedSrc:(NSString*)encryptedSrc{

    unsigned long  decryptedDes[20];

    memset(decryptedDes, 0x0,20);    

    NSStringEncoding nse = [NSStringdefaultCStringEncoding];

    char * tmpcs = (char *)[encryptedSrccStringUsingEncoding:nse];

    int *tmpsrc = (int *)tmpcs;    

    int *k = (int*)key;

register int y =ntohl(tmpsrc[0]);

register int z =ntohl(tmpsrc[1]);

register int a =ntohl(k[0]);

register int b =ntohl(k[1]);

register int c =ntohl(k[2]);

    register int d =ntohl(k[3]);

registerint delta = 0x9E3779B9;/* (sqrt(5)-1)/2*2^32 */

register int sum =0;

    

if (round == 32)

sum = 0xC6EF3720;/* delta << 5*/

else if (round ==16)

sum = 0xE3779B90;/* delta << 4*/

else

sum = delta * round;

    

while (round--) {/* basic cycle start */

z -= ((y << 4) + c) ^ (y + sum) ^ ((y >>5) + d);

y -= ((z << 4) + a) ^ (z + sum) ^ ((z >>5) + b);

sum -= delta;

        

} /* end cycle */    

    decryptedDes[0] = ntohl(y);

    decryptedDes[1] = ntohl(z);

    NSString * str = [NSStringstringWithCString:(char*)decryptedDesencoding:nse]; 

    NSLog(@"str:%@",str);

    return str;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值