我应该如何正确地将Java加密算法移植到Python?

我应该如何正确地将Java加密算法移植到Python?,java,python,encryption,character-encoding,cryptography,Java,Python,Encryption,Character Encoding,Cryptography,当我使用Java生成的有效负载及其签名发出post请求时,服务器接受该请求 当我使用相同的负载并使用相同的算法生成签名,但现在使用python时,我总是遇到错误的填充异常 我比较了两个程序生成的sha,它们似乎是相同的,所以加密有问题 我尝试了以下几种方法:- i). Encoded the sha with "utf-8", just like its being done in the Java code. The resulting string was the

当我使用Java生成的有效负载及其签名发出post请求时,服务器接受该请求

当我使用相同的负载并使用相同的算法生成签名,但现在使用python时,我总是遇到错误的填充异常

我比较了两个程序生成的sha,它们似乎是相同的,所以加密有问题

我尝试了以下几种方法:-

    i). Encoded the sha with "utf-8", just like its being done in the Java code.  
        The resulting string was the same as the original sha and still got the  
        bad padding.
我觉得我必须将sha转换为某种特定的格式加密,然后将加密的消息更改为某种特定的格式。要模拟这些Java代码行,请执行以下操作:-

byte[] encrypted = cipher.doFinal(sha.getBytes("UTF-8"));
byte[] encoded = Hex.encode(encrypted);
strEncrypted = new String(encoded);
但到目前为止,我还没有成功。请帮忙

这是我的Java代码(请注意,它缺少一些部分,因此无法编译。我们只对makeDigest和encrypt方法感兴趣):-

我尝试使用加密模块将此代码转换为python。
我的Python代码:-

from Crypto.Hash import SHA
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

def get_payload_sha(payload):
    sha = SHA.new(payload).hexdigest()
    return sha

def get_sha_signature(sha):
   key = RSA.importKey(open(some_private_key, "r").read())
   cipher = PKCS1_v1_5.new(key)
   cipher_text = cipher.encrypt(sha)
   signature = cipher_text.encode("hex")
   return signature

payload = "something"
sha = get_payload_sha(payload)
signature = get_sha_signature(sha)
print signature
错误

ERROR   96  25-08-2015  10:46:08 Exception decrypting signature [signature=dfg23fghdf2349a3e87e3] : javax.crypto.BadPaddingException: unknown block type
javax.crypto.BadPaddingException: unknown block type
    at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source)
    at javax.crypto.Cipher.doFinal(DashoA13*..)

您正在尝试使用私钥加密十六进制编码的哈希。此操作称为签名,在内部使用私有指数
d

如果您只是使用pycrypto中的RSA密钥(公共或私有)对某些内容进行加密,那么您总是使用公共指数
e
进行加密()

您需要为此使用签名生成:

from Crypto.Signature import PKCS1_v1_5

cipher = PKCS1_v1_5.new(key)
signature = cipher.sign(sha)
但这可能不起作用,因为用于加密和签名的填充是不同的。因此,即使Java代码确实有效,签名也不太可能是正确的

您可以尝试交换
e
d
作为快速修复:

from Crypto.Cipher import PKCS1_v1_5

temp = key.d
key.d = key.e
key.e = temp

cipher = PKCS1_v1_5.new(key)
signature = cipher.encrypt(sha)

除此之外,没有其他东西对我有用:-
我扔掉了PyCrypto,改用M2Crypto

import M2Crypto
import hashlib
payload = something
digest = hashlib.sha1(payload).hexdigest()

# Read private key.
private_key = M2Crypto.RSA.load_key('path_to_somekey')

# Encrypt digest using private key and encode in Hex (Base16)
signature = private_key.private_encrypt(digest, M2Crypto.RSA.pkcs1_padding).encode("hex")
print signature

你完了

我正在尝试使用私钥加密。为什么我要称这种方法为“公钥”?我似乎已经取得了进展。这些就是1所做的更改。我退回了sha而不是get_sha的sha摘要。。用于修复“oid”问题的函数。2.我用了你的第一段代码。结果:-我收到此错误消息“计算的SHA1(某些数字和字母)摘要与减少的值不匹配(奇怪的字符)!”您能建议如何解决此问题吗??
import M2Crypto
import hashlib
payload = something
digest = hashlib.sha1(payload).hexdigest()

# Read private key.
private_key = M2Crypto.RSA.load_key('path_to_somekey')

# Encrypt digest using private key and encode in Hex (Base16)
signature = private_key.private_encrypt(digest, M2Crypto.RSA.pkcs1_padding).encode("hex")
print signature