【问题标题】:Why we are unable to decrypt the data in java that is encrypted in python using RSA Encryption using ECB/PKCS1为什么我们无法解密使用 ECB/PKCS1 使用 RSA 加密在 python 中加密的 java 中的数据
【发布时间】:2015-08-14 16:46:21
【问题描述】:

这是在python中加密数据的代码

from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA256
from base64 import b64decode
import base64


mode = AES.MODE_CBC
key_bytes="HTj9bAAAMg9XxK6uLs4JGg==" # random 128 bit key generated 
iv_bytes = "SECRETKEY"
cipher = AES.new(key_bytes, mode, iv_bytes)


def pad(text):
byteNum = len(text)
packingLength = 8 - byteNum % 8
appendage = chr(packingLength) * packingLength
data=text + appendage
return data


plain_text="some text to encrypt"
data = pad(plain_text)
encrypted_bytes = cipher.encrypt(data)
encrypted_string = base64.urlsafe_b64encode(encrypted_bytes)
encrytid = open("encryptid.txt",'w')      #writting encrypted data for ref
encrytid.write(encrypted_string)
encrytid.close()
keys = b64decode('HTj9bAAAMg9XxK6uLs4JGg==')
key = (open('public.pem', 'rb').read())   #reading public.pem data
rsakey = RSA.importKey(key)
rsakey = PKCS1_OAEP.new(rsakey)
encrypted = rsakey.encrypt(keys)
                        #print ("enc: ", encrypted)
encrypt_aes = base64.b64encode(encrypted)

这是用于解密上述输出的java代码:

当我们尝试使用 java 解密数据时,出现以下错误:

错误

javax.crypto.BadPaddingException: Decryption error
 at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)
 at sun.security.rsa.RSAPadding.unpad(Unknown Source)
 at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363)
 at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
 at javax.crypto.Cipher.doFinal(Cipher.java:2121)

有人可以提出解决问题的可能解决方案吗...

【问题讨论】:

  • 随机想法:在你的 python 代码中你说 AES 但 java 异常是 RSA?
  • 您的 java 代码不完整。如果没有完整的代码,我们无法理解您的错误。
  • 对不起,我用 RSA 代码更新代码不好..
  • 这还不完整。 python 代码导入 RSA,但从不使用它。 Java 代码没有 public static void main 函数。
  • 您的代码不完整,但我认为(根据错误文本)您在解密中使用了错误的算法/模式/填充

标签: java python encryption cryptography padding


【解决方案1】:

您在 Python 中使用 OAEP 进行加密,在 Java 中使用 PKCS#1 填充进行解密。这两个是不同的 RSA 加密方案,即使它们都存在于 PKCS#1 v2.1 和 2.2 标准中。您也应该在 Java 中使用 OAEP(默认使用 SHA-1)。它应该存在于 Oracle JRE。

【讨论】:

  • 感谢您的信息,实际上 java 代码是固定的,python 代码是可以更改的,,,请您指导我们如何解决这个问题...提前谢谢...
  • 再次感谢它工作的提示,现在它在其他部分给出错误.... javax.crypto.BadPaddingException: Given final block not proper padding at com.sun.crypto.provider.CipherCore .doFinal(CipherCore.java:966) 在 com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824) 在 com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436) 在 javax。 crypto.Cipher.doFinal(Cipher.java:2121)
  • 目前我无法测试您的代码。为什么不创建一个仅用于 OAEP 的最小测试,在其中打印出加密输出和十六进制解密输入?我看到一个 URL 安全编码器和一个不是;如果输入无效,那么您将遇到此类故障。
  • @ Maarten Bodewes: 加密是使用 PKCS1_v1_5.new 完成的 更新了我的代码.. 现在它可以工作了,但是到 pkcs5 填充它会出现错误,还有一件事也改变了 urlsafe....跨度>
  • @ Maarten Bodewes:谢谢哥们,问题得到了解决,现在我们能够使用 python 加密数据并使用 java 解密数据,没有任何问题......感谢您的每一件事和您的时间。 ...
【解决方案2】:

当我们修复 key 和 iv 值时,我们得到了错误,然后我们使用随机函数生成它们。 然后还有一件事,密钥和iv是我们不应该传递的两种不同格式。我在用java解密数据时遇到错误... 终于通过所需步骤解决了问题....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2020-01-08
    • 1970-01-01
    • 2019-12-01
    相关资源
    最近更新 更多