我正在尝试将一些 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_verify 的定义:
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”的值进行了比较,它们几乎相同,除了它是 unsigned char 来表示 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,这是怎么回事?感谢任何输入。