.net vs Objective c SHA-512不匹配
我正在尝试编写函数来创buildsha512string在.net函数中的目标
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
任何人都可以请build议我做错了什么?
为什么这两个值有所不同?
请纠正我的错误。
编辑
意思虽然我已经尝试改变编码NSUTF16StringEncoding
和NSUnicodeStringEncoding
结果仍然不同,如下
input : pass123 output: 514331e3f7ca0a295539347ebccc4e4f095fe5f3c1df10d43b4d550144c7b30ba9507831893ea63ea22e62e993be529b0d14be7800a90aa0de199d6be62a5f1b
在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(); }
在这里find一些试用和错误的function,并寻找可编译的编码版本帮助我解决问题。
在函数转换为常量字符是没有必要的,所以删除和直接转换string数据使用默认的方法可用。
-(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; }
对于base64编码的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; }
- 将IOS映像上传到.net服务
- iOS应用程序和.NET应用程序之间的通信
- .net MVCstreamMP4到iDevice问题
- Apple IOS上的C#应用程序
- 在Unity3d中加载iphone的图像
- 继续在Apple的VerifyReceipt上得到21002'java.lang.NullPointerException'
- 如何设置file upload到服务器没有.json扩展到使用.NET框架的内容types“application / json”
- 当不是4字节alignment时,Monotouch浮点指针会抛出NullReferenceExceptionexception
- WCF或Web服务(.asmx)的iOS应用程序?