为什么我们无法解密 java 中使用 ECB/PKCS1 使用 RSA 加密在 python 中加密的数据
Why we are unable to decrypt the data in java that is encrypted in python using RSA Encryption using ECB/PKCS1
这里是加密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 中使用 OAEP 进行加密,在 Java 中使用 PKCS#1 填充进行解密。这两个是不同的 RSA 加密方案,即使它们都存在于 PKCS#1 v2.1 和 2.2 标准中。您也应该在 Java 中使用 OAEP(默认使用 SHA-1)。它应该存在于 Oracle JRE 中。
当我们修复键和 iv 值时,我们得到了错误,然后我们使用随机函数生成它们。
然后还有一件事,密钥和 iv 是我们不应该传递的两种不同格式。我在 java 中解密数据时遇到错误...
最终通过所需步骤解决了问题....
这里是加密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 中使用 OAEP 进行加密,在 Java 中使用 PKCS#1 填充进行解密。这两个是不同的 RSA 加密方案,即使它们都存在于 PKCS#1 v2.1 和 2.2 标准中。您也应该在 Java 中使用 OAEP(默认使用 SHA-1)。它应该存在于 Oracle JRE 中。
当我们修复键和 iv 值时,我们得到了错误,然后我们使用随机函数生成它们。 然后还有一件事,密钥和 iv 是我们不应该传递的两种不同格式。我在 java 中解密数据时遇到错误... 最终通过所需步骤解决了问题....