Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将某些哈希代码从.net语法转换为objective-c_Ios_Iphone_.net_Objective C_Sha1 - Fatal编程技术网

Ios 将某些哈希代码从.net语法转换为objective-c

Ios 将某些哈希代码从.net语法转换为objective-c,ios,iphone,.net,objective-c,sha1,Ios,Iphone,.net,Objective C,Sha1,我正在尝试将一些用.NET编写的hashcode翻译成Objective-c语法 SHA1 sha1 = new SHA1CryptoServiceProvider(); string hashedword = Convert.ToBase64String(sha1.ComputeHash(Encoding.ASCII.GetBytes(saltkey))) 这就是我目前所拥有的 NSData *data = [password dataUsingEncoding:NSUTF8Strin

我正在尝试将一些用
.NET
编写的hashcode翻译成
Objective-c
语法

SHA1 sha1 = new SHA1CryptoServiceProvider();
   string hashedword = Convert.ToBase64String(sha1.ComputeHash(Encoding.ASCII.GetBytes(saltkey)))
这就是我目前所拥有的

NSData *data = [password dataUsingEncoding:NSUTF8StringEncoding];
    NSString *unicodePassword = [[NSString alloc] initWithData:data encoding:NSUnicodeStringEncoding];
    data = [unicodePassword dataUsingEncoding:NSUnicodeStringEncoding];
    unsigned char hash[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1([data bytes], [data length], hash);
    NSData *result = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];
最后我想要一个
散列的NSString


有人能帮我吗?

如果您需要最终的base-64字符串,您可以使用此代码,它可以调用新的iOS 7
base64EncodedStringWithOptions
,也可以调用早期版本中现在已弃用(以前是私有的)
base64encodeing
方法:

NSString *string;

if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
    string = [result base64EncodedStringWithOptions:kNilOptions];  // iOS 7+
} else {
    string = [result base64Encoding];                              // pre iOS7
}

nsuincodesingecoding
转换在您的代码中看起来很可疑,似乎 没有必要。您必须使用与.NET代码相同的编码

我不能用.NET测试这个,但是 根据,
Encoding.ASCII
使用 所有非ASCII字符的替换字符

没有等效的
NSStringEncoding
,但结果相同 可通过CoreFoundation方法实现:

NSString *password = ... // your password

CFIndex asciiLength;
// Determine length of converted data:
CFStringGetBytes((__bridge CFStringRef)(password), CFRangeMake(0, [password length]),
                 kCFStringEncodingASCII, '?', false, NULL, 0, &asciiLength);
// Allocate buffer:
uint8_t *asciiBuffer = malloc(asciiLength);
// Do the conversion:
CFStringGetBytes((__bridge CFStringRef)(password), CFRangeMake(0, [password length]),
                 kCFStringEncodingASCII, '?', false, asciiBuffer, asciiLength, NULL);
现在可以计算SHA1散列:

unsigned char hash[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(asciiBuffer, asciiLength, hash);
free(asciiBuffer);
NSData *result = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];
最后是哈希中的Base64编码字符串。从iOS 7开始, 有一种内置方法:

NSString *base64 = [result base64EncodedStringWithOptions:0];
更好的选择是使用UTF-8编码而不是ASCII编码 (适用于.NET和Objective-C)。 在这种情况下,代码将简化为

NSData *data = [password dataUsingEncoding:NSUTF8StringEncoding];
unsigned char hash[CC_SHA1_DIGEST_LENGTH];
CC_SHA1([data bytes], [data length], hash);
NSData *result = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];
NSString *base64 = [result base64EncodedStringWithOptions:0];

如果密码只包含ASCII字符,则两种方法都给出相同的结果。

除此之外,您建议更改为UTD8编码是值得考虑的事情。