为什么在Android NDK中使用OpenSSL计算SHA512是错误的

为什么在Android NDK中使用OpenSSL计算SHA512是错误的,android,android-ndk,openssl,sha512,Android,Android Ndk,Openssl,Sha512,我对Android NDK中OpenSSL的SHA512有问题。我已经从guardianproject()中克隆并编译了openssl android版本,它运行得非常好。唯一的问题是SHA512工作不正常。我使用test_deviceid作为输入字符串: Nexus 4: SHA 1: FzEeo2JrQQ6eYO7JedEOrMiki98= SHA 256: 2+Bm6XrPgz6LeFb9PzqGMiAfaCaZqwmfJGQCJj8bbx8= SHA 512: 6LbCI1ygLlL

我对Android NDK中OpenSSL的SHA512有问题。我已经从guardianproject()中克隆并编译了openssl android版本,它运行得非常好。唯一的问题是SHA512工作不正常。我使用test_deviceid作为输入字符串:

Nexus 4:
SHA   1: FzEeo2JrQQ6eYO7JedEOrMiki98=
SHA 256: 2+Bm6XrPgz6LeFb9PzqGMiAfaCaZqwmfJGQCJj8bbx8=
SHA 512: 6LbCI1ygLlLolo5sLDfypMmEODHHyBCe694HP6Tch6tE75vJ3nVAteXglDRS1TYhzXt4cBZkJaDK6tI+Ljgsvw==

Ubuntu commandline (also built from source):
SHA   1: FzEeo2JrQQ6eYO7JedEOrMiki98=
SHA 256: 2+Bm6XrPgz6LeFb9PzqGMiAfaCaZqwmfJGQCJj8bbx8=
SHA 512: dUqkGxOGS9+ZL89JOzFpNHNFokJ2ZqahDOp7ZxRfZ4eoF6B42icUvJW+/g7OA5pBWYkcpGUmZtg0lOg7SmrWJg==
//编辑: 我调用的函数是OpenSSL库中的SHA512,可以在以下位置找到:

可能是因为cpu(ARM)吗?可能是缺少编译标志?希望有人能帮助我-我需要它的签名检查算法


谢谢,罗曼,我找到了解决办法

SHA512与Android的OpenSSL端口不兼容(结果不正确)。 在处理Jelly Bean(Android 4.2)AOSP树(notNDK)时,我注意到OpenSSL($AOSP_ROOT/external/OpenSSL)版本是1.0.1c,而我使用的端口是0.9.8

我设法从AOSP中获取OpenSSL 1.0.1c,并更改了*.mk文件,以便将其作为静态库使用NDK进行编译,尽管构建共享库也非常简单。这并不十分困难,因为NDK构建系统是AOSP构建系统的一个子集,但要做到这一点,应该了解*.mk文件格式

我还尝试了以前版本(1.0.0、1.0.1a和b)中的旧版本,它们在SHA512上也有同样的问题

总之:Android上的SHA512将与任何高于1.0.1c(包括1.0.1c)的OpenSSL版本配合使用。测试1.0.1c,d&e成功

如果有人需要使用SAH512算法构建OpenSSL(1.0.1*c*),Android(体系结构:armeabi、armeabi-v7a和x86)的(静态)版本,我会做一些更改

要构建:未压缩,请将cd放入库的项目目录并运行“ndk build”


顺便说一句-该错误的原因(我认为)不是缺少\不正确的编译标志,而是SHA512 ASM代码(文件:openssl\u 1.0.1c\crypto\sha\ASM\SHA512-armv4.S)中的错误。

我遇到了同样的问题,只是因为我复制了一个配置选项
-DB_ENDIAN
来自其他人,如果您使用其他人的配置, 确保您的设备相同,否则不会显示编译错误
它,你的程序运行时有bug。

你能发布计算SHA512的代码吗?通过这个,其他人可以更好地理解和帮助你。我也面临同样的问题。我使用的是不同的OpenSSL()端口,但结果相似:在Android和Ubuntu上-结果不同。你找到解决方案了吗?嗨,不幸的是没有-我想如果目标cpu是ARM,变量定义可能是短的-例如,只有32位而不是64位或类似的;你说得对。。。你知道NDK的OpenSSL有什么替代方案吗?fries还有一个:但我还没有测试过它。另外值得一提的是:当我在开发OpenSSL的NDK构建时,我不得不将NDK的所有*.s(小写)文件重命名为*.s(大写)文件,以便正确编译这些ASM文件。这是在*.mk更改的基础上完成的。如果有人对每个Android版本使用的openSSL版本感兴趣,请查看git中每个发布标签的文件repo@OmriSela您是否设法将其用于更高版本,如1.01r?您的更改链接已断开,如果您可以更新它,那就太好了。谢谢
unsigned char *deviceid = (unsigned char *)argv[6];
int deviceidLen = strlen(argv[6]);
unsigned char *deviceid64 = NULL;
int deviceid64Len = 0;
unsigned char *params = NULL;
int paramsLen = 0;

LOGD("input %s", deviceid);
paramsLen = 20;
params = (char*)malloc(paramsLen);
SHA1(deviceid, deviceidLen, params);
deviceid64 = base64_encode((const unsigned char*)params, paramsLen, &deviceid64Len);
LOGD("SHA   1: %s\n", deviceid64);
free(params);
free(deviceid64);

paramsLen = 32;
params = (char*)malloc(paramsLen);
SHA256(deviceid, deviceidLen, params);
deviceid64 = base64_encode((const unsigned char*)params, paramsLen, &deviceid64Len);
LOGD("SHA 256: %s\n", deviceid64);
free(params);
free(deviceid64);

LOGD("input %s", deviceid);
paramsLen = 64;
params = (char*)malloc(paramsLen);
SHA512(deviceid, deviceidLen, params);
deviceid64 = base64_encode((const unsigned char*)params, paramsLen, &deviceid64Len);
LOGD("SHA 512: %s\n", deviceid64);
free(params);
free(deviceid64);