gpt4 book ai didi

c# - Windows Phone ANID 到 C# 上的 ANID2 转换?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:35 26 4
gpt4 key购买 nike

Windows Phone 7 有一个名为 ANID 的匿名用户 ID 属性。 Windows Phone 8 已将其替换为 ANID2。区别在于 ANID2 取决于应用的发布者 ID。

可以将 ANID 转换为 ANID2 as the following code sample在 MSDN 节目上。您只需要原始的 WP7 ANID 和发布者 ID (guid)。问题是这个例子是用 C++ 写的。我一直在尝试将它移植到 C# 但没有成功。

算法本身很简单:

var data = HMAC(ANID, publisherId) // Uses SHA-256
var result = ToBase64(data)

问题是我无法获得匹配的结果。我已经通过创建两个应用程序(WP7 和 WP8)确保 C++ 正常工作,在相同的设备上运行它们,然后使用发布者 GUID 从 WP7 应用程序转换 ANID。在 C++ 上,转换后的 ANID2 和来自设备的 ANID2 匹配。在 C# 上,转换后的 ANID2 是另外一回事。

C#代码很简单:

        var anidBytes = System.Text.Encoding.UTF8.GetBytes(this.anidBox.Text);
var publisherGuid = Guid.Parse(this.publisherBox.Text.ToUpper());

var macObject = new HMACSHA256(anidBytes);
var hashed = macObject.ComputeHash(publisherGuid.ToByteArray());

var result = Convert.ToBase64String(hashed);

C++ 版本使用称为 CNG(加密 API:下一代)的东西。这是其中的一些代码:

BCryptOpenAlgorithmProvider(&Algorithm, BCRYPT_SHA256_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG);
BCryptGetProperty(Algorithm,BCRYPT_OBJECT_LENGTH,reinterpret_cast<BYTE*>(&HashObjectLength),PropertyLength,&PropertyLength,0);
BCryptCreateHash(Algorithm, &Hash, HashObject, HashObjectLength, pAnidId, dwAnidLength, 0);
BCryptHashData(Hash, const_cast<BYTE*>(pPublisherId), dwPublisherIdLength, 0);
BCryptFinishHash(Hash, pUniqueId, GETDEVICEUNIQUEID_V1_OUTPUT, 0);

之后使用一些自定义函数将“pUniqueId”转换为 Base64。

感谢任何帮助。

更新:Visual Studio 报告 anidBytes (C#) 和 pAnidId (C++)(这是转换为字节的 ANID 字符串)的长度均为 44。这是 C# 调试器报告字节数组的方式:

C# Byte array

这是 C++ 调试器: C++ version

我不懂 C++,所以不确定这两者是否相同。它们是,但 C++ 在每个字符后都有这些 '\0' 字符,我不确定是否可以。我认为是的,因为两种情况下的长度都报告为 44。

另一个字节数组比较是 publisherGuid (C#) 与 pPublisherId (C++)(发布者 ID 作为 GUID)。我认为他们再次匹配。 C#:

C# byte array

C++:

C++ byte array

如果我在值被加密后查看输出,我可以看到不同之处:

在 C# 上,我得到这段代码的输出:

        var macObject = new HMACSHA256(anidBytes);
var hashed = macObject.ComputeHash(publisherBytes);

字节数组如下所示:

C# crypt result

在 C++ 代码中,如果我检查 pUniqueId(BCryptFinishHash 的结果),我会看到:

C++ hash result

在这两种情况下,长度似乎相同,但结果却不同。

在 C# 上,如果我将编码类型从 UTF8 更改为 Unicode,则 anidBytes 字节数组将更改为:

Unicode

因此它与 C++ 调试器显示的相同。结果也发生了变化,但它仍然与 C++ 不同。这是新的 C# 结果:

C# unicode results

这是 C++ 的正确结果:

Correct result

最佳答案

确保将 ANID 字节数组切成两半,然后再将其用作 HMACSHA256 的 key 。转换算法只需要前 44 个字节而不是整个 88 个字节。不要问我为什么,但是据我所知,如果您查看 http://code.msdn.microsoft.com/wpapps/ANID-to-ANID2-Converter-cc428038 处的示例代码,这是他们在将 ANID 转换为 ANID2 时使用的 C++ 代码中的错误。 - 他们一定是把 wchar 误认为是 char!

关于c# - Windows Phone ANID 到 C# 上的 ANID2 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17987520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com