我想写功能,从.NET函数是
目标创造SHA512字符串 公共静态字符串GetSHA512(字符串strPlain)
{
统一codeEncoding UE =新的统一codeEncoding();
byte []的散列值= NULL;
byte []的MessageBytes = UE.GetBytes(strPlain);
System.Security.Cryptography.SHA512Managed SHhash =新System.Security.Cryptography.SHA512Managed();
字符串strHex =的String.Empty;
散列值= SHhash.ComputeHash(MessageBytes);
的foreach(在散列值BYTE B)
{
strHex + =的String.Format({0:X2},B);
}
返回strHex;
}
这给出的结果
输入:pass123
输出: 2a6353744cc2914c602265f50d2e413d0561368775756392517abb340ef75d52ee0c5d3623ddd1826fd768a13dca8961f5957c75df0d793b9d7537aabe050705
我已经试过是如下
- (的NSString *)createSHA512:(的NSString *)的字符串
{
为const char * CSTR = [字符串cStringUsingEncoding:NSUTF8StringEncoding]。
的NSData *数据= [NSData的dataWithBytes:CSTR长度:string.length减]
uint8_t有消化[CC_SHA512_DIGEST_LENGTH]
CC_SHA512(data.bytes,data.length,消化);
的NSMutableString *输出=的NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH]。
的for(int i = 0; I< CC_SHA512_DIGEST_LENGTH;我++)
[输出appendFormat:@%02X,消化[I]];
返回输出;
}
这给下面
结果 输入:pass123
输出: fd37ca5ca8763ae077a5e9740212319591603c42a08a60dcc91d12e7e457b024f6bdfdc10cdc1383e1602ff2092b4bc1bb8cac9306a9965eb352435f5dfe8bb0
任何人都可以请建议我究竟做错了什么?
为什么这两个值不同?
请纠正我的错误。
修改
平均值,而我试图改变编码 NSUTF16StringEncoding
和 NSUni codeStringEncoding
这结果还是不同的,因为如下
输入:pass123
输出: 514331e3f7ca0a295539347ebccc4e4f095fe5f3c1df10d43b4d550144c7b30ba9507831893ea63ea22e62e993be529b0d14be7800a90aa0de199d6be62a5f1b
解决方案
试错的功能一点,搜索compitable版本编码这里找到帮我解决问题。
在功能转换为const char是不使用默认的方法提供必要的,这样去除,并直接转换后的字符串数据。
- (的NSString *)createSHA512:(的NSString *)字符串{
的NSData *数据= [字符串dataUsingEncoding:NSUTF16LittleEndianStringEncoding]。
uint8_t有消化[CC_SHA512_DIGEST_LENGTH]
CC_SHA512(data.bytes,data.length,消化);
的NSMutableString *输出=的NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH]。
的for(int i = 0; I< CC_SHA512_DIGEST_LENGTH;我++)
[输出appendFormat:@%02X,消化[I]];
返回输出;
}
I am trying to write function for creating sha512 string in objective from .net function which is
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;
}
This gives result as
input : pass123
output: 2a6353744cc2914c602265f50d2e413d0561368775756392517abb340ef75d52ee0c5d3623ddd1826fd768a13dca8961f5957c75df0d793b9d7537aabe050705
What I have tried is as follow
-(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;
}
which gives result below
input : pass123
output: fd37ca5ca8763ae077a5e9740212319591603c42a08a60dcc91d12e7e457b024f6bdfdc10cdc1383e1602ff2092b4bc1bb8cac9306a9965eb352435f5dfe8bb0
Can anyone please suggest what am I doing wrong ?
Why these two values differ ?
Please correct my mistakes.
EDIT
Mean While I have tried changing encoding to NSUTF16StringEncoding
and NSUnicodeStringEncoding
which results still different and as follows
input : pass123
output: 514331e3f7ca0a295539347ebccc4e4f095fe5f3c1df10d43b4d550144c7b30ba9507831893ea63ea22e62e993be529b0d14be7800a90aa0de199d6be62a5f1b
解决方案
Little bit of trial and error in function and searching for compitable version of encoding found here help me to resolve problem.
In function conversion to const char was not necessary so removed and directly converted string to data using default method available.
-(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;
}