我正在尝试编写用于在.net函数中创建sha512字符串的函数,这是
public static string GetSHA512(string strPlain)
{
UnicodeEncoding UE = new UnicodeEncoding();
byte[] HashValue = null;
byte[] MessageBytes = UE.GetBytes(strPlain);
System.Security.Cryptography.SHA512Managed SHhash = new System.Security.Cryptography.SHA512Managed();
string strHex = string.Empty;
HashValue = SHhash.ComputeHash(MessageBytes);
foreach (byte b in HashValue)
{
strHex += String.Format("{0:x2}", b);
}
return strHex;
}
这样可以得到结果
input : pass123
output: 2a6353744cc2914c602265f50d2e413d0561368775756392517abb340ef75d52ee0c5d3623ddd1826fd768a13dca8961f5957c75df0d793b9d7537aabe050705
我的尝试如下:
-(NSString *)createSHA512:(NSString *)string
{
const char *cstr = [string cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:string.length];
uint8_t digest[CC_SHA512_DIGEST_LENGTH];
CC_SHA512(data.bytes, data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH];
for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
,结果如下
input : pass123
output: fd37ca5ca8763ae077a5e9740212319591603c42a08a60dcc91d12e7e457b024f6bdfdc10cdc1383e1602ff2092b4bc1bb8cac9306a9965eb352435f5dfe8bb0
任何人都可以建议我做错了什么?
为什么这两个值不同?
请纠正我的错误。
修改
平均值虽然我尝试将编码更改为NSUTF16StringEncoding
和NSUnicodeStringEncoding
,结果仍然不同,如下所示
input : pass123
output: 514331e3f7ca0a295539347ebccc4e4f095fe5f3c1df10d43b4d550144c7b30ba9507831893ea63ea22e62e993be529b0d14be7800a90aa0de199d6be62a5f1b
答案 0 :(得分:5)
在Objective C版本中,您使用UTF-8将文本转换为二进制文件。在.NET版本中,您使用的是UTF-16。这可能不是唯一的差异,但它肯定是一个相关的。
我将您的.NET方法重写为:
public static string GetSHA512(string text)
{
byte[] messageBytes = Encoding.UTF8.GetBytes(text);
byte[] hash;
using (SHA512 hashAlgorithm = SHA512.Create())
{
hash = hashAlgorithm.ComputeHash(messageBytes);
}
StringBuilder builder = new StringBuilder();
foreach (byte b in hash)
{
builder.AppendFormat("{0:x2}", b);
}
return builder.ToString();
}
答案 1 :(得分:4)
功能上的一些试验和错误以及搜索compitable version of encoding found here有助于我解决问题。
在函数转换为const char时没有必要这样删除并使用默认方法将字符串直接转换为数据。
-(NSString *)createSHA512:(NSString *)string {
NSData *data = [string dataUsingEncoding:NSUTF16LittleEndianStringEncoding];
uint8_t digest[CC_SHA512_DIGEST_LENGTH];
CC_SHA512(data.bytes, data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH];
for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
答案 2 :(得分:0)
对于base64encoded string:
-(NSString *)createSHA512Net:(NSString *)string {
NSData *data = [string dataUsingEncoding:NSUTF16LittleEndianStringEncoding];
uint8_t digest[CC_SHA512_DIGEST_LENGTH];
CC_SHA512(data.bytes, data.length, digest);
NSData *out = [NSData dataWithBytes:digest length:CC_SHA512_DIGEST_LENGTH];
NSString *str = [out base64EncodedStringWithOptions:kNilOptions];
return str;
}