Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换为C++;md5编码到android/java_Java_Android_C++_Qt_Md5 - Fatal编程技术网

转换为C++;md5编码到android/java

转换为C++;md5编码到android/java,java,android,c++,qt,md5,Java,Android,C++,Qt,Md5,我想将以下方法转换为java。我不想自己实施它。但我没有得到预期的编码字符串。代码如下: QString CHMacMD5::MD5_encode(QString password) { unsigned char result[16]; memset( result, 0, sizeof(result) ); QString md5key = "some_key"; CHMacMD5 md5; md5.HMac_MD5(password.toUtf8()

我想将以下方法转换为java。我不想自己实施它。但我没有得到预期的编码字符串。代码如下:

QString CHMacMD5::MD5_encode(QString password) {
    unsigned char result[16];
    memset( result, 0, sizeof(result) );
    QString md5key = "some_key";
    CHMacMD5 md5;
    md5.HMac_MD5(password.toUtf8().constData(),password.length(),md5key.toUtf8().constData(),md5key.length(),result);
    QString md5out;
    for( int i = 0; i < 16; ++i ) {
        md5out += QString("%1").arg(result[i], 2, 16, QChar('0'));
    }
    return md5out;
}

原始代码不是计算普通MD5校验和,而是使用变量md5key中的密钥和输入密码的消息身份验证代码

您的代码只计算密码的md5散列,根本不使用密钥

RFC 2104指定密钥和MD5(或其他哈希函数)输入的输入文本的组合,以获取hmac:

这里(第二个答案)似乎是如何在Java中做到这一点:

您只显示了要转换的代码,而不是您所说的工作不正常的java代码。
 private void md5Encode(String password) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return;
    }

    md.update(javaStringToNullTerminatedString(password));

    byte[] digest = md.digest();

    StringBuffer sb = new StringBuffer();
    for (byte b : digest) {
        sb.append(String.format("%02x", b & 0xff));
    }

    System.out.println("original:" + password);
    System.out.println("digested(hex):" + sb.toString());
 }

private byte[] javaStringToNullTerminatedString(String string) {
    CharsetEncoder enc = Charset.forName("ISO-8859-1").newEncoder();

    int len = string.length();
    byte b[] = new byte[len + 1];
    ByteBuffer bbuf = ByteBuffer.wrap(b);
    enc.encode(CharBuffer.wrap(string), bbuf, true);

    b[len] = 0;

    return b;
}