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

问题描述 投票:2回答:2

我在Android NDK中使用OpenSSL的SHA512有问题。我已经从guardianproject(https://github.com/guardianproject/openssl-android)克隆并编译了openssl android版本,该版本非常好用。唯一的问题是SHA512无法正常工作。我使用test_deviceid作为inputstring:

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 lib中的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)?可能缺少编译标志?希望有人可以帮助我 - 我需要它来签名检查算法。

谢谢,罗马

android android-ndk openssl sha512
2个回答
2
投票

我找到了解决方案。

SHA512无法使用OpenSSL for Android端口工作(给出不正确的结果)。在使用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成功。

These是我的更改,以防任何人需要一个(静态)构建的OpenSSL(1.0.1 * c *)和一个有效的SAH512算法,用于Android(架构:armeabi,armeabi-v7a和x86)。

要构建:未压缩,cd进入库的项目目录并运行'ndk-build'。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.