iPhone SDK:我如何将一个字符串转换SHA-1和SHA-1为Base64? (对于WSSecurity) [英] iphone SDK : How Can I Convert a string to SHA-1 And SHA-1 to Base64? (for WSSecurity)
本文介绍了iPhone SDK:我如何将一个字符串转换SHA-1和SHA-1为Base64? (对于WSSecurity)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的转换code是我的全部,但它的字符串转换为SHA-1,以十六进制格式。我怎么可以转换SHA-1为base64?
- (的NSString *)摘要:(* NSString的)输入 INT I; 为const char * CSTR = [输入cStringUsingEncoding:NSUTF8StringEncoding];
NSData的*数据= [NSData的dataWithBytes:CSTR长度:input.length]; uint8_t有消化[CC_SHA1_DIGEST_LENGTH] CC_SHA1(data.bytes,data.length,消化); 输出= [的NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
长度:CC_SHA1_DIGEST_LENGTH]; 对于(i = 0; I< CC_SHA1_DIGEST_LENGTH;我++)
{
[输出appendFormat:@%02X,摘要[I]];
}
返回输出;
}
解决方案
有没有内置在iOS中的散列或Base64。你必须推出自己的。查找C实现SHA1在谷歌的;为Base64的,我有一个给你:
的NSString * ToBase64(NSData的* D)
{
静态为const char ALPHABET [] =ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /;
静态常量的NSString * PAD1 = @=* PAD2 = @==; INT L = [Ð长度]
无符号的char * p =(无符号字符*)[d字节]
为unichar [4]块;
的NSMutableString * S = [的NSMutableString stringWithCapacity:(1 + 3)* 4/3];
INT I;
INT MOD = 1%3;
INT LL = L - 模;
无符号整型黑社会;
* NSString的雄克;
对于(i = 0; I< LL; I + = 3)
{
三元=(对[1] - ;&下; 16)| (对第[i + 1];&下; 8)| P [I + 2];
块[0] = ALPHABET [(黑社会>> 18)及0x3F的];
块[1] =字母表[(三元>> 12)及0x3F的];
块[2] =字母表[(三元>→6)及0x3F的];
块[3] = ALPHABET [黑社会&安培; 0x3F的];
雄克= [[NSString的页头] initWithCharacters:块长度:4];
[S appendString:雄克]
[崇德发布]
}
如果(MOD == 1)
{
块[0] =字母表[(对[I]≥→2)及0x3F的];
块[1] =字母表[(对[1] - ; 4;)及0x3F的];
雄克= [[NSString的页头] initWithCharacters:块长度:2];
[S appendString:雄克]
[崇德发布]
[S appendString:PAD2];
}
如果(模== 2)
{
三元=(对[1] - ;&下; 8)| P [I + 1];
块[0] =字母表[(三元>大于10)及0x3F的];
块[1] = ALPHABET [(黑社会>> 4)及0x3F的];
块[2] =字母表[(三元&下; 2)及0x3F的];
雄克= [[NSString的页头] initWithCharacters:块长度:3];
[S appendString:雄克]
[崇德发布]
[S appendString:PAD1];
}
返回S;
}
my convert code is all i have, but it converts a string to sha-1 to hex format. how can i convert sha-1 to base64 ?
-(NSString *)digest:(NSString*)input
int i;
const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, data.length, digest);
output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
length:CC_SHA1_DIGEST_LENGTH];
for(i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
{
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
解决方案
There's no built-in hashing or Base64 in iOS. You'll have to roll your own. Find a C implementation of SHA1 in Google; as for Base64, I've got one for you:
NSString *ToBase64(NSData *d)
{
static const char ALPHABET[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const NSString *PAD1 = @"=", *PAD2 = @"==";
int l = [d length];
unsigned char *p = (unsigned char*)[d bytes];
unichar Chunk[4];
NSMutableString *s = [NSMutableString stringWithCapacity:(l+3)*4/3];
int i;
int mod = l % 3;
int ll = l - mod;
unsigned int triad;
NSString *sChunk;
for(i=0;i<ll;i+=3)
{
triad = (p[i]<<16) | (p[i+1]<<8) | p[i+2];
Chunk[0] = ALPHABET[(triad >> 18) & 0x3f];
Chunk[1] = ALPHABET[(triad >> 12) & 0x3f];
Chunk[2] = ALPHABET[(triad >> 6) & 0x3f];
Chunk[3] = ALPHABET[triad & 0x3f];
sChunk = [[NSString alloc] initWithCharacters:Chunk length:4];
[s appendString:sChunk];
[sChunk release];
}
if(mod == 1)
{
Chunk[0] = ALPHABET[(p[i] >> 2) & 0x3f];
Chunk[1] = ALPHABET[(p[i] << 4) & 0x3f];
sChunk = [[NSString alloc] initWithCharacters:Chunk length:2];
[s appendString:sChunk];
[sChunk release];
[s appendString: PAD2];
}
if(mod == 2)
{
triad = (p[i]<<8) | p[i+1];
Chunk[0] = ALPHABET[(triad >> 10) & 0x3f];
Chunk[1] = ALPHABET[(triad >> 4) & 0x3f];
Chunk[2] = ALPHABET[(triad << 2) & 0x3f];
sChunk = [[NSString alloc] initWithCharacters:Chunk length:3];
[s appendString:sChunk];
[sChunk release];
[s appendString: PAD1];
}
return s;
}
这篇关于iPhone SDK:我如何将一个字符串转换SHA-1和SHA-1为Base64? (对于WSSecurity)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文