2017-08-17 43 views
0

我进口从Java公钥到Python我使用插座RSA Python的加密邮件从导入的Java公钥

在Java中,我使用RSA/ECB/PKCS1Padding

,并在Python我使用Crypto

在变量server_public_key即时导入了公钥

cipher我使用PKCS1_OAEP加密消息

ciphertext

我加密消息

然后我将其转换为字节组

,然后我把它回Java

但Java将这个错误Exception in thread "main" javax.crypto.BadPaddingException: Decryption error

这里是我的代码

message = "SENDING TO JAVA" 
s= socket.socket() 
    s.connect((address,9000)) 
     data = s.recv(1024) 
     data = data[2:] 
     server_public_key = RSA.importKey(data) 
     cipher = PKCS1_OAEP.new(server_public_key) 
     ciphertext = cipher.encrypt(mensaje) 
     b = bytearray() 
     b.extend(ciphertext) 
     b = bytearray() 
     b.extend(ciphertext) 
     s.sendall(b)  
+0

您应该在Java端使用OAEP填充。尝试在java端使用'RSA/ECB/OAEPWithSHA-1AndMGF1Padding'。 –

+0

我得到一个BadPaddingException:解密错误@JamesKPolk – blazedosan002

+0

请显示您的代码。 –

回答

0

当我移动这是发送密文的莫名其妙的第二个副本,并清理并更正了python代码,它适用于我。这是我使用的Python代码。

import socket 
import struct 

from Crypto.PublicKey import RSA 
from Crypto.Cipher import PKCS1_OAEP 

# 
# the following is an alternative recvall function that can be used 
# if your platform does not provide the MSG_WAITALL socket flag. 
# 
def recvall2(s, size): 
    received_chunks = [] 
    buf_size = 4096 
    remaining = size 
    while remaining > 0: 
     received = s.recv(min(remaining, buf_size)) 
     if not received: 
      raise Exception('unexcepted EOF') 
     received_chunks.append(received) 
     remaining -= len(received) 
    return b''.join(received_chunks) 

def recvall(s, size): 
    return s.recv(size, socket.MSG_WAITALL) 

def oaep_example(): 
    message = b"SENDING TO JAVA" 
    s = socket.socket() 
    s.connect(('127.0.0.1', 9000)) 
    pubkey_size = struct.unpack(">H", recvall(s, 2))[0] 
    pubkey_der = recvall(s, pubkey_size) 
    server_public_key = RSA.importKey(pubkey_der) 
    cipher = PKCS1_OAEP.new(server_public_key) 
    cipher_text = cipher.encrypt(message) 
    s.sendall(cipher_text) 
    s.close() 

if __name__ == '__main__': 
    oaep_example() 

和小Java服务器来证明这是

import com.google.common.io.ByteStreams; 

import javax.crypto.Cipher; 
import java.io.ByteArrayOutputStream; 
import java.io.DataOutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(1024); 
     KeyPair rsaKeyPair = kpg.generateKeyPair(); 
     ServerSocket serverSocket = new ServerSocket(9000); 
     Socket socket = serverSocket.accept(); 
     DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
     byte[] encodedPubKey = rsaKeyPair.getPublic().getEncoded(); 
     dos.writeShort(encodedPubKey.length); 
     dos.write(encodedPubKey); 
     byte[] cipher = ByteStreams.toByteArray(socket.getInputStream()); 
     socket.close(); 
     Cipher c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding"); 
     c.init(Cipher.DECRYPT_MODE, rsaKeyPair.getPrivate()); 
     byte[] plain = c.doFinal(cipher); 
     System.out.println(new String(plain, StandardCharsets.UTF_8)); 
    } 
} 

注:ByteStreams来自谷歌Guava库。