针对同一字符串中的SHA-1,在C++和java中发现不同

针对同一字符串中的SHA-1,在C++和java中发现不同,java,encryption,hash,sha1,javax.crypto,Java,Encryption,Hash,Sha1,Javax.crypto,相同字符串的SHA-1不同于Java和C++ 字符串到散列-38902566 java中的SHA-1-6ffc3d4038943971cd91db0cf0f3de8ecf1b2853确认在线sha1工具产生相同的结果 SH+1在C++ +0938D29 33 CE5D92554 50EBF711F3E1AE3BF2 Java实现: MessageDigest md = MessageDigest.getInstance("SHA-1"); byte[] messageDigest =

相同字符串的SHA-1不同于Java和C++

字符串到散列-38902566

java中的SHA-1-6ffc3d4038943971cd91db0cf0f3de8ecf1b2853确认在线sha1工具产生相同的结果

SH+1在C++ +0938D29 33 CE5D92554 50EBF711F3E1AE3BF2

Java实现:

  MessageDigest md = MessageDigest.getInstance("SHA-1");
  byte[] messageDigest = md.digest(customerId.getBytes());
  BigInteger no = new BigInteger(1, messageDigest);

  String hashtext = no.toString(16);

  while (hashtext.length() < 32) {
    hashtext = "0" + hashtext;
  }
  return hashtext;
C++实现

int hash_SHA1(const char* cid, int len, char* digest)
{
    /* Creating Id Digest. */
    int rc = 0, i;
    unsigned char idDgst[21] = { '\0' };
    char buffer[3] = { '\0' };

    rc = SHA1(cid, len, idDgst) == NULL ? -1 : 0;
    for(i = 0; !rc && (i < sizeof(idDgst)-1); i++)
    {
        sprintf(buffer, "%02X", idDgst[i]);
        strncat(digest, buffer, 3);
    }
    return rc == 0;
}

C++代码与我共享,用Java实现。我做错了什么?

Java可以对字符串中的每个字符使用16位。在C++代码中函数被调用的地方,附加的字符被附加到输入字符串中。给出正确的输入会得到完全相同的结果。感谢@Topaco验证代码。

您的SHA1来自哪个库?我无法重现openssl/sha.h的问题,即结果与Java代码的结果相对应。POST也是整个C代码,即HasyShan1调用,包括所有使用的参数。C++使用OpenSSLAS,我说,我不能复制这个问题。在您的计算机上发布导致问题的完整可执行C++代码。这对提供解决方案的其他任何人都不是很有用,很高兴您找到了解决方案,但最好删除问题和答案。请注意,您应该始终以getBytes表示字符编码,即使它只是StandardCharsets.US_ASCII。好吧,除非你的代码确实依赖于默认的平台编码,但这可能占代码的1%。没错,但由于Windows1252或UTF-8Linux,Android被用作默认的8位编码,这不太可能是问题的根源。