gpt4 book ai didi

Java Python 消息签名与验证

转载 作者:行者123 更新时间:2023-12-01 15:18:44 24 4
gpt4 key购买 nike

我的服务器是用 Python 编码的,我正在为此服务器制作一个 java 客户端。

我正在使用以下方式签署消息(数据):

public static byte[] Sign(PrivateKey privateKey, byte[] data) throws Exception{
System.out.println("Signing the key inside RSACrypto#Sign");
Signature dsa = Signature.getInstance("SHA1withRSA");

SecureRandom secureRandom =null;
dsa.initSign(privateKey,secureRandom);
dsa.update(data);
return dsa.sign();
}

这将返回一个 byteArray(namedsigned_data) ,现在我使用 Base64.encodeBase64 对此签名进行编码,并使用以下方法将如此形成的 byteArray(named my_byte_array) 转换为字符串:

String str = new String(my_byte_array)

并将该字符串发送到服务器。

在服务器端,我收到此字符串,然后服务器使用以下方法验证签名:

publicKey.verify(str(data), (long(base64.b64decode(my_byte_array)),))

使用库http://gdata-python-client.googlecode.com/hg/pydocs/gdata.Crypto.PublicKey.RSA.html

当我尝试在两侧打印 my_byte_array 时,它们是相同的,signed_data 和 base64.b64decode(my_byte_array) 也是如此

但我收到此错误:

ValueError: invalid literal for long() with base 10: '\x8b\xa1\xbb\x19fO\xea\xe7\xa4B\xd4\xd2\xa1\xe3\xb9\xd0\x89n\xa2\xfe\xb5\xedsL\x02\xba\xad\x12!qjp\x0c%+Z\t\xa7\x12\x08\x90\xfaTk\xca\xd0\xae\xd8\xa9\xfa\xbb]>9\x1c\x80\xd0

据我所知,出现此错误是因为 Java 将消息签名为字节,而 python 期望它为长整型。

有办法解决这个问题吗?

最佳答案

您实际上有两个问题。

第一个是 - 根据Java Cryptograpy Architecture API - SHA1withRSA 算法涉及 PKCS#1 v1.5 填充。在Python端,必须使用相同的填充方案来验证签名;这可以通过 PyCrypto 的 PKCS#1 v1.5 签名模块 ( Crypto.Signature.PKCS1_v1_5 ) 来实现。

第二个问题就是您指出的问题:RSA PyCrypto 对象的 verify 方法奇怪的是,要求将签名编码为整数。但是,通过使用我上面提到的模块,问题就会消失,因为它接受字节字符串。

关于Java Python 消息签名与验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com