Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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
Java signature.verify不';t返回预期结果_Java_C++_C - Fatal编程技术网

Java signature.verify不';t返回预期结果

Java signature.verify不';t返回预期结果,java,c++,c,Java,C++,C,我正在尝试将一些C代码移植到JAVA代码,一些安全API需要在C和JAVA中调用,每个参数似乎都是正确的,但我总是得到错误的结果。我真的很沮丧,有人能帮我吗 C代码为: if (1 != RSA_verify(NID_sha1, md, sizeof(md), sig, sigLen, aikRsa)) { fprintf (stderr, "Error, bad RSA signature in quote\n"); exit (2); } aikRsa通过API从P

我正在尝试将一些C代码移植到JAVA代码,一些安全API需要在C和JAVA中调用,每个参数似乎都是正确的,但我总是得到错误的结果。我真的很沮丧,有人能帮我吗

C代码为:

    if (1 != RSA_verify(NID_sha1, md, sizeof(md), sig, sigLen, aikRsa)) {
    fprintf (stderr, "Error, bad RSA signature in quote\n");
    exit (2);
}
aikRsa通过API从PEM文件读取:

if ((aikRsa = PEM_read_RSA_PUBKEY(key_file, NULL, NULL, NULL)) == NULL) {
    fprintf (stderr, "Unable to read RSA file %s\n", av[1]);
    exit (1);
}
RSA_的定义验证:

int RSA_verify(int type, const unsigned char *m, unsigned int m_len,
unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
PEM_read_RSA_PUBKEY的定义:

RSA *PEM_read_RSA_PUBKEY(FILE *fp, RSA **x,
                                    pem_password_cb *cb, void *u);
等效JAVA代码:

        Signature signature;
        signature = Signature.getInstance("SHA1withRSA");
        signature.initVerify(pubkey); 
        signature.update(md);
        if (!signature.verify(sig)) {
            log.error("signature is not correct\n");
        } else {
            log.info("signature is correct\n");
        }
我将这里的“sig”和“md”与上面C代码中的“sig”和“md”的值进行了比较,它们几乎相同,只是在C中表示字节的是无符号字符,但在JAVA中字节总是有符号的

pubkey是通过follow函数获得的,这是我从其他地方获得的示例代码

public  PublicKey getPemPublicKey(String filename) throws Exception {
    File f = new File(filename);
    FileInputStream fis = new FileInputStream(f);
    DataInputStream dis = new DataInputStream(fis);
    byte[] keyBytes = new byte[(int) f.length()];
    dis.readFully(keyBytes);
    dis.close();

    String temp = new String(keyBytes);
    String publicKeyPEM = temp.replace("-----BEGIN PUBLIC KEY-----\n", "");
    publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", "");

    Base64 b64 = new Base64();
    byte [] decoded = b64.decode(publicKeyPEM);

    X509EncodedKeySpec spec =
          new X509EncodedKeySpec(decoded);
    //KeyFactory kf = KeyFactory.getInstance(algorithm);
    KeyFactory kf =  KeyFactory.getInstance("RSA");
    return kf.generatePublic(spec);
    }

C代码总是返回true,JAVA总是返回false,这里出了什么问题?感谢您的任何输入。

sizeof(md)(在您引用的第一个c部分中)返回字符指针的大小,我认为这不是您想要的,它需要md指向的消息中的字节数?@JaCurate:谢谢JaCurate,c代码工作得很好,这个问题只存在于JAVA代码“md”中在C语言中,代码定义为
字节md[20],所以我认为没有任何错误。