2

我在 Android NDK 中遇到来自 OpenSSL 的 SHA512 的问题。我已经从 Guardianproject ( https://github.com/guardianproject/openssl-android ) 克隆并编译了 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,可以在这里找到:https ://github.com/guardianproject/openssl-android/blob/master/crypto/sha/sha512.c#L294

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);

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

谢谢,罗马

4

2 回答 2

2

我找到了解决方案。

SHA512 不适用于 Android 的 OpenSSL 端口(给出不正确的结果)。在处理 Jelly Bean (Android 4.2) AOSP 树(不是NDK)时,我注意到 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 是成功的。

这些是我的更改,以防有人需要使用适用于 Android 的 SAH512 算法(架构:armeabi、armeabi-v7a 和 x86)构建(静态)OpenSSL(1.0.1* c *)。

构建:未压缩,cd 到库的项目目录并运行“ndk-build”。

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

于 2013-12-04T16:35:18.167 回答
0

我遇到了同样的问题,只是因为我 -DB_ENDIAN从其他人那里复制了一个配置选项,如果您使用其他人的配置,请确保您拥有相同的设备,否则没有编译错误表明它,您的程序只是运行有错误。

于 2018-09-15T03:38:15.667 回答