使用OpenSSL和Android时的不同RSA签名

使用OpenSSL和Android时的不同RSA签名,android,security,openssl,digital-signature,sha256,Android,Security,Openssl,Digital Signature,Sha256,在看了这么多类似的问题之后,我还没有找到答案 我正在用这两种语言唱一份文件 openssl rsautl-sign…和openssl-dgst-sign… 这两个选项显然提供了不同的输出 我的问题是,当我在android应用程序上签名时,使用: public byte[] signData(byte[] data, PrivateKey privateKey) { Signature signature = null; try { signature = Sign

在看了这么多类似的问题之后,我还没有找到答案

我正在用这两种语言唱一份文件
openssl rsautl-sign…
openssl-dgst-sign…
这两个选项显然提供了不同的输出

我的问题是,当我在android应用程序上签名时,使用:

public byte[] signData(byte[] data, PrivateKey privateKey) {
    Signature signature = null;
    try {
        signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(data);
        return signature.sign();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
此函数返回完全不同的十六进制字符串。 android上的验证方法:

byte[] sigBytes = hexStringToByteArray(signature);    
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(spec);
Signature signCheck = Signature.getInstance("android ");
signCheck.initVerify(publicKey);
signCheck.update(data.getBytes("UTF-8"));
boolean isVerified = signCheck.verify(sigBytes);
仅验证android应用程序生成的十六进制字符串

使用openssl命令(已经尝试使用大多数可用参数),我似乎无法生成相同的十六进制字符串

仅供参考:我使用RSA和SHA256登录android和命令行

从android中,我得到以下十六进制字符串:《代码>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 54D8394050CEAC2EDD92021CDB34038699AAA49B1BFDF6823ADEFA185B036A6DF30955A152D51B64BCAF83AF79B6F7EEE783AC4217D6CE6604AF7E016C53B0D86E70AEDD4178AE039B12ED2731AD45321DEF9E394

从openssl(
openssl dgst-sha256-binary-sign private.pem data.txt | hextump
),我得到:(代码>代码>代码>8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 C62221847D2893716A712292B701A5C65901D05635655D9D31253C1F53E7B1741A460A0F7DEDCEF4CA4039AA5385B49BE486A6380488FB5A0DEEF8BDD0F70874866EF6FC6BD71271F1AE30112F8BD0


请帮助,干杯。

我有不同的输出签名字符串,带有命令“openssl pkeyutl-sign…”和java代码:

Signature sig = Signature.getInstance("SHA256withRSA");
更改此指纹后,我最终得到了相同的输出:

Signature sig = Signature.getInstance("NONEwithRSA");

签名可能重复,且签名大小不足以容纳RSA块大小,因此对其进行了填充。一些填充算法使用随机数据,因此不同的结果并不一定意味着有问题。如果不是相同的十六进制值,我如何在android端验证它?我尝试在数据两端签名“asdasd”,但仍然为相同的输入提供不同的字符串+