M2Crypto和java.security文件返回不同的签名消息

2024-05-15 10:27:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在为一个项目将一些Java代码移植到Python上时遇到了困难。你知道吗

以下Java代码用于对发布到服务器进行验证的伪随机nonce进行签名:

private static final String NONCE_SIGNATURE_ALGORITHM = "SHA512withRSA";

@JsonProperty
private String encodedData;

@JsonProperty
private String encodedSignedData;

@SuppressWarnings("unused")
private cacertnonceverification() {
}

public cacertnonceverification(byte[] decodedData, PrivateKey privateKey)
        throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    byte[] decodedSignedData = sign(privateKey, decodedData);
    encodedData = Base64.getEncoder().encodeToString(decodedData);
    encodedSignedData = Base64.getEncoder().encodeToString(decodedSignedData);
}

@Override
public String toString() {
    final StringBuilder sb = new StringBuilder("CACertNonceVerificationData{");
    sb.append("encodedData='").append(encodedData).append('\'');
    sb.append(", encodedSignedData='").append(encodedSignedData).append('\'');
    sb.append('}');
    return sb.toString();
}

private byte[] sign(PrivateKey privateKey, byte[] dataBytes)
        throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    Signature sig = Signature.getInstance(NONCE_SIGNATURE_ALGORITHM);

    sig.initSign(privateKey);
    sig.update(dataBytes);

    return sig.sign();
}

这是按预期工作的,但是下面的Python代码为同一个由同一个私钥签名的nonce返回不同的值。我已经用PyCrypto和M2Crypto进行了测试,它们在对nonce签名时返回相同的值,但是它们与Java返回值不同。你知道吗

def sign_nonce(nonce, privKey):

   key=EVP.load_key(privKey)
   key.reset_context(md='sha512')
   key.sign_init()
   key.sign_update(nonce.encode('utf-8'))

   return binascii.b2a_hex(key.sign_final()).decode("utf-8")

def sign_string(message, privKey):

   f = open(privKey, 'r')
   keyString = f.read()
   keyString = keyString.encode('utf-8')
   key = rsa.PrivateKey.load_pkcs1(keyString)

   return binascii.b2a_hex(rsa.sign(message.encode(), key, 'SHA-512')).decode('utf-8')

知道是什么导致了这种差异吗,我遗漏了什么?你知道吗

谢谢!你知道吗


编辑: 我的Python脚本确实验证了带符号的nonce是有效的,并且我对Python和Java代码使用相同的公钥和私钥,但是显然对带符号的值得到了不同的结果。这意味着java.security文件而M2Crypto/RSA是不同的,但我可能有点离谱-我对加密还不熟悉。你知道吗


编辑2: 我试过用M2加密.RSA对nonce进行签名,得到的响应仍然不同,但是修改了代码,现在M2Crypto-EVP和RSA,RSA输出的是相同的签名值。要让它们与Java的预期值匹配仍然很不走运:

Expected value: 6d90537599b912ac0de9f68dc0d104a04c5aa74e35262f73872bb01ed1e2cc37100ff1a00735da307fa325f3e30f3c81157755fc60c7ee69bd91bf44b6a5f5e4161bdd67cf982550d992a0a16d12ed5ea30b878a8b2f8eee61cf64e083d7b74a635dabba44bf0b51b9b305aa901b3d090712ee3994057b076d53366a3a387de0f7b2e220cf11239facfce0df6d9a54dfb365f7d3996ea20b55ec75e3661cf95392eda75696cfc6bebda304a2671428dad38a43d5a579550595fe9180539b2b7eb3d568a1f8ce05ded2ae3241a732fffd1404f989eea3e68dda6cd13bfcd6b2e47e64685763a6c3c0f1c47f84c908e22e718254b9f46a7a1de7e2280ccb59c1c5

M2Crypto RSA: 2c973dd7006c058293787504203e36e921ae286f44bcdbf2bd4b48c8a7d9a73723c058d1bcd15b76f6a7145d55cf6109f4bbe5f3953d953177117ef4733e4d3ac22e8a4d320ae6c3a626ddce2a3d5db6b0f10656dd49179c3d60ba912bf21b2e2eac5def74aa6809b74d7711cbb86d719b1fe4df5b7215067af34de3e03859e2c919587bc7f00ec96c6b678c5fc8e114cebae3f5d301811dacc247cd2df9dadf62bccd524147f582f77f0ce29077c7352c8b9893056dce3d65de44d0fc45b88363db9df59c142a01d8f32bf48f05183757e3cd0954c528a7601f4edb56ed9175b219e08aa79514694aedff45bbb365e7d54e534973f6a2aa9f22da12890bbbb5

M2Crypto EVP: 2c973dd7006c058293787504203e36e921ae286f44bcdbf2bd4b48c8a7d9a73723c058d1bcd15b76f6a7145d55cf6109f4bbe5f3953d953177117ef4733e4d3ac22e8a4d320ae6c3a626ddce2a3d5db6b0f10656dd49179c3d60ba912bf21b2e2eac5def74aa6809b74d7711cbb86d719b1fe4df5b7215067af34de3e03859e2c919587bc7f00ec96c6b678c5fc8e114cebae3f5d301811dacc247cd2df9dadf62bccd524147f582f77f0ce29077c7352c8b9893056dce3d65de44d0fc45b88363db9df59c142a01d8f32bf48f05183757e3cd0954c528a7601f4edb56ed9175b219e08aa79514694aedff45bbb365e7d54e534973f6a2aa9f22da12890bbbb5

rsa: 2c973dd7006c058293787504203e36e921ae286f44bcdbf2bd4b48c8a7d9a73723c058d1bcd15b76f6a7145d55cf6109f4bbe5f3953d953177117ef4733e4d3ac22e8a4d320ae6c3a626ddce2a3d5db6b0f10656dd49179c3d60ba912bf21b2e2eac5def74aa6809b74d7711cbb86d719b1fe4df5b7215067af34de3e03859e2c919587bc7f00ec96c6b678c5fc8e114cebae3f5d301811dacc247cd2df9dadf62bccd524147f582f77f0ce29077c7352c8b9893056dce3d65de44d0fc45b88363db9df59c142a01d8f32bf48f05183757e3cd0954c528a7601f4edb56ed9175b219e08aa79514694aedff45bbb365e7d54e534973f6a2aa9f22da12890bbbb5


Tags: key代码stringjavabyteprivatersanonce
1条回答
网友
1楼 · 发布于 2024-05-15 10:27:43

我能够通过同时使用EVP和RSA模块对我的nonce进行签名来解决这个问题:

key = RSA.load_key(privKey)
md = EVP.MessageDigest('sha512')
md.update(message)
digest=md.final()
signature = key.sign(digest, "sha512")

return b64encode(signature).decode('utf-8') 

相关问题 更多 >