如何在Java中执行OpenSSL sign命令

时间:2014-03-18 10:20:36

标签: java openssl rsa digital-signature

我的客户提供了私钥。我需要使用RSA算法签署二进制数据。完全适合我的OpenSSL命令是:

openssl.exe rsautl -in InputData.bin -inkey private.key -out OutputData.bin -sign

如何在Java中实现此类签名?我不需要使用任何散列算法,而我的私钥是768位密钥。

我编写了以下java代码,但创建的签名与OutputData.bin文件不同,并且verify方法返回false。任何人都可以帮我找出问题所在吗?

public static void main(String[] args) throws Exception {

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

//Read the input data
byte[] data = readBytesfromFile("InputData.bin");

//Read the private key file
byte[] privateKeyBytes = readBytesfromFile("private.key");
String strPrivateKey = new String(privateKeyBytes, "UTF-8").replaceAll("(-+BEGIN PRIVATE KEY-+\\r?\\n|-+END PRIVATE KEY-+\\r?\\n?)", "");
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(strPrivateKey));
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

//Read the public key file
byte[] publicKeyBytes = readBytesfromFile("public.key");
String strPublicKey = new String(publicKeyBytes, "UTF-8").replaceAll("(-+BEGIN PUBLIC KEY-+\\r?\\n|-+END PUBLIC KEY-+\\r?\\n?)", "");
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(DatatypeConverter.parseBase64Binary(strPublicKey));
PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);

//Sign the file
Signature sig = Signature.getInstance("NONEwithRSA");
sig.initSign(privateKey);
sig.update(data);
byte[] signatureBytes = sig.sign();

//Verify the signature
sig.initVerify(publicKey);
sig.update(data);
System.out.println(sig.verify(signatureBytes));
}

我有双重检查,公钥与私钥匹配。我从私钥中提取了公钥。

任何帮助都将受到高度赞赏。

谢谢Guy Hudara

0 个答案:

没有答案